1. @PropertySource注解
加载properties文件,加载完成之后,放到了环境变量Environment当中,通过Environment对象可以直接获取
代码如下所示:
定义一个my.properties文件,写入两个属性:
properties
my.app.name=rj
my.app.version=1.0.0
在启动类上添加注解@PropertySource, 引入my.properties文件
java
// 读取my.properties这个配置文件
@PropertySource("classpath:my.properties")
测试读取配置文件里的内容
java
@Autowired
private Environment environment;
@Test
public void propertyTest(){
// 读取配置文件
String name = environment.getProperty("my.app.name");
// 读取配置文件
String property = environment.getProperty("my.app.version");
log.info("name:{},property:{}",name,property);
}
2.@Order注解
在 Spring 中,@Order注解用于定义 Bean 的加载顺序或者特定组件在执行顺序中的优先级。主要作用如下所示
-
控制 Bean 的初始化顺序
- 当多个 Bean 需要按照特定的顺序进行初始化时,可以使用@Order注解来指定它们的加载顺序。具有较小值的@Order注解的 Bean 会先被初始化。
- 例如,在一个复杂的应用中,某些 Bean 可能依赖于其他 Bean 的初始化完成后才能正确工作,通过设置@Order注解可以确保它们按照正确的顺序被创建。
-
作用于特定组件的执行顺序
- 过滤器(Filter)的执行顺序:在 Spring Web 应用中,可以使用@Order注解来控制过滤器的执行顺序。具有较小值的过滤器会先执行。
- 例如,在一个安全相关的应用中,可能有多个过滤器用于不同的安全检查,通过设置@Order注解可以确保它们按照正确的顺序执行,以提供有效的安全防护。
-
控制拦截器(Interceptor)的执行顺序
- 在需要控制加载顺序或执行顺序的类上添加@Order注解,并指定一个整数值作为优先级。
- 多个@Order注解的比较:当多个类都带有@Order注解时,Spring 会根据注解中的值从小到大进行排序。如果两个类的@Order值相同,则它们的执行顺序是不确定的,除非通过其他方式进行明确的排序。
3. 条件注解ConditionalOnProperty
@ConditionalOnProperty注解用于根据特定的配置属性值来决定是否要将某个 Bean 加载到 Spring 容器中。其主要作用如下所示
- 条件化 Bean 的加载:
- 这个注解允许你根据配置文件中的属性值来有条件地创建和注册 Bean。如果配置属性满足特定的条件,那么对应的 Bean 就会被加载到 Spring 容器中;否则,该 Bean 将不会被创建。
- 这在需要根据不同的环境或配置来动态加载特定组件的场景中非常有用。
- 灵活的配置控制:
- 通过在配置属性文件中设置不同的值,可以轻松地控制哪些组件在特定的环境中被加载。例如,可以根据开发环境、测试环境或生产环境的不同需求,选择性地加载特定的 Bean。
核心属性:
- name:指定要检查的配置属性的名称。
- havingValue:指定当配置属性具有这个值时,条件成立。
- matchIfMissing:当配置属性不存在时,是否默认条件成立。默认为false,即如果配置属性不存在,条件不成立。测试代码如下所示
java
@Service
@ConditionalOnProperty(name = "special.service.enabled", havingValue = "true")
public class SpecialService {
public void doSpecialThing() {
System.out.println("SpecialService is working.");
}
}
在配置文件当中进行配置
yaml
special:
service:
enabled: false
创建单元测试,根据enable值的不同, 查看一下bean是否已经创建
4. @ImportResource注解
在 SpringBoot 工程中,可以通过 @ImportResource
、@PropertySource
引入对应的配置文件,完成对象的初始化。
应用场景:
在实际的开发中,虽然使用 SpringBoot 工程,但为了兼容一些老的项目或者一些还没有升级到 SpringBoot Starter 的组件,则需要单独引入 Spring 配置文件来创建对象。
测试代码如下所示:
新建一个实体类
java
@Data
public class User {
private String username;
private String gender;;
private String address;
}
在resources新建一spring 的xml文件, 这里的名字是bean.xml
xml
<bean id="user" class="com.rj.entity.User">
<property name="username" value="rj" />
<property name="gender" value="男" />
<property name="address" value="深圳" />
</bean>
在启动类添加注解@ImportResource("classpath:spring/bean.xml")
java
@SpringBootApplication
// 读取my.properties这个配置文件
@PropertySource("classpath:my.properties")
// 在spring boot当中加载xml文件
@ImportResource("classpath:spring/bean.xml")
public class RjSpringBootDemo01Application {}
单元测试里测试一下
java
@Autowired
private User user;
@Test
public void userTest() {
log.info("user:{}",user);
}
测试结果如下所示:
5. @Primary注解
当一个接口,有多个对象需要放到容器的时候,再使用@Resources注入使用的时候,此时会抛出异常. 此时可以使用@Primary注解标记一首选对象, 注入的时候,会先注入首选对象.
定义一个接口
java
public interface IUserService {
}
定义两个实现类
java
@Service
public class AUserServiceImpl implements IUserService {
}
@Service
public class BUserServiceImpl implements IUserService {
}
单元测试一下
java
@Autowired
private IUserService userService;
添加@Primary注解
java
@Service
@Primary // 默认情况下,如果存在多个实现类,则使用@Primary注解的实现类
@Order(1) // 初始化优先级,数字越小,越小被加载
public class AUserServiceImpl implements IUserService {
}
单元测试
java
@Test
public void userServiceTest() {
log.info("userService:{}",userService);
}
6. @ConditionalOnMissingBean
检测创建Bean, 免费重复创建Bean. 示例如下所示:
java
@ConditionalOnMissingBean
@Bean(name = "account01")
public Account account01(){
return new Account();
}
@ConditionalOnMissingBean
@Bean(name = "account02")
public Account account02(){
return new Account();
}
测试代码
java
@Resource
private Account account;
@Test
public void accountTest() {
log.info("account:{}",account);
}