| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> spring 全家族相关注解 -> 正文阅读 |
|
[Java知识库]spring 全家族相关注解 |
粗略解析记录spring系列常用注解,该篇暂不探寻源码原理阶段。主要记录作用 ? 1.@ConfigurationProperties和@Value两个注解都是可以从配置文件中属性自动赋值到实体类Bean中的属性值,但是@Value只能一个一个属性的修饰,而ConfigurationProperties适合很多属性的情况下,并且还可以指定配置文件中的某一段来配置导入,需要指定perfix前缀属性,并且还支持_ - 自动转换驼峰 2.@EnableConfigurationProperties让使用了 @ConfigurationProperties 注解的类生效,并且将该类(注解里面的value参数修饰的类)注入到 IOC 容器中,交由 IOC 容器进行管理。因为单纯的在一个Java类使用注解无法生效,前提是(需要被spring容器来管理才可以,或者可以不用该注解,而用@Configuration或@Componet 也可以让ConfigurationProperties注解生效)而该注解里面还有一个属性,该属性能设置让选中ConfigurationProperties修饰类生效 Class<?>[] value() default {} 3.条件注解@ConditionalOnClass,@ConditionalOnProperty,@ConditionalOnMissingBean,@ConditionalOnBean常见的 3.1@ConditionalOnProperty该注解表示在spring boot中有时候需要控制配置类是否生效,可以使用该注解来控制配置类@Configuration是否生效,简单来讲,一般是在配置类上或者是@Bean修饰的方法上,添加此注解表示一个类是否要被Spring上下文加载,若满足条件则加载,若不满足条件则不加载。 通过其两个属性name以及havingValue来实现的,其中name用来从application.properties或者yml,总之配置文件中读取某个属性值。prefix为配置文件中的前缀。(value是name属性的别名,作用都是一样的。) 不配置havingValue属性:matchIfMissing为true则一定会加载配置类,matchIfMissing为false,有配置(name/prefix)加载类,无配置不加载类。 配置错误的havingValue的值:无论matchIfMissing怎么设置,都不会加载。假如havingValue值正确(有配置的name/prefix)配置文件的值相等正确。那么就是正确情况下的true,则必然加载 3.2@ConditionalOnClass,@ConditionalOnMissingClass@ConditionalOnClass:某个class(或者注解中属性设置的所有的class)位于类路径上,才会实例化一个修饰当前Bean。即判断当前classpath下是否存在指定类(所有),若是则将当前的配置装载入spring容器。也可以这么理解该注解表明输入(xxx.class)几个class,相当于给配置文件添加了一个开关,当检测存在输入类的时候,被改注解修饰的配置类会生效;否则不会将不会实例化。也就是说,如果项目中存在该依赖,会自动开启配置类,这也是spring boot自动装配原理中很重要的注解 @ConditionalOnMissingClass:当指定的类([]所有)不存在时才会被加载 3.2@ConditionalOnBean,@ConditionalOnMissingBean@ConditionalOnBean:当前spring容器中存在指定的实例对象时,被修饰的对应的@bean才会被spring加载 @ConditionalOnMissingBean:同上正好相反,当不存在时才会被加载。 -------------相关类似的注解还有 @ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean) 4.@import4.1、@Import注解须知
4.2、@Import的三种用法@Import的三种用法主要包括:
4.2.1、第一种用法:直接填class数组直接填对应的class数组,class数组可以有0到多个。 语法如下:
对应的import的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名 ,比如com.yc.类名 4.2.2、第二种用法:ImportSelector方式【重点】这种方式的前提就是一个类要实现ImportSelector接口,假如我要用这种方法,目标对象是Myclass这个类,分析具体如下: 创建Myclass类并实现ImportSelector接口
以上分析完毕之后,具体用法步骤如下: 第一步:创建Myclass类并实现ImportSelector接口,这里用于演示就添加一个全类名给其返回值
第二步:使用ImportSelector方式的Myclass类
这种方式也是springboot自动化配置@EnableAutoConfiguration的涉及到的用法。可详见spring5学习系列之------3 给容器注册组件三 @Conditional 和 @Import 注解用法_xzjayx的博客-CSDN博客 4.2.3、第三种用法:ImportBeanDefinitionRegistrar方式同样是一个接口,类似于第二种ImportSelector用法,相似度80%,只不过这种用法比较自定义化注册,具体如下: 第一步:创建Myclass2类并实现ImportBeanDefinitionRegistrar接口
第二步:编写代码,自定义注册bean
5.@EnableAutoConfiguration和@Configuration5.1@EnableAutoConfiguration该注解是springboot中的开启自动配置的注解,简单点说就是Spring Boot根据依赖中的jar包,自动选择实例化某些配置@EnableAutoConfiguration注解通过读取spring.factories文件里面的EnableAutoConfiguration指定的类,来初始化指定类下面的所有加了@Bean的方法,并初始化这个bean。 spring-boot-autoconfigure.jar/META-INF/spring.factories?源码中 这里插一嘴如果我们想自定义springboot-starter,一定要记得在自行写resource中写建文件spring.factories ,然后执行EnableAutoConfiguration=\xxx,\xxx org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ ---------------------------------------------------- 这里多说几句,至于为什么是spring.factories文件,是因为在springboot启动类入口中 SpringApplication.run静态方法运行启动之时,会首选会new springApplication(arg1,arg2);在该方法用会有做设置初始化接口和监听器接口时,会有一个重要方法getSpringFactoriesInstances(xx)
在该方法中SpringFactoriesLoader.loadFactoryNames(type, classLoader)该方法里面会加载spring.factories,至此就springboot在启动之时就先读取并且加载了spring.factories文件内容。
5.2@Configuration该注解仅仅就是表示是一个配置类的@Component,然后被spring容器管理 两种方式的差异
所以需要提供bean给其他jar包进行使用的时候,最好使用@EnableAutoConfiguration方式(spring-boot-starters里面的都是通过这种方式来进行提供的,他的所有初始化的过程全部在spring-boot-autoconfigure项目中),因为能更好的控制类文件的加载顺序。有助于维护更佳复杂的项目。 另外需要注意一点的就是,如果@EnableAutoConfiguration提供的类名称在扫描的路径之中,spring-boot会把这些类作为configuration先进行初始化了。然后@AutoConfigureAfter@AutoConfigureBefore 和 @AutoConfigureOrder 这类指定顺序的注解都会失效 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:27:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |