springbean的加载过程及应用场景分析
作者:易秋之
加载过程
1.加载配置文件
spring在启动的时候会先创建BeanFactory的示例,BeanFactory是一个接口具体实现主要使用的是:ApplicationContext。它会读取XML的bean配置或者使用注解配置的类,将这个bean配置为BeanDefinition对象
2.实例化bean
解析完成bean的定义后,会调用createBeanInstance() 方法创建bean的实例,相当于操作符 new
3.设置bean的属性
在populateBean()方法中,Spring会使用AurowiredAnnotationBeanPostPrecessor等后置处理器,进行依赖注入,将bean的属性设置到Bean的实例中。
4.调用初始化方法
这里会调用initializeBean()方法初始化。如果Bean实现了InitializingBean接口或配置了init-method,则会在这一步调用初始化方法。
5.注册bean
完成初始化后,Spring会将Bean注册到BeanFactory的容器中,以便后续能够根据Bean的名称或类型获取到Bean实例。
6.bean的后置处理器
在Bean创建过程中,Spring会应用注册的BeanPostProcessor,如CommonAnnotationBeanPostProcessor等,来对Bean进行增强处理,例如AOP代理、事件发布等。
7.完成bean的创建
Bean已经被实例化、属性注入、初始化,并且注册到容器中,可以被其他Bean或应用程序使用。
实际使用
实现了InstantiationAwareBeanPostProcessor 对Bean的创建过程进行定制
@Component public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor { private static final Logger log = LoggerFactory.getLogger(MyBeanPostProcessor.class); // 实例化之前 @Override public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { if (beanName.equals("lifeCycleBean")) { log.info("初始化之前执行, 这里返回的bean会替换原版本的bean"); } return null; } // 实例化之后 @Override public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { if (beanName.equals("lifeCycleBean")) { log.info("实例化之后执行, 这里返回false会跳过依赖注入阶段"); //return false; } return true; } // 依赖注入阶段执行 @Override public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException { if(beanName.equals("lifeCycleBean")){ log.info("依赖注入阶段执行, 如@Autowired, @Value, @Resource"); } return pvs; } // 初始化之前 @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if(beanName.equals("lifeCycleBean")){ log.info("初始化之前执行, 这里返回的对象会替换原本的bean, 如@PostConstruct, @ConfigurationProperties"); } return bean; } // 初始化之后执行 @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (beanName.equals("lifeCycleBean")) { log.info("初始化之后执行, 这里返回的对象会替换原本的bean, 如代理增强"); } return bean; } // 销毁之前 @Override public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException { if(beanName.equals("lifeCycleBean")){ log.info("销毁之前执行, 如 @PreDestroy"); } } }
到此这篇关于springbean的加载过程以及应用场景的文章就介绍到这了,更多相关springbean加载过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!