当前位置: 首页 > news >正文

spring 实用小技巧

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 {}

单元测试里测试一下

@Autowiredprivate User user;@Testpublic 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);
}

相关文章:

  • 编程题 7-12 两个数的简单计算器【PAT】
  • Linux:磁盘管理
  • ps aux | grep smart_webrtc这条指令代表什么意思
  • SQLite3模块使用详解
  • 【Android 14源码分析】Activity启动流程-1
  • 大数据复习知识点5
  • linux服务器部署filebeat
  • [Everything] 文件搜索工具的下载及详细安装使用过程(附有下载文件)
  • Hadoop三大组件之HDFS(一)
  • 在树莓派上部署开源监控系统 ZoneMinder
  • 基于php的幸运舞蹈课程工作室管理系统
  • 黑名单与ip禁令是同一个东西吗
  • Android开发中的ViewModel
  • SpringMVC4-SpringMVC获取请求参数
  • TI DSP TMS320F280025 Note14:模数转换器ADC原理分析与应用
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 345-反转字符串中的元音字母
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • C# 免费离线人脸识别 2.0 Demo
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CODING 缺陷管理功能正式开始公测
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • JS变量作用域
  • Laravel 菜鸟晋级之路
  • LintCode 31. partitionArray 数组划分
  • node入门
  • Quartz初级教程
  • ReactNative开发常用的三方模块
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • TypeScript实现数据结构(一)栈,队列,链表
  • ubuntu 下nginx安装 并支持https协议
  • 复杂数据处理
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 计算机在识别图像时“看到”了什么?
  • 检测对象或数组
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 移动端解决方案学习记录
  • 用element的upload组件实现多图片上传和压缩
  • 怎么把视频里的音乐提取出来
  • nb
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​浅谈 Linux 中的 core dump 分析方法
  • #、%和$符号在OGNL表达式中经常出现
  • #{} 和 ${}区别
  • #Ubuntu(修改root信息)
  • #面试系列-腾讯后端一面
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (ibm)Java 语言的 XPath API
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (离散数学)逻辑连接词
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)