首页 > 其他分享 >spring 实用小技巧

spring 实用小技巧

时间:2024-10-01 13:47:21浏览次数:7  
标签:技巧 spring Order 实用 Bean 注解 my public 加载

1. @PropertySource注解

加载properties文件,加载完成之后,放到了环境变量Environment当中,通过Environment对象可以直接获取 代码如下所示:

定义一个my.properties文件,写入两个属性:

my.app.name=rj
my.app.version=1.0.0

在启动类上添加注解@PropertySource, 引入my.properties文件

// 读取my.properties这个配置文件
@PropertySource("classpath:my.properties")

测试读取配置文件里的内容

@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);
}

result

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,即如果配置属性不存在,条件不成立。测试代码如下所示
@Service
@ConditionalOnProperty(name = "special.service.enabled", havingValue = "true")
public class SpecialService {

    public void doSpecialThing() {
        System.out.println("SpecialService is working.");
    }
}

在配置文件当中进行配置

special:
  service:
    enabled: false

创建单元测试,根据enable值的不同, 查看一下bean是否已经创建

4. @ImportResource注解

在 SpringBoot 工程中,可以通过 @ImportResource@PropertySource 引入对应的配置文件,完成对象的初始化。
应用场景:

在实际的开发中,虽然使用 SpringBoot 工程,但为了兼容一些老的项目或者一些还没有升级到 SpringBoot Starter 的组件,则需要单独引入 Spring 配置文件来创建对象。

测试代码如下所示:
新建一个实体类

@Data
public class User {
    private String username;
    private String gender;;
    private String address;
}

在resources新建一spring 的xml文件, 这里的名字是bean.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”)

@SpringBootApplication
// 读取my.properties这个配置文件
@PropertySource("classpath:my.properties")
// 在spring boot当中加载xml文件
@ImportResource("classpath:spring/bean.xml")
public class RjSpringBootDemo01Application {}

单元测试里测试一下

@Autowired
 private User user;
  @Test
 public void userTest() {
     log.info("user:{}",user);
 }

测试结果如下所示:
1

5. @Primary注解

当一个接口,有多个对象需要放到容器的时候,再使用@Resources注入使用的时候,此时会抛出异常. 此时可以使用@Primary注解标记一首选对象, 注入的时候,会先注入首选对象.

定义一个接口

public interface IUserService {
}

定义两个实现类

@Service
public class AUserServiceImpl implements IUserService {
}

@Service
public class BUserServiceImpl implements IUserService {
}

单元测试一下

@Autowired
private IUserService userService;

1

23
添加@Primary注解

@Service
@Primary // 默认情况下,如果存在多个实现类,则使用@Primary注解的实现类
@Order(1) // 初始化优先级,数字越小,越小被加载
public class AUserServiceImpl implements IUserService {
}

单元测试

@Test
public void userServiceTest() {
    log.info("userService:{}",userService);
}

123

6. @ConditionalOnMissingBean

检测创建Bean, 免费重复创建Bean. 示例如下所示:

@ConditionalOnMissingBean
@Bean(name = "account01")
public Account account01(){
    return new Account();
}

@ConditionalOnMissingBean
@Bean(name = "account02")
public Account account02(){
    return new Account();
}

测试代码


@Resource
private Account account;

@Test
public void accountTest() {
  log.info("account:{}",account);
}

标签:技巧,spring,Order,实用,Bean,注解,my,public,加载
From: https://blog.csdn.net/ldcigame/article/details/142651542

相关文章

  • spring aop记录
     使用:importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.annotation.After;importorg.aspectj.lang.annotation.Before;importorg.aspectj.lang.annotation.Aspect;importorg.springframework.stereotype.Component;@Aspect@ComponentpublicclassLog......
  • 足球青训俱乐部管理:Spring Boot技术革新
    3系统分析3.1可行性分析可行性分析是该平台系统进行投入开发的基础第一步,必须对其进行可行性分析才能够降低不必要的需要从而使资源合理利用,更具有性价比和降低成本,同时也是系统平台的成功的未雨绸缪的一步。3.1.1技术可行性技术可行性一是考虑客观的技术可行性,二是......
  • Spring Boot技术在足球青训管理中的创新应用
    3系统分析3.1可行性分析可行性分析是该平台系统进行投入开发的基础第一步,必须对其进行可行性分析才能够降低不必要的需要从而使资源合理利用,更具有性价比和降低成本,同时也是系统平台的成功的未雨绸缪的一步。3.1.1技术可行性技术可行性一是考虑客观的技术可行性,二是......
  • SSM项目实战II基于Spring Boot的新闻资讯系统的设计与实现(开发文档+数据库+源码)
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者一、前言前言随着互联网技术的迅猛发展,信息传播的速度日益加快,新闻资讯已成为人们日常生活中不可或缺的一部分。为了满足广大用......
  • 全国大学生数学建模竞赛方法与技巧
    本文同步发布在这里!前言本随笔为数模国赛前的最后一堂课的笔记。有一些零零散散,但是信息量很大。如果有机会(现在是没必要啦),再整理成方便阅读的文字吧。数据题数据类题目获奖容易,拿国一难。同时选择该题的队伍数量较多,以2023年为例,三道题选择比例大约是A:B:C=1:3:9。做数据题......
  • springboot基于java的智慧点餐系统(源码+文档+调试+vue+前后端分离)
    收藏关注不迷路!!......
  • 足球青训管理:Spring Boot技术实践
    2相关技术简介2.1Java技术Java是一门伟大的纯面向对象的编程语言和编程语言。同时,它还是Java语言从嵌入式开发到企业级开发的平台。Java凭借其一次编译,任何地方执行的优点,使得盛行的web应用程序有大量的Java编译,很好地支持网络发展跨平台开发所需的功能,成为服务器端主要......
  • Spring Boot与足球青训后台系统的协同
    3系统分析3.1可行性分析可行性分析是该平台系统进行投入开发的基础第一步,必须对其进行可行性分析才能够降低不必要的需要从而使资源合理利用,更具有性价比和降低成本,同时也是系统平台的成功的未雨绸缪的一步。3.1.1技术可行性技术可行性一是考虑客观的技术可行性,二是......
  • Linux(三)文件管理、复杂操作与实用工具详解
    Linux学习笔记(三)文件管理、复杂操作与实用工具详解Linux学习笔记(二):深入理解用户管理、运行级别与命令行操作1.文件操作的基本操作1.1创建创建目录mkdir:创建目录mkdir/home/dog#创建单级目录mkdir-p/home/animal/tiger#创建多级目录,如果父目录不存在,将连......
  • 基于springboot+vue的Android的乡村研学旅行APP系统app小程序(源码+文档+部署讲解等)
    前言......