做兼职网上哪个网站好,西宁网站制作公司,合肥门户网站有哪些,无锡网站建设哪家做简介
spring在创建Bean的过程中#xff0c;提供了很多个生命周期#xff0c;实例化前就是比较早的一个生命周期#xff0c;顾名思义就是在Bean被实例化之前的处理#xff0c;这个时候还没实例化#xff0c;只能拿到该Bean的Class对象#xff0c;如果在这个时候直接返回一…简介
spring在创建Bean的过程中提供了很多个生命周期实例化前就是比较早的一个生命周期顾名思义就是在Bean被实例化之前的处理这个时候还没实例化只能拿到该Bean的Class对象如果在这个时候直接返回一个对象那么就不用spring给我们创建了
简单使用
实现 InstantiationAwareBeanPostProcessor 接口的 postProcessBeforeInstantiation方法
Component
public class UserBean {public UserBean() {System.out.println(实例化UserBean);}
}Component
public class BeforeInstantiation implements InstantiationAwareBeanPostProcessor {Overridepublic Object postProcessBeforeInstantiation(NotNull Class? beanClass, String beanName) throws BeansException {if (beanName.equals(userBean)) {return 1;}return null;}
}public static void main(String[] args) {AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(context.getBean(userBean));
}
输出结果 1
从上面的逻辑可以看出如果beanName是userBean那么直接返回一个 1这个返回值是个object任意类型都可以如果直接返回有结果那么这个结果就是该bean的结果spring不会再给我们去实例化bean
源码分析
createBean源码
Object bean resolveBeforeInstantiation(beanName, mbdToUse);// 如果拿到Bean直接返回也就是不会再有后面的逻辑,后面的一些扩展点会不生效
if (bean ! null) {return bean;
}进入 resolveBeforeInstantiation
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {Object bean null;if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {// 有没有 InstantiationAwareBeanPostProcessors 后置处理器if (!mbd.isSynthetic() hasInstantiationAwareBeanPostProcessors()) {Class? targetType determineTargetType(beanName, mbd);if (targetType ! null) {// 如果有后置处理去执行初始化前逻辑可能获得了一个Beanbean applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);if (bean ! null) {// 如果获得了Bean由于外面是直接返回但是Aop逻辑应该还是要有而aop就是通过初始化后的后置处理实现的所以需要执行bean applyBeanPostProcessorsAfterInitialization(bean, beanName);}}}mbd.beforeInstantiationResolved (bean ! null);}return bean;
}protected Object applyBeanPostProcessorsBeforeInstantiation(Class? beanClass, String beanName) {// 遍历执行postProcessBeforeInstantiation方法可能可以直接获得到Beanfor (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {Object result bp.postProcessBeforeInstantiation(beanClass, beanName);if (result ! null) {return result;}}return null;
}public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {Object result existingBean;// 遍历执行初始化后的逻辑postProcessAfterInitializationfor (BeanPostProcessor processor : getBeanPostProcessors()) {Object current processor.postProcessAfterInitialization(result, beanName);if (current null) {return result;}result current;}return result;
}从上面的源码逻辑得知每个bean都会进行实例化前的操作通过找出所有的InstantiationAwareBeanPostProcessor执行postProcessAfterInitialization方法进行扩展。
以上就是实例化前的扩展点。 欢迎关注学习不迷路