1、加载自定义资源文件
@PropertySource注解
官方介绍,与@configuration类一起使用
例子1
@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
@Autowired
Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}
2、优雅的空Springbean依赖实例判断
指定一个被注入的bean可能为空
方式1
@Autowired(required =false)
UserService userService;
@PostMapping
public SucessJsonResult<Void> add(@RequestBody User user) {
// 判断非空
if(userService != null) {
userService.save(user);
}
return new SucessJsonResult<>();
}
方式2
@Autowired
Optional<UserService> userService;
@PostMapping
public SucessJsonResult<Void> add(@RequestBody User user) {
// 判断非空
if(userService.isPresent()) {
userService.get().save(user);
}
return new SucessJsonResult<>();
}
3、泛型依赖注入
4、接口多实现依赖注入
方式一 MAP
key是bean的名字,value是实现了接口的bean
如:
{copyOfUserServiceImpl=com.iflytek.icourt.service.impl.CopyOfUserServiceImpl@5c8fd2da, userServiceImpl=com.iflytek.icourt.service.impl.UserServiceImpl@198d572f}
@Autowired
Map<String,UserService> userServiceMap;
@PostMapping
public SucessJsonResult<Void> add(@RequestBody User user) {
userServiceMap.get("copyOfUserServiceImpl").save(user);
return new SucessJsonResult<>();
}
方式二 List
@Autowired
List<UserService> userServiceMap;
@PostMapping
public SucessJsonResult<Void> add(@RequestBody User user) {
userServiceMap.get(0).save(user);
return new SucessJsonResult<>();
}
接口bean实现类的顺序可以通过用@Order注解或者Ordered接口来实现排序
@Order(100)
@Service
@Transactional
public class UserServiceImpl extends AbstractService<User> implements UserService {
5、@Lazy延迟依赖注入
6、@Conditional条件注解
@Conditional注解是可以根据一些自定义的条件动态的选择是否加载该bean到springIOC容器中去
@Conditional源码你会发现它既可以作用在方法上,同时也可以作用在类上
允许自定义规则,判断是否创建bean
@Profile注解就是依据@Conditional开发的
condition验证时机如下
com.iflytek.icourt.util.UtilAll.currentStackTrace(UtilAll.java:24)
com.iflytek.icourt.study.spring.condition.LLiProfileCondition.matches(LLiProfileCondition.java:23)
org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:102)
org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:81)
org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:64)
org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isConditionMatch(ClassPathScanningCandidateComponentProvider.java:371)
org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isCandidateComponent(ClassPathScanningCandidateComponentProvider.java:355)
org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:288)
org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:272)
org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:135)
org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:287)
org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198)
org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:308)
org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)
org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:272)
org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:92)
org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:687)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:525)
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
com.iflytek.icourt.Application.main(Application.java:13)
测试类如下
7、@Profile 多环境判断注解
可以根据 dev test pro 环境判断哪些bean实例化,哪些配置生效