当我们在开发中需要用一个类调用一个成员对象,成员对象也是被容器类托管的类对象时,那我们可以用依赖注入创建成员对象,spring就可以完成这件事,那spring怎么注入对象?下面来我们就来给大家讲解一下。
1.set注入:
这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(这是ioc的注入入口):
package com.bless.springdemo.action; public class SpringAction { //注入对象springDao private SpringDao springDao; //一定要写被注入对象的set方法 public void setSpringDao(SpringDao springDao) { this.springDao = springDao; } public void ok() { springDao.ok(); } }
随后编写spring的xml文件,
<!--配置bean,配置后该类由spring管理--> <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> <!--(1)依赖注入,配置当前类中相应的属性--> <property name="springDao" ref="springDao"></property> </bean> < bean name = "springDao" class = "com.bless.springdemo.dao.impl.SpringDaoImpl" > </bean>
这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了两个成员变量SpringDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在SpringAction的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和User两个参数值传进来:
public class SpringAction { //注入对象springDao private SpringDao springDao; private User user; public SpringAction(SpringDao springDao, User user) { this.springDao = springDao; this.user = user; System.out.println("构造方法调用springDao和user"); } public void save() { user.setName("卡卡"); springDao.save(user); } }
在XML文件中同样不用
<!--配置bean,配置后该类由spring管理--> <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> <!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置--> <constructor-arg ref="springDao"></constructor-arg> <constructor-arg ref="user"></constructor-arg> </bean> < bean name = "springDao" class = "com.bless.springdemo.dao.impl.SpringDaoImpl" > </bean> < bean name = "user" class = "com.bless.springdemo.vo.User" > </bean>
解决构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理:
下面是设置index,就是参数位置:
<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> <constructor-arg index="0" ref="springDao"></constructor-arg> <constructor-arg index="1" ref="user"></constructor-arg> </bean>
另一种是设置参数类型:
<constructor-arg type="java.lang.String" ref=""/>
推荐阅读: