欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring之自动装配

程序员文章站 2022-05-24 14:56:50
...

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

相关标签: ioc spring