springboot原理分析
springboot自动配置
condition:在spring4.0增加的条件判断功能,通过这个功能可以实现选择性的创建bean操作。即满足条件则创建,不满足则不创建。
用自定的class实现condition,重写matches(这个方法返回true则会创建bean,相反则不创建)。
通过Class.forname来获取这个文件是否存在,存在则让matches返回true,相反返回false。
现在我们将类的判断定义为动态的。判断哪个字节码存在可以动态指定。
比如我在这自定注解ConditionOnClass,然后需要将注解@Conditional(ClassCondition.class)放入自定的注解里,并且为了要自定注解代替原注解,就需要将 @Conditional里的注解拿出来放到自定注解处。然后定义String数组存储多个文件名。
现在再看重写matches方法里的参数:
所以通过metadata来取指定的文件名value,
然后通过Map的get方法,将文件名存到List集合中,在遍历看是否有需要的文件。
小结:
自定义注解:
1.定义条件类:自定义实现Condition接口,重写matches方法,在这个方法里面进行逻辑判断,返回Boolean值。matches方法的两个参数:
context:上下文对象,可以获取属性值,类加载器,BeanFactory等。
metadata:元数据对象,用于获取注解属性。
2.判断条件:在初始化Bean时,使用@Conditional(条件.class)注解。
springboot自带注解:
ConditionalOnProperty:判断配置文件中是否有对应的属性和值才初始化Bean
ConditionalOnClass:判断环境中是否有对应的字节码文件才初始化Bean
ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean