BeanFactory与ApplicationContext的实现
作者:互联网
本文为学习笔记
BeanFactory和ApplicationContext 的实现
1、@Bean注解是BeanFactory 的后处理器的Buff
2、@AutoWire、@Resource是Bean的后处理器,bean 的后处理器是针对Bean的生命周期的扩展
3、beanFactory默认情况下读到@bean、@autowired 是不会创建对象的,而只是保留一个名字,getBean()时才会创建对象。可以使用beanfactory.preInstantiateSignletons()来初始化单例对象
4、不会主动解析 ${} 和 #{}
1、BeanFactory 的实现
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()
标签:ApplicationContext,beanFactory,实现,BeanFactory,public,Bean,Bean2,class,处理器 来源: https://www.cnblogs.com/AN-KATG/p/16079982.html