Spring标签@Import 的使用

Spring标签@Import 的使用,第1张

在这里,我们将演示@Import注解的示例。 @Import注解将一个配置类导入另一个配置类。它与@Configuration注解一起使用。它与XML配置中的 <import />相同。我们只需要处理一个配置类,并使用 @ Import 导入配置类。

在这里,我们将提供@Import注解的简单示例。我们有两个配置文件(AppConfOne,AppConfTwo),他们每个人都在创建埋山一个bean(name分别为b和a)。因为AppConfOne 在配置中导入了AppConfTwo的配置,所以即使 SpringDemo.java 中 AnnotationConfigApplicationContext 只注册了AppConfOne的配置( ctx.register(AppConfOne.class)),也可以得到name为a的bean。

A.java

B.java

AppConfOne.java

AppConfTwo.java

SpringDemo.java

Output

在实时场景中,可能需要将bean依赖注入到另一个bean中,并且可以在不同的配置文件中声明这些bean。 Spring @Import通过将参数传递给@Bean标签的方法来处理这些情况。此方案也可以通过@Autowired标签处理。在此示例中,我们正在创建三个相互依赖的bean。我们需要通过依赖注入来解决它。

Address.java

Employee.java

Company.java

AddConf.java

EmpConf.java

CompConf.java

SpringDemo.java

Output

上面,Address,Employee,Company 分别对应各自的配置文件 AddConf,EmpConf,CompConf。Company里有Employee,Employee里有Address,所以只需要把AddConf,EmpConf 的配置导入CompConf ( @Import({EmpConf.class, AddConf.class}) ),在调用 ctx.register(CompConf.class)容器就会自动给Company注入Employee的配置(或好 new Employee(address)),给Employee注入Address的配置( new Address("Varanasi") )。

我们可以用弯团中@Autowired 标签重写EmpConf.java和CompConf.java,让 getXXX()方法不含参数。

EmpConf.java

CompConf.java

Output

https://www.jianshu.com/p/6b2f672e2446

了解SpringBoot之@Import注解正确使用方式

SpringBoot 的核心就是自动配置,自动配置又是基于条件判断来配置 Bean。关于自动配置的源码在 spring-boot -autoconfigure-2.0.3.RELEASE.jar

在通常需要我们在 property 中配置信息时,通常使用 @ConfigurationProperties(pefix=“前缀”) 注解的方式从配置漏脊文件中获取配置,如下:

application.yml 中配置信息

访问 url 获取配置信息返回的值

http://localhost:8080/msg

如果把 application.yml 中的配置信息注释掉则默认使用 default 值,否则使用配置信息中的值,以上便是普通配置方式

SpringBoot 运行原理

先看 @SpringBootApplication

主要关注的几个注解如下

@SpringBootConfiguration:标记当前类为配置类

@EnableAutoConfiguration:开启自动配置

@ComponentScan:扫描主类所在的同级包以及下级包里的 Bean

关键是 @EnableAutoConfiguration

最关键的要属 @Import(EnableAutoConfigurationImportSelector.class),借助** EnableAutoConfigurationImportSelector**,@EnableAutoConfiguration 可以帮助 SpringBoot 应用将所有符合条件的 @Configuration 配置都加载到当前 SpringBoot 创建并使用的 IoC 容器: 通过 @Import(AutoConfigurationImportSelector.class) 导入的配置功能,

AutoConfigurationImportSelector 中的方法 getCandidateConfigurations,得到待配置的 class 的类名集合, 这个集合就是所有需要进行自动配置的类,而是是否配置的关键在于 META-INF/spring.factories 文件中是否存在该配置信息

打开,如物搜拍下图可以看到所有需要配置的类全路径都在文件中,每行一个配置,多个类名逗号分隔, 而 \ 表示忽略换行

整个流程如上图所示

以 SpringApplicationAdminJmxAutoConfiguration 类来看其主要构成部分

都能看到各种各样的条件判断注解,满足条件时就加载这个 Bean 并实例

此类的条件注解是:@ConditionalOnProperty

@ConditionalOnBean:当容器里有指定 Bean 的条件下

@ConditionalOnClass:当类路径下有指定的类的条件下

@ConditionalOnExpression:基于 SpEL 表达式为 true 的时候作为判断条件才去实例化

@ConditionalOnJava:基于 JVM 版本作为判断条罩羡件

@ConditionalOnJndi:在 JNDI 存在的条件下查找指定的位置

@ConditionalOnMissingBean:当容器里没有指定 Bean 的情况下

@ConditionalOnMissingClass:当容器里没有指定类的情况下

@ConditionalOnWebApplication:当前项目时 Web 项目的条件下

@ConditionalOnNotWebApplication:当前项目不是 Web 项目的条件下

@ConditionalOnProperty:指定的属性是否有指定的值

@ConditionalOnResource:类路径是否有指定的值

@ConditionalOnOnSingleCandidate:当指定 Bean 在容器中只有一个,或者有多个但是指定首选的 Bean

这些注解都组合了 @Conditional 注解,只是使用了不同的条件组合最后为 true 时才会去实例化需要实例化的类,否则忽略

这种 spring4.X 带来的动态组合很容易后期配置,从而避免了硬编码,使配置信息更加灵活多变,同时也避免了不必要的意外异常报错。使用的人只要知道配置的条件即可也不用去阅读源码,方便快捷,这也是 sprignboot 快捷方式带来的好处

参考 HttpEncodingAutoConfiguration 配置信息如下

案例扩展

项目

需要实例化的服务类

配置信息对应的属性映射类, 需要 pom 中加入 spring-boot-starter 依赖

自动配置文件

在创建如下路径文件 src/main/resources/META-INF/spring.factories

必须是自动配置类的全路径

mvn install 该项目

创建一个 springboot-mvc 项目 pom 依赖上面的 jar

http://localhost:8080 / 则返回当前服务的默认值

在 applicaton.yml 中加, 重启刷新则会更新为如下信息

SpringBoot 自动化配置关键组件关系图

mybatis-spring-boot-starter、spring-boot-starter-web 等组件的 META-INF 文件下均含有 spring.factories 文件,自动配置模块中,SpringFactoriesLoader 收集到文件中的类全名并返回一个类全名的数组,返回的类全名通过反射被实例化,就形成了具体的工厂实例,工厂实例来生成组件具体需要的 bean。

在 spring boot 中有时候需要控制配置类是否生效, 可以使用 @ConditionalOnProperty 注解来控制 @Configuration 是否生效.


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12162341.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存