Spring自动装配

来源:互联网 发布:m1005找不到扫描软件 编辑:程序博客网 时间:2024/06/05 18:30

Spring的 xml配置文件中,通过将一个bean注入装配到另一个bean来实现类的耦合。


如果不使用自动装配,则方法为

< bean name="" ref="" />

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">    <bean id="userDAO" class="com.vin.dao.impl.UserDAOImpl">    <property name="id" value="1" />    </bean>    <bean id="userService" class="com.vin.service.UserService" scope="prototype" >        <property name="userDAO" ref="userDAO" />    </bean></span></span></span>

如上例,将userDAO的bean注入到了userService的bean,通过ref属性指定,ref的值必须与被注入的bean的id相同。


如果使用autowire,有两种方式:

1. xml配置文件中,在<bean>标签中加入autowire属性,值为“byType”或“byName”,此时无需ref注入。

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><bean id="userDAO" class="com.vin.dao.impl.UserDAOImpl">    <property name="id" value="1" />    </bean>    <bean id="userService" class="com.vin.service.UserService" scope="prototype" autowire="byName">    </bean></span></span></span>

如上例,系统按名称扫描属性userDAO,如果扫描到userDAO,则自动装配它对应的类。如果是“byType”,则按类型扫描。


2. Annotation

2.1 Autowire按类型对应注入

在bean标签对应的类文件中,在被注入的属性的setter方法上写上注解@Autowired,则系统将从spring容器中自动扫描与setter函数的参数对应类型的bean。

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-size:18px;">@Autowiredpublic void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}</span></span>

如上例,系统从spring容器中自动扫描类型为UserDAO类型的bean,注入UserService的userDAO属性的setter方法中,因此完成了自动装配。

2.2 Qualifier指定name

上面提到,autowire自动装配注入是按类型来对应bean和setter函数的参数的。

纳闷问题来了,如果有两个bean,他们是同样的类型,那么他们与setter函数的参数就无法对应,系统报错。

此时应使用@Qualifier(name)来指定名称(即bean的id)来指定装配哪一个bean。

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="white-space:pre"></span>@Autowiredpublic void setUserDAO(@Qualifier("userDAO2")  UserDAO userDAO) {this.userDAO = userDAO;}</span>


3. Resource

也可以不使用spring包的autowire,而使用javaEE的resource,同样是加在setter方法上。默认为匹配名称。

@Resource(name="userDAO2")public void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}





0 0
原创粉丝点击