什么叫自动装配:
Spring提供了XMl配置装配我们的bean属性,但是有时候装配太过繁琐,为了简化装配XML配置的节点提供了autowire 属性配置自动装配,只需要告诉Spring容器你的装配方式,他可以完成属性自动注入。
Spring提供的自动装配的方式:
1丶no - 不自动装配
2丶byName - 根据名称进行装配
3丶byType - 根据类型进行装配,找到两个一样的Type会报错
4丶constructor - 根据构造函数进行装配
测试我就不测试了,今天我们来尝试使用注解配置Bean下开启自动装配。
首先介绍一下注解方式开启装配用到的工具:BeanFactoryPostProcessor
Spring给我们提供了一个供开发人员扩展Spring的接口---->BeanFactoryPostProcessor
工程中,我们配置的Bean,他有相应的属性,这些属性被扫描后会有一个BeanDefition对象来描述这个bean定义,Spring也是通过这个BeanDefinition图纸来实例化我们的bean。而我们就可以通过BeanFactoryPostProcessor这个接口来完成对BeanDefinition里bean描述的修改。
自动装配模型也属于beanDefition中的一个bean描述信息,如下所示:
public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor implements BeanDefinition, Cloneable {
public static final int AUTOWIRE_NO = 0;
public static final int AUTOWIRE_BY_NAME = 1;
public static final int AUTOWIRE_BY_TYPE = 2;
public static final int AUTOWIRE_CONSTRUCTOR = 3;
XXXX
XXXX
}
实验开始:
ClassA:
@Component
public class A {
B b;
public A() {
System.out.println("A构造");
}
public void getB(){
System.out.println(b);
}
public void setB(B b) {
this.b = b;
}
}
BeanFactoryPostProcessor:
public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
GenericBeanDefinition beanDefinition = (GenericBeanDefinition) configurableListableBeanFactory.getBeanDefinition("a");
System.out.println(beanDefinition.getAutowireMode());
// beanDefinition.setAutowireMode(2);
}
}
把 beanDefinition.setAutowireMode(2);注释掉之后,容器初始化打印:
第一个为默认自动装配模型为0,第三个为打印的注入A中的B属性对象为null
0
A构造
null
这个时候我们把把 beanDefinition.setAutowireMode(2);注释去掉,重启容器
启动类:
``
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
annotationConfigApplicationContext.getBean(A.class).getB();
}
打印如下
``
0
A构造
com.gjs.test.B@2c34f934
B已经成功被注入进来,大功告成