1、@Bean注解是BeanFactory 的后处理器的Buff 2、@AutoWire、@Resource是Bean的后处理器,bean 的后处理器是针对Bean的生命周期的扩展 3、beanFactory默认情况下读到@bean、@autowired 是不会创建对象的,而只是保留一个名字,getBean()时才会创建对象。可以使用beanfactory.preInstantiateSignletons()来初始化单例对象 4、不会主动解析 ${} 和 #{}
1、最重要的实现:DefaultListBeanFactory 要创建bean,首先要定义Bean,(class、scope(单例、多例)、初始化、销毁等信息) 2、首先使用BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition()创建一个单例的Config beanDefinition 。在使用Beanfactory 创建一个指定名字和Beanfinition 的类。注意:BeanFactory默认情况下不会读取注解,即不会创建Config 里面的@Bean声明的对象 3、解决BeanFactory 不能做到的事: AnnotationConfigUtils.registerAnnotationConfigProfessor 添加后处理器
源码:
public class TestConfig { public static void main(String[] args) { //创建工厂,之前说过这个类可以创建众多类型的 Bean 如何实现: DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); //创建类的定义 AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyConfig.class).setScope("singleton").getBeanDefinition(); //把类的定义交给工厂创建一个 bean :config beanFactory.registerBeanDefinition("config",beanDefinition); //遍历:在这里还没有给 beanFactory 加Buff 它只能创建config 而不能创建 bean1 和 bean2 System.out.println("解析之前=================================="); for (int i = 0; i < beanFactory.getBeanDefinitionNames().length; i++) { System.out.println(beanFactory.getBeanDefinitionNames()[i]); } //给 beanFactory 加一些后处理器 AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory); //使这些处理器生效,根据type 获取后处理器 依次执行 beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream().forEach((pro->{ pro.postProcessBeanFactory(beanFactory); })); System.out.println("解析之后=================================="); for (int i = 0; i < beanFactory.getBeanDefinitionNames().length; i++) { System.out.println(beanFactory.getBeanDefinitionNames()[i]); } //添加Bean的后处理器,使 @autowired 、@resource 生效 beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor); //调用 getBean()之前 beanFactory.preInstantiateSingletons(); System.out.println("调用 getBean()之前>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); System.out.println(beanFactory.getBean(Bean1.class).getBean2()); } @Configuration static class MyConfig{ @Bean public Bean1 bean1(){ return new Bean1(); } @Bean public Bean2 bean2(){ return new Bean2(); } } static class Bean1{ private Logger logger = LoggerFactory.getLogger(Bean1.class); public Bean1(){ logger.debug("bean1 create ---"); } @Autowired private Bean2 bean2; public Bean2 getBean2(){return bean2;}; } static class Bean2{ private Logger logger = LoggerFactory.getLogger(Bean2.class); public Bean2(){ logger.debug("bean2 create ---"); } } }
结果:
1、添加BeanFactoryPostProcessor
2、添加BeanPostProcessor
3、添加preInstantiateSignletons()