type
status
date
slug
summary
tags
category
icon
password
java
多线程
数据库
本地缓存
分布式缓存
消息队列
spring
1. 构造注入&List、Map
- 场景:IAwardService 接口有多个实现类,可以通过 @Resource、@Autowired 注解注入,也可以通过构造函数注入。在 Spring 官网文档中,是推荐使用构造函数注入的:
The Spring team generally advocates constructor injection, as it lets you implement application components as immutable objects and ensures that required dependencies are not null.
https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-collaborators.html(opens new window)
- 用途:Map 注入是一个非常好的注入手段,我们可以把每个 IAwardService 实现类设定好 Bean 的名称为数据库中的奖品 awardKey。在发奖的时候,可以直接根据 awardKey 从 Map 中获取到对应的 Bean 对象,这样也就省去了
if···else
大量的判断操作。
2. 空注入判断
- 场景:NullAwardService 没有配置 @Service 注册,或者在程序中手动实例化的这个 Bean 对象,根据不同诉求,在没有创建的时候。可以使用
@Autowired(required = false)
进行注入。这样就不会报错 nullAwardService 空指针异常。
- 用途:当我们在使用支付、openai外部接口对接测试阶段,可能有些时候是需要关闭服务的,也就是不实例化对象。那么这个时候就配置
@Autowired(required = false)
避免注入空指针
3. 优先实例化
- 场景:一个 IAwardService 有多个实现类的时候,如果还想用
@Resource 注入 awardService
的时候是会报错说NoUniqueBeanDefinitionException
异常了。这个时候使用 @Primary 就会标记为首选对象,注入的时候会注入这个对象。另外这里的@Order(1)
是对象的加载顺序。
- 用途:当我们为一组接口提供实现类,并需要提供默认的注入的时候,就可以使用
@Primary
注解来限定首选注入项。
4. 检测创建,避免重复
- 场景:
@Bean
可以用于在方法,创建出对象。这有点类似于使用 Spring 的 FactoryBean 接口创建对象一样,这里可以直接使用方法创建。之后@ConditionalOnMissingBean
注解的目的是为了避免重复创建,判断应用上下文中存在这个对象,则不会重复创建。
- 用途:通常我们在做一些组件的时候,会加入这样一个注解,避免在业务工程中引入同类的组件的时候,会导致创建出相同对象而报错。
5. 配置是否创建对象
- 场景:模拟创建 createTopic,入参的对象为注入的操作,@Qualifier 注解可以指定要注入哪个名字的对象。之后
@ConditionalOnProperty
注解可以通过配置的 enabled 值,来确定是否实例化对象。
- 用途:这个场景是非常使用的,比如你做了一个组件,或者业务中要增加一些配置。启动或关闭某些服务,就可以使用了。而不需要把 pom 中引入的组件注释掉。
6. 自定义Condition,判断是否实例化对象
- 场景:是一个案例中使用到了
@ConditionalOnProperty
注解,我们也可以自定义一个 Conditional 的实现类,之后把这个实现类配置到需要实例化的对象上面,通过 matches 匹配条件方法的实现,决定是否实例化。
- 用途:这个场景的用途和
@ConditionalOnProperty
是一样的,只不过我们可以更好的自定义控制。
7. 根据环境配置实例化对象
- 场景:
@Profile({"prod", "test"})
注解可以配置你是在什么时候实例化这个对象,我们可以指定 application.yml 中配置的active: dev/prod/test
来确定是在开发、测试还是上线才实例化这个对象。
- 用途:一些只有到线上才能实例化对象的时候,就可以配置
@Profile({"prod", "test"})
注解,注意这个需要配合@Autowired(required = false)
进行注入,否则会出现注入为空指针的异常。
- 场景:在 SpringBoot 工程中,可以通过
@ImportResource
、@PropertySource
引入对应的配置文件,完成对象的初始化。
- 用途:在实际的开发中,虽然使用 SpringBoot 工程,但为了兼容一些老的项目或者一些还没有升级到 SpringBoot Starter 的组件,则需要单独引入 Spring 配置文件来创建对象。
9. 原型对象
- 场景:
@Scope("prototype")
可以设定对象类型为原型对象,每次获得的对象都是一个新的实例化对象。
- 用途:对于动态,不同责任链创建,可以使用这个配置,确保每个对象都是自己的。
10. 其他注解
@EnableScheduling
:允许启动任务的注解,放到 Application 上,确保任务启动执行。
@DependsOn({"openai_model", "openai_use_count", "user_credit_random"})
Bean 对象实例化中,依赖于哪些对象。
@Autowired private Environment env;
环境配置注入,可以获取到 application.yml 中的配置数据env.getProperty("app.name"), env.getProperty("app.version")
@Async
异步方法注解,可以用于调用某个方法后,让下面的具体逻辑方法为异步执行,主方法直接返回结果。可以用于一些申请导出数据到文件的场景。
dubbo
- 作者:LocoLi
- 链接:http://locoli.top/article/dev-skills
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。