参考文献
spring加载流程之AnnotatedBeanDefinitionReader_yu_kang的博客-CSDN博客
1.scan 扫描被@Component 等标志的组件
2.parse 解析这些组件最终封装成为一个 beanDefinition
3.GenericBeanDefinition 在里面设置一些类的信息
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setScope("prototype");
beanDefinition.setBeanClass(Person.class);
beanDefinition.setBeanClassName("*******");
4.把beanDefinition 放在beanDefinitionMap 里面 (这个beanDefinitionMap 是放在工厂里面的)
map.put("******",beanDefinition )
5.调用拓展
6.遍历map 创建对象
7.一个类implements BeanFactoryPostProcessor 在beanDefinitionMap肯定能拿到tBeanDefinition
@Component
public class Test1Controller implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
configurableListableBeanFactory.getBeanDefinition("");
}
}
public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
BeanDefinition bd = (BeanDefinition)this.beanDefinitionMap.get(beanName);
if (bd == null) {
if (this.logger.isTraceEnabled()) {
this.logger.trace("No bean named '" + beanName + "' found in " + this);
}
throw new NoSuchBeanDefinitionException(beanName);
} else {
return bd;
}
}
2.bean实例化过程
加载配置文件---解析---封装成beanDefinition---实例化---完成对象---使用---销毁
常用的接口和实现类:
DefaultListableBeanFactory XmlBeanDefinitionReader ConfigurationClassPostProcessor: BeanFactoryPostProcessor bstractApplicationContext
Spring AOP
AspectJAutoProxyBeanDefinitionParser BeanDefinitionParser
1.执行目标方法时候会调用
CglibAopProxy intercep() List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);--采用责任链表