spring依赖对象的自动装配

一、spring中依赖对象的自动装配五种类型

spring依赖对象的自动装配

通过<bean>中的autowire属性指定

如:<bean id="UserDao" class="com.zhidisoft.dao.UserDao" autowire="byType" />


二、可以用byName解决byType注入失败的问题

如果Spring IoC容器中有多个同种类型的Bean实例,那么注入失败。不过可以有三种方法解决,

autowire-candidate=“false”,将bean排除在自动注入的候选列表之外

primary=“true”,指定bean在自动注入时有优先注入权,如

<bean id="deptDao3" class="com.zhidisoft.dao.DeptDao" autowire-candidate="false"/>
<bean id="deptDao1" class="com.zhidisoft.dao.DeptDao" primary="true"/>
<bean id="deptDao2" class="com.zhidisoft.dao.DeptDao" /> 
<bean class="com.zhidisoft.service.DeptService" autowire="byType"/> 

使用byName方式自动注入,如,

<bean id="deptDao3" class="com.zhidisoft.dao.DeptDao" />
<bean id="deptDao1" class="com.zhidisoft.dao.DeptDao" />
<bean id="deptDao2" class="com.zhidisoft.dao.DeptDao" /> 
<bean class="com.zhidisoft.service.DeptService" autowire="byName"/>

byType,byName自动注入是通过属性的setter方法进行的

private DeptDao deptDao2;

public void setDeptDao2(DeptDao deptDao2){
this.deptDao2=deptDao2;
}

这样<bean id="deptDao2" class="com.zhidisoft.dao.DeptDao" />将会被注入


三、spring注解引入

首先引入注解命名空间,红色部分

spring依赖对象的自动装配

还要在配置文件中加入<context:annotation-config/>元素


四、注解小述

使用 @Autowired 注解进行依赖对象自动装配,只能是根据类型进行匹配。@Autowired 注解可以用于 setter 方法、构造函数、字段,也可以应用到方法上(但是方法必须至少

有一个参数需要依赖对象的注入)

spring依赖对象的自动装配


使用@Autowired会根据类型自动的装配Bean,但是当xml中出现了多个相同类型的Bean时,该如何装配呢?
方法一:使用@Qualifier指定要装配的Bean的id。
方法二:在<bean >中指定primary属性,以指定同类型的某个bean为首先的装配对象。
方法三:在受管Bean上加入@Primary注解,指定其为优先被装配对象。

spring依赖对象的自动装配


如果xml中不存在@Autowired需要装配的类型Bean,那么同样也会报出异常,可以暂时的采用@Autowired(required=false)

spring依赖对象的自动装配

这样在装配时Spring会自动的忽略对该依赖对象的装配



五、扩充

@Resource
Spring 可以使用 JSR-250规范中的注入方式@Resource。
推荐使用它来代替Spring专有的@Autowired注解
@Resource的作用相当于@Autowired,两者不同之处在于@Autowired按byType自动注入,@Resource默认按byName自动注入。
@Inject
Spring 可以使用 JSR-330规范中的注入注解@Inject
该注解需要需要javax.inject包的支持。


六、生命周期回调方法

在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行
在方法上加上注解@PreDestroy,方法将在类销毁之前调用。


七、用注解方式定义受管bean

Spring2.5后也可以通过以**解方式将指定的JavaBean纳入Spring的IoC容器管理范围中
@Component  通用注解,可应用于任何受管Bean上
@Repository 应用于数据访问层受管Bean
@Service  应用于业务逻辑层受管Bean
@Controller  应用于控制器层受管Bean


注:以上四个注解虽然在功能上没有区别,但是建议在不同层次使用相应的注解,此外可以在受管bean上加上@Scope注解用来定义受管bean的作用域,如singleton

另:在使用注解是需要在spring xml文件中需要配置<context :component-scan base-package="xxx"/>,在spring启动时扫描包,将注解的bean纳入IOC容器中。