Spring之自动装配

来源:互联网 发布:hex editor怎么修改mac 编辑:程序博客网 时间:2024/05/22 08:08

spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置、)。IOC容器会自动建立javabean之间的关联关系。

spring Bean自动装配

1.byName–把与Bean的属性具体相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的名字匹配的Bean,则该属性不进行装配

2.byType–把与Bean的属性具体相同类型的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的名字匹配的Bean,则该属性不进行装配。

3.constructor-把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器的对应入参中。

4.autodetect–首先尝试使用constructor进行自动装配,如果失败就再尝试使用byType进行自动装配

5:no – 缺省情况下,自动配置是通过“ref”属性手动设定

如果没有采用自动装配的话,手动装配我们通常在配置文件中进行实现:一下代码就是手动装配:

  <bean id="customerDAO" class="com.hebeu.customer.dao.JdbcCustomerDAO">     <property name="dataSource" ref="dataSource" />   </bean> 

通过向customerDAO的bean中注入了dataSource
常用的三种装配方式

第一种自动装配【根据属性名称自动装配】

<bean id="customer" class="com.hebeu.model.Customer" autowire="byName"></bean>  <bean id="address" class="com.hebeu.model.Address">     <property name="fulladdress" value="YiLong Road, CA 188"></property>   </bean> 

这样就将address注入到Customer中。这就是自动注入ByName.在Customer bean中公开了一个属性address,Spring容器会找到address bean,并且装配。这里必须要注意,Customer中要被注入的bean的set方法要求必须是public的,否则会报空指针异常。还有配置的bean的id必须和Customer中声明的变量名相同。
第二种自动装配【根据数据类型自动装配】
声明的俩个bean同样为Customer以及Address,将applicationContext.xml转换为这样的就是实现根据数据类型进行自动装配。

<bean id="customer" class="com.hebeu.model.Customer" autowire="byType"></bean>   <bean id="bean1" class="com.hebeu.model.Address">     <property name="fulladdress" value="YiLong Road, CA 188"></property>   </bean> 

类型自动装配的意思是如果一个bean的数据类型与其他的bean属性的数据类型相同,将会自动兼容装配它。当然要求只能配置一个某一个类型的bean.如果配置成这样,那么是会出错的。

<bean id="customer" class="com.hebeu.model.Customer" autowire="byType"></bean>    <bean id="bean1" class="com.hebeu.model.Address">      <property name="fulladdress" value="YiLong Road, CA 188"></property>    </bean>    <bean id="bean2" class="com.hebeu.model.Address">      <property name="fulladdress" value="YiLong Road, CA 188"></property>    </bean>  

第三种自动装配【根据构造方法自动装配】
案例同上,将applicationContext.xml转换为如下,就实现了按照构造方法自动装配:

<bean id="customer" class="com.hebeu.model.Customer">      <!-- 构造方法的参数 -->     <constructor-arg>        <ref bean="bean1"/>      </constructor-arg>    </bean>    <bean id="bean1" class="com.hebeu.model.Address">      <property name="fulladdress" value="YiLong Road, CA 188"></property>    </bean>  

它实际上是构造函数的参数类型自动装配。这意味着如果一个bean的数据类型与其他bean的构造器参数的数据类型是相同的,那么就自动装配。

如果配置文件存在多个的情况下,加载配置文件的方式:
1)可以指定总的配置文件去包含子的配置文件,然后只加载总的配置文件即可在总的配置文件applicationContext.xml中使用import标签进行子文件包<import resource="applicationContext-test.xml"/>
代码中加载配置文件:

ApplicationContext ac= new ClassPathXmlApplicationContext(“applicationContext.xml”);

2)使用星号来匹配多个文件进行加载,文件名称要符合规律。 (推荐使用)

ApplicationContext ac =new ClassPathXmlApplicationContext(“applicationContext*.xml”);

3)可以使用数组作为参数,一次性加载多个配置文件

String[]files={“applicationContext.xml”,”applicationContext-test.xml”};
ApplicationContext ac = new ClassPathXmlApplicationContext(files);

注意:自动装配功能和手动装配要是同时使用,那么自动装配就不起作用。

Spring2.5开始支持注解自动装配 在xml文件中配置 <context:annotation-config/> 开启对代码注解的扫描,

<@Autowired 注解>
@Autowired 默认是按照byType进行注入的,但是当byType方式找到了多个符合的bean,则又按照byName方式比对,如果还有多个,则报出异常。

比如下面的例子:
@Autowired
private UserRepository userRepository

UserRepository 注入的过程:

  1. spring会先匹配类型为UserRepository 的Bean
  2. 如果存在且唯一,则直接返回userRepository对象;
  3. 如果不唯一,则又在结果集里寻找name为UserRepository 的Bean,当找不到一个匹配的 Bean 时,Spring容器将抛BeanCreationException 异常。

<@Resource注解>
@Resource默认按byName装配,当找不到与名称匹配的bean才会按byType装配

Spring的其他常用注解

@Component-通用的构造型注解,标识该类为Spring的组件,需要搭配 component-scan 使用
@Controller-标识该类为前端控制层
@Service-标识该类为业务层
@Repository-标识该类为数据访问层

参考博客:
http://blog.csdn.net/lishuangzhe7047/article/details/20742427
http://www.jb51.net/article/106856.htm