自动装配Bean

Spring提供了几种技巧,可以减少XML的配置数量:

  • 自动装配(autowiring):可以减少<property>(setter注入)<constructor-arg>(构造器注入)元素,让Spring自动识别如何装配Bean的依赖关系;
  • 自动检测(autodiscovery):Spring能够自动识别哪些类需要被装配成Spring Bean,从而减少对<bean>的使用

4种自动装配

  1. byName:——根据Property的Name自动装配,如果一个bean的name,和另一个bean中的Property的name相同,则自动装配这个bean到Property中。
  2. byType:——根据Property的数据类型(Type)自动装配,如果一个bean的数据类型,兼容另一个bean中Property的数据类型,则自动装配。
  3. constructor:——根据构造函数参数的数据类型,进行byType模式的自动装配。
  4. autodetect: ——先尝试使用constructor,失败后再使用byType。

1.1、byName:

(1)Car.java

public class Car {  
    public void start(){  
        System.out.println("starting car...");  
    }  
}

(2)User.java——此处是setter注入

public class User {  
    private Car car;  
      
    public void setCar(Car car) {  
        this.car = car;  
    }  
  
    public void startCar(){  
        car.start();  
    }  
}  

(3)xml配置文件:

原来是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"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans   
           http://www.springframework.org/schema/beans/spring-beans.xsd">  
             
       <bean id="car" class="com.zzj.bean.Car"></bean>  
       <bean id="user" class="com.zzj.bean.User" >
            <property name="car" ref="car" />
       </bean>  
</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"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans   
           http://www.springframework.org/schema/beans/spring-beans.xsd">  
             
       <bean id="car" class="com.zzj.bean.Car"></bean>  
       <bean id="user" class="com.zzj.bean.User" autowire="byName"></bean>  
</beans> 

(4)测试

public static void main(String[] args) {  
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
        User user = (User) context.getBean("user");  
        user.startCar();  
    } 

1.2、@Autowired注解实现自动装配(byType)

修改User.java文件和XML配置文件就行了。


(1)User.java

import org.springframework.beans.factory.annotation.Autowired;  
  
public class User {  
    @Autowired  
    private Car car;  
  
    public void startCar(){  
        car.start();  
    }  
}

注:此时setter方法可以省掉

(2)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.xsd  
           http://www.springframework.org/schema/context   
         http://www.springframework.org/schema/context/spring-context.xsd">  
             
       <bean id="car" class="com.zzj.bean.Car"></bean>  
       <bean id="user" class="com.zzj.bean.User"></bean>  
       <context:annotation-config/>  //开启自动注解
</beans>

注:@Autowired(byType)是spring自带的注解,也可以使用Java原生的注解:@Resource(byName)。推荐使用@Resource,更具移植性

由于@Autowired是byType类型,可能会匹配多个Bean,那么哪个才是需要的呢

这时配合限定器@Qualifier("具体Bean的名字")就可以指定匹配的Bean了

@Autowired和@Resource区别:

http://bbs.csdn.net/topics/390175654

原文地址:https://www.cnblogs.com/Donnnnnn/p/6203427.html