SpringXML自动装配与注解配置实现自动装配

什么叫自动装配:

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已经成功被注入进来,大功告成

你可能感兴趣的:(SpringXML自动装配与注解配置实现自动装配)