springBoot启动注解解析,,,,,,,,
⾸先我们知道启动类的注解SpringBootApplication
点进去后会看到boot 的核⼼三⼤注解
java⾃定义注解⽐较简单
三⼤注解
@SpringBootConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods()default true;
}
其内部我们可以看出主要以@Configuration作为主体,也就是声明为spring容器注⼊组件的意思@EnableAutoConfiguration
最最最核⼼的"⾃动装配"注解 我们点进去
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "ableautoconfiguration"; Class<?>[] exclude() default {};
String[] excludeName() default {};
}
@AutoConfigurationPackage.
@Import({AutoConfigurationImportSelector.class})// 导⼊组件
在内部有⼀个⽅法selectImports返回是⼀个数组,通过全类名+反射的机制实例化纳⼊到spring容器中使⽤,
我们在点⼊AutoConfigurationEntry看⼀下
加载⼯⼚名称
加载spring⼯⼚springboot aop
⾃动加载⽂件
值是map形式的kv值,会⾃动装配配置内的类,以String数组的形式返回,通过全类名+反射的⽅式进⾏实例化
那么每个类都要去装配吗
我们点进⼀个类看⼀下这个装配的类具有⼀定的装配条件
我们在application.properties 写⼊debug=true
我们会看到
Positive matches:
----------------- 已经加载装配的
AopAutoConfiguration matched:
- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)
- ⼀堆就不⼀⼀写了
Negative matches:
----------------- 未符合要求未装配的
ActiveMQAutoConfiguration:
Did not match:
-
@ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)
- - ⼀堆就不⼀⼀写了
ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class ‘javax.jms.ConnectionFactory’ (OnClassCondition)
@ConditionalOnBean(仅仅在当前上下⽂中存在某个对象时,才会实例化⼀个Bean)
@ConditionalOnClass(某个class位于类路径上,才会实例化⼀个Bean),该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类;
@ConditionalOnExpression(当表达式为true的时候,才会实例化⼀个Bean)
@ConditionalOnMissingBean(仅仅在当前上下⽂中不存在某个对象时,才会实例化⼀个Bean),该注解表⽰,如果存在它修饰的类的bean,则不需要再创建这个bean;可以给该注解传⼊参数例如@ConditionOnMissingBean(name = “example”),这个表⽰如果name为“example”的bean存在,这该注解修饰的代码块不执⾏。
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化⼀个Bean)
@ConditionalOnNotWebApplication(不是web应⽤)
@ConditionalOnProperty是指在l⾥配置的属性是否为true,其他的⼏个都是对class的判断
我们再来看@AutoConfigurationPackage内有⼀个@Import({Registrar.class})
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}
@Import({Registrar.class}) 点⼊注册类
这是批量的讲类注册为bean的实现⽅发因为实现了ImportBeanDefinitionRegistrar接⼝
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar(){
}
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry){
}
public Set<Object>determineImports(AnnotationMetadata metadata){
return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata));
}
那么是怎么回事那,源码中太乱我们⾃⼰简单的测试下
新建⼀个实体类student 实现类MyImportBean
1.实体类student 实现类MyImportBean实现ImportBeanDefinitionRegistrar
2.重写ImportBeanDefinitionRegistrar的两个⽅法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论