美文网首页
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