-
在 JavaConfig 中使用
@Profile
注解指定某个 bean 属于哪个 profile,只有在规定 profile时 bean 才会被创建,没有指定 profile 的 bean 会始终被创建。 -
在 xml 中可以通过
<beans>
元素的 profile 属性配置 bean,还可以在根<beans>
元素中嵌套定义<beans>
元素,而不是为每一个 profile 创建一个 xml 配置。 -
spring 通过 spring.profiles.active 和 spring.profiles.default 确定激活哪一个 profile,如果设置了 active,将用 active 的值作为激活的 profile,否则将会使用 default 的值作为激活的 profile。如果均未设置,表示没有激活的 profile,只创建没有定义在 profile 中的 bean。
-
有多种方式可以设置配置 profile 的两个属性(active 和 default): 作为 DispatcherServlet 的初始化参数,作为 web.xml 的参数,作为 JDNI 条目,作为环境变量,作为 JVM 系统属性,在集成测试类上使用
@ActiveProfiles
注解设置。 -
可以在 web.xml 中使用
<context-param>
为上下文设置默认的 profile,在生产环境中根据情况设置 spring.profiles.active,方便开发人员从版本控制软件中获取源码。 -
@ActiveProfiles
注解可以指定在运行测试时使用哪个 profile。 -
@Conditional(yourCondition.class)
注解可以用在带有@Bean
注解的方法上,给定条件满足时才会创建 bean,yourCondition.class 需要实现 Condition 接口。 -
可以通过
@Primary
注解设置首选 bean 来解决自动装配中多个 bean 满足条件的歧义性,在 xml中可以通过<bean primary="true" />
来设置。 -
装配限定符
@Qualifier("qualifierName")
可以与@Autowired
协同使用,表明要注入哪个 bean。@Qualifier("qualifierName")
也表示给 bean 指定限定符,没有指定 bean 的限定符时,会有一个默认的限定符与 ID 相同。@Qualifier
的最佳实践是为 bean 选择特征性或描述性的术语。需要同时使用多个限定符时,可以创建自定义的限定符注解。 -
默认情况下,spring 应用上下文中 bean 都以单例 Singleton的形式创建。除单例外,spring 还提供多种作用域:原型 Prototype,会话 Session,请求 Request。
-
选择其他作用域,要使用
@Scope
注解,例如@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
。xml 中可以使用 bean 下的 scope 属性来设置。 -
@Scope
注解还有一个proxyMode属性,用来指定将其他作用域的 bean 装配到单例 bean 中时的代理模式,ScopedProxyMode.INTERFACES
表明要实现对应接口,ScopedProxyMode.TARGET_CLASS
表明要以生成目标扩展类的方式创建代理。 -
spring 处理外部值时,可以声明属性源并通过 spring 的 Environment 来检索属性,例如使用注解
@PropertySource("classpath:/com/xxx/aaa.properties")
,注入 Environment env,通过 env 的getProperty()
方法获取。如果要求属性必须定义,可以使用env.getRequiredProperty("xxx")
获取,在没有找到定义时抛出异常。 -
spring支持将属性定义到外部的属性的文件中,通过占位符的形式为使用
${...}
的属性名称包装。 -
spring 的表达式语言 SpEL 要放在
#{...}
中,T()
运算符的结果为 class 对象,能够使用目标类型的静态方法和常亮。 -
SpEL 通过
matches
运算符支持表达式模式匹配,返回 boolean 值,例如#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9._]+\\.com'}
匹配email 地址。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于