一.判断一个成员变量是否可访问并且设置为可访问
ReflectionUtils.makeAccessible(factoryMethod);
public static void makeAccessible(Field field) {
if ((!Modifier.isPublic(field.getModifiers()) || //成员变量修改时符不是public
!Modifier.isPublic(field.getDeclaringClass().getModifiers()) || //内部类修饰符不是public
Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) { //修饰符是final但是不可访问
field.setAccessible(true);
}
}
二.实现的接口汇总
1、BeanDefinitionRegistryPostProcessor接口
作用:对beanFactory里面的bean做增删改查操作
位置:二.完成对两个接口的调用:invokeBeanFactoryPostProcessors
1.postProcessBeanDefinitionRegistry()方法
//1.先获取实现了BeanDefinitionRegistryPostProcessor接口的所有类
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
//2.遍历调用方法postProcessBeanDefinitionRegistry
for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
postProcessor.postProcessBeanDefinitionRegistry(registry);
}
2.postProcessBeanFactory()方法
//1.先获取实现了BeanDefinitionRegistryPostProcessor接口的所有类
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
registryProcessors.addAll(currentRegistryProcessors);
//2.遍历调用postProcessBeanFactory()
for (BeanFactoryPostProcessor postProcessor : postProcessors) {
postProcessor.postProcessBeanFactory(beanFactory);
}
2、BeanFactoryPostProcessor接口
作用:对beanFactory里面的bean做增删改查操作
位置:二.完成对两个接口的调用:invokeBeanFactoryPostProcessors
postProcessBeanFactory()方法
//1.获取所有BeanFactoryPostProcessor接口的实现类
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
nonOrderedPostProcessorNames.add(ppName);
}
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
//2.遍历调用postProcessBeanFactory()
for (BeanFactoryPostProcessor postProcessor : postProcessors) {
postProcessor.postProcessBeanFactory(beanFactory);
}
3、BeanPostProcessor接口
作用;bean实例化前和实例化后分别调用postProcessBeforeInitialization、postProcessAfterInitialization
位置:五 finishBeanFactoryInitialization
postProcessBeforeInitialization()方法
//获取所有postProssors,遍历调用postProcessBeforeInitialization()
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessBeforeInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
postProcessAfterInitialization()方法
for (BeanPostProcessor processor : getBeanPostProcessors()) {
//循环对这个bean进行反复的装饰,反复的调用
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
问题:getBeanPostProcessors() 其实就是AbstractBeanFactory.beanPostProcessors,那么它是什么时候加进beanFactory的?
在三 registerBeanPostProcessors 把实现了BeanPostProssor接口的类实例化,并且加入到beanFactory
//1.获取BeanPostProssor接口的所有类
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
//2.遍历添加到beanFactory的集合beanPostProcessors
for (BeanPostProcessor postProcessor : postProcessors) {
beanFactory.addBeanPostProcessor(postProcessor);
}
4、Aware接口
Aware接口:拿到bean直接调用方法
//2.Aware
private void invokeAwareMethods(String beanName, Object bean) {
//判断bean的类型
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
4、什么接口
如下几种的作用是一样的,都是在bean实例化以后做一些操作,只是时序性不一样
@PostConstruct > 实现了InitializingBean接口 > xml配置<init-method>
1.方法上有注解@PreDestroy
在类AbstractAutowireCapableBeanFactory的initializeBean方法的applyBeanPostProcessorsAfterInitialization
具体在类InitDestroyAnnotationBeanPostProcessor的invokeInitMethods
2.方法上有注解@PostConstruc
在类AbstractAutowireCapableBeanFactory的initializeBean方法的applyBeanPostProcessorsBeforeInitialization
//拿到所有的postProcessors
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessBeforeInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
3.类实现接口InitializingBean
在类AbstractAutowireCapableBeanFactory的initializeBean方法的invokeInitMethods
4.类实现Aware接口
在类AbstractAutowireCapableBeanFactory的initializeBean方法的invokeAwareMethods(beanName, bean);
比如实现接口BeanNameAware BeanFactoryAware BeanClassLoaderAware,在实例化bean以后调用如下这个方法
private void invokeAwareMethods(String beanName, Object bean) {
//判断bean的类型
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}