注入依赖对象可以采用 手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。
一、依赖注入——手工装配
手工装配依赖对象,在这种方式中又有两种编程方式
1.在xml配置文件中,通过在bean节点下配置,如
<bean id="orderService" class="com.reiyenKart.service.OrderServiceBean"
<constructor-arg index="0" type="java.lang.String" value="xxx" /> //构造器注入
<property name="name" value="xxlong" /> //属性setter方法进入
</bean>
2.在java代码中使用@Autowire或@Resource等注解方式进行装配.注解方式的注入主要针对对象属性的注入。使用注解功能要引用注解包(注:@Resource注解在spring安装目录的lib\j2ee\common-annotations.jar),另beans.xml的配置模板如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config /><!-- 开启注解功能,这个配置隐式注册了多个对注释进行解析的处理器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor
-->
----其中红色部分必须在命名空间中增加
优点:使用注解方式注入依赖对象可以防止spring的配置文件过于臃肿,同时可以有效的省去一些属性的setter方法,使代码变得更简洁。
在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是: @Autowired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。@Resource它是j2ee的注解,在jdk1.6中已包含它了;@Autowired,它属于spring特有的注解;所有推荐大家使用@Resource这个注解,如果使用@Autowired注解的话,会和Spring耦合在一起,为了降低程序间的耦合性@Resource更有优势。
2.1 Resource注解实例
public class UserServiceBean {
@Resource(name = "userDaoImpl")
private UserDao userDao;
private UserDao userDao2;
@Resource
public void setUserDao2(UserDao userDao2) {
this.userDao2 = userDao2;
}
public void test() {
userDao.save();
userDao2.save();
}
}
然后在bean.xml中的配置如下:
<bean id="userDaoImpl" class="com.reiyen.dao.impl.UserDaoImpl" /> <bean id="userServiceBean" class="com.reiyen.service.UserServiceBean" />
简要说明:@Resouce注解可以在字段上标记,也可以在对应的setter方法上标记。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。此注解可以不使用name属性,它会自动去查找匹配的类型(先以字段名称为name的值查找,如找不到会再根据依赖对象的类型查找)。
注意: 如果没有指定name属性,并且按默认的名称仍然找不到依赖对象,@Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了,就应确保name的值在xml中有相应的bean Id对应。
2.2 Autowired注解实例
@Autowired
Private UserDao userDao ;//用于字段上
@Autowired
public void set UserDao( UserDao userDao ){ //用于属性的setter方法上
this.userDao = userDao ;
}
@Autowired 注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false.如下:
@Autowired(required=false)
private UserDao userDao;
如果我们想使用按名称装配, 可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier("userDaoImplXXX")
private UserDao userDao;
说明:@Autowired默认是按照类型来查找对应的bean实例注入,如果想注入指定名称的bean实例,可以使用@Qualifier注解来指定名字。Required属性设为true时,如果不能成功注入则会报告异常,如果设为false而不能成功注入,则会将userDao设为null。同样地,它也实用于setter方法。
二、依赖注入——自动装配依赖对象
自动装配(了解,不建议使用):除了要设置字段的setter方法外,还应在beans.xml配置文件中设置如下内容:
<bean id="userServiceBean2"
class="com.reiyen.service.UserServiceBean2" autowire="byType"/>
<bean id=”” class=”” autowire=”byType” />
除了byType外,autowire的可选属性如下:
byType: 按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的bean。如果发现多个,那么将抛出异常。如果没有找到,即属性值为null.
byName: 按名称装配,可以根据属性的名称,在容器中寻找跟该属性名相同的bean,如果没有找到,即属性值为null.
Constructor与byType的方式类似, 不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
Autodetect: 通过bean类的自省机制(introspction)来决定是使用constructor还是byType方式来进行自动装配。如果发现默认的构造器,那么将使用byType方式。