Spring4 实战 总结

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、泛型依赖注入

84c73b96d1088cd8c0f3dd9f27c898245e7.jpg

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延迟依赖注入

b3c85ce985d1715b0543a787344cb3b8132.jpg

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)
 

 

测试类如下

cdc92c8a29c7d0d2b72c0910dc5e0f0c032.jpg

 

7、@Profile 多环境判断注解

可以根据 dev test pro 环境判断哪些bean实例化,哪些配置生效

 

转载于:https://my.oschina.net/chuibilong/blog/3015255

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值