美文网首页
Spring实战随笔(三)高级装配

Spring实战随笔(三)高级装配

作者: 面包树_A | 来源:发表于2018-05-11 14:30 被阅读0次

    Spring高级装配

    - Profile机制

    以DataSource为例,在Dev和Pro环境使用的是不一样的,这样在发布的时候需要切换配置,这样Spring就提供了Profile机制,基于哪个profile激活了才装配该profile配置的bean。
    @Profile("dev")
    <beans …… profile="dev"/>

    - 条件化的Bean

    Spring4后才支持的一种功能:完全根据你的需要来创建bean(希望某个bean在特定路径下包含特定库时才创建、bean依赖于某个特定bean创建完成之后才创建、某个特定环境变量设置后才创建)。

    @Bean
    // 只有在MagicExistCondition创建了才会创建MagicBean
    @Conditional(MagicExistCondition.class)
    public MagicBean magicBean(){
      return new MagicBean();
    }
    

    @Conditional是判断条件是否为true,所以MagicExistCondition实现了Condition接口

    public class MagicExistCondition implements Condition{
      public boolean matches(){
        // 这里添加代码判断是否match
      }
    }
    

    - Spring限定符

    在自动化装配的时候如果出现多个bean冲突的时候可以通过限定符来限定。
    @Primary: 优先装配
    @Qualifier: 指定装配

    // 指定装配的Dessert bean id是IceCream
    @Qualifier("IceCream")
    public void setDessert(Dessert dessert ){  this.dessert = dessert; }
    
    // 上述缺点,如果改名的话这里的代码也要改。
    // 所以可以在bean上面定义qualifier,相当于定义一个别名吧
    @Qualifier("Alias")
    public class IceCream implements Dessert{}
    // 这里就直接用Alias了
    @Qualifier("Alias")
    public void setDessert(Dessert dessert ){  this.dessert = dessert; }
    
    // 可以给一个bean同时加多个限定符
    @Qualifier("cold")
    @Qualifier("creamy")
    public class IceCream implements Dessert { ... }
    
    // 也可以自定义注解限定符
    @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Qualifier
    public @interface Cold { }
    @Cold
    @Cualifier
    public class IceCream implements Dessert { ... }
    

    - Bean作用域

    通过@Scope定义

    - 运行时值注入

    • 注入外部值
      最简单的就是声明属性源,可以用@PropertySource声明
    // 这样声明了就会把app.properties文件加载到Spring的Environment中
    @PropertySource("classpath:/com/soundsystem/app.properties")
    public class ExpressiveConfig{
      @Autowired
      Enviroment env;
      @Bean
      public BlankDisc disc(){
        // 通过调用Spring Environment的getProperty来获取,这样就在运行时才处理值,不提前处理。
        //然后在app.properties中需要定义app.properties和disc.artist
        return new BlankDisc(env.getProperty("disc.title"), env.getProperty("disc.artist"))
        // Environment还有很多其他方法,并且不光能获取property,还能获取profile
      }
    }
    

    还有复杂一点的属性占位符${……}

    • 用Spring表达式(SpEL)#{……}

    这章学习的都是些零散的Bean装配的知识,可以当作手册来学习,不需要死记语法,接下来要学习AOP。

    相关文章

      网友评论

          本文标题:Spring实战随笔(三)高级装配

          本文链接:https://www.haomeiwen.com/subject/ucefdftx.html