spring_注解方式流程
2023-01-05 09:36:03 2 举报
注解方式简单分析
作者其他创作
大纲/内容
2、调用AnnotationConfigUtils的内部静态方法
使用 AnnotationConfigUtils 的 applyScopedProxyMode()方法创建对于作用域的代理对象。
熟悉Spring的人一定都知道或用过@ConditionalOnBean / @ConditionalOnClass 等条件注解.而这些条件注解的解析就是ConditionEvaluator.
// 循环遍历候选者
调用上一步初始化好的reder的注册方法
this.scanner = new ClassPathBeanDefinitionScanner(this);
this.includeFilters.add(new AnnotationTypeFilter(Component.class));
this.reader.register(componentClasses);
ClassPathBeanDefinitionScanner类的父类的registerDefaultFilters方法主要是给Spring容器中注册了注解过滤器类Component实际上ClassPathBeanDefinitionScanner类的父类ClassPathScanningCandidateComponentProvider还有一个非常重要的方法:scan(),该方法才是真正进行包扫描的方法
父类
开始
内部
该方法的功能:注册一个或者多个带有注解的配置类
refresh();
ConfigurationClassPostProcessor
1、实现 BeanDefinitionRegistryPostProcessor
获取Spring的类扫描器
解析@scope注解,默认是单例模式 String scopeName = BeanDefinition.SCOPE_SINGLETON;
首先判断是否包含@Conditional,然后再判断是否需要继续
递归地处理配置类及其超类层次结构
2、bean的后置处理器
this.reader = new AnnotatedBeanDefinitionReader(this);
doProcessConfigurationClass()
processConfigBeanDefinitions()
GenericApplicationContext()
内
// 处理配置类中的通用注解,即Lazy、DependsOn、Primary和Role等,将处理的结果放到AnnotatedGenericBeanDefinition的数据结构中
主要是这个方法完成的postProcessProperties()
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( ContextConfig.class );
对应的类名1、ConfigurationClassPostProcessor2、AutowiredAnnotationBeanPostProcessor3、CommonAnnotationBeanPostProcessor4、PersistenceAnnotationBeanPostProcessor5、EventListenerMethodProcessor6、DefaultEventListenerFactory
在缺省的情况下,ClassPathBeanDefinitionScanner类只注册带有下面几个注解的类。@Component @Repository @Service @Controller @RestController@ManagedBean(Java EE 6)@Named(JSR-330)
重要
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
结束
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {//这里由于他有父类,故而会先调用父类的构造方法,然后才会调用自己的构造方法//在自己构造方法中初始一个读取器和扫描器this();register(annotatedClasses);refresh();}
1、beanFatory的后置处理器
ConfigurationClassParser#parser.parse(candidates);
AnnotationConfigApplicationContext带参构造函数
通过 BeanDefinitionReaderUtils 向容器注册 Bean。
List<TypeFilter> includeFilters是一个类型过滤器
registerBean(componentClass);
register(componentClasses);
注册后置处理器1、org.springframework.context.annotation.internalConfigurationAnnotationProcessor2、org.springframework.context.annotation.internalAutowiredAnnotationProcessor3、org.springframework.context.annotation.internalCommonAnnotationProcessor4、org.springframework.context.annotation.internalPersistenceAnnotationProcessor5、org.springframework.context.event.internalEventListenerProcessor6、org.springframework.context.event.internalEventListenerFactory
registerDefaultFilters();
2、postProcessBeanFactory()
1、就是初始化一个condition相关注解的一个评估器,用后面的实现类来处理
根据条件解析器来判断当前的configClass是否需要跳过解析
@Configuration@ComponentScan(\"com.liuly.spring.test\")public class ContextConfig { @Bean public User user() { User user = new User(); user.setId(\"1\"); user.setUserName(\"小明\"); user.setAge(\"18\"); user.setSalary(\"20000.00\"); user.setWork(\"架构师\"); return user; }}
1、postProcessBeanDefinitionRegistry()
@order排序
调用上上面注册好的方法
this.conditionEvaluator.shouldSkip(abd.getMetadata())
2、3、4 实现SmartInstantiationAwareBeanPostProcessor--InstantiationAwareBeanPostProcessor和BeanPostProcessor
创建@Configuration 的解析器
reader得到了Spring的7个内置后置处理器。
if (beanDef.getAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE) != null) {
public GenericApplicationContext() {this.beanFactory = new DefaultListableBeanFactory();} //这个类包含很多重要的容器比如beanDefinitionMap等等
doRegisterBean(beanClass)
注意参数是我们写的配置类
0 条评论
回复 删除
下一页