开发、测试和生产环境的配置和切换
开发 -> 测试 -> 部署上线,每个阶段的环境的配置参数会有不同,如数据源,文件路径等。为避免每次切换环境时都要进行参数配置等繁琐的操作,可以通过spring的profile功能来进行配置参数的切换。
使用xml进行配置profile
代码语言:javascript复制<!-- 开发环境配置文件 -->
<beans profile="development">
<context:property-placeholder
location="classpath*:common/*.properties, classpath*:development/*.properties" />
</beans>
<!-- 测试环境配置文件 -->
<beans profile="test">
<context:property-placeholder
location="classpath*:common/*.properties, classpath*:test/*.properties" />
</beans>
<!-- 生产环境配置文件 -->
<beans profile="production">
<context:property-placeholder
location="classpath*:common/*.properties, classpath*:production/*.properties" />
</beans>
设置spring.profiles.default和spring.profiles.active这两个属性来激活和使用对应的配置文件。default为默认,如果没有通过active来指定,那么就默认使用default定义的环境。
可以在web.xml文件中设置
代码语言:javascript复制 <context-param>
<param-name>spring.profiles.default</param-name>
<param-value>development</param-value>
</context-param>
<!-- 在上下文context-param中设置profile.active的默认值 -->
<!-- 设置active后default失效,web启动时会加载对应的环境信息 -->
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>development</param-value>
</context-param>
配置默认值和激活状态值,若没设置激活状态,则现在环境以默认为主。
也可以直接对相应的资源设置相应的注解,只有选择相应的资源,那么相应的资源才会生效,比如可以对数据源进行注解,表明选择哪一个数据源。
使用JavaConfig配值Profile
在不同的配值文件上注解 @Profile("dev") @Profile("prod") 在激活时也可以使用注解 @ActiveProfiles("dev")
条件化Bean
如果希望一个Bean只有才包含某一个库时才创建,或者在某个特定环境下才进行创建。
@Conditional注解可以用到带Bean的注解上。 @ConditionalOnClass Classpath里有指定的类 @ConditionalOnMissingClass Classpath里缺少指定的类 @ConditionalOnExpression 给定的Spring Expression Language( SpEL)表达式计算结果为true @ConditionalOnJava Java的版本匹配特定值或者一个范围值 @ConditionalOnJndi 参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNInitialContext @ConditionalOnProperty 指定的配置属性要有一个明确的值 @ConditionalOnResource Classpath里有指定的资源
自定义注解
1.@Target,
2.@Retention,
3.@Documented,
4.@Inherited
- @Target:用户描述注解的作用范围
取值(ElementType)有:
代码语言:javascript复制 1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
- @Retention:表示需要在什么级别保存该注释信息 取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)(常用)
- @Documented:Documented是一个标记注解
- @Inherited :用于声明一个注解;
自定义注解语法:
public @interface 注解名 {定义体}
代码语言:javascript复制@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MyComponent {
String value() default "";
}
代码语言:javascript复制@MyComponent
public static class InjectClass {
public void print() {
System.out.println("hello world");
}
}
注解的作用域和会话
最具有代表性的例子是用户购物车,如果购物车是单例,将导致所有用户同时向同一购物车购物,如果购物车是原型作用域,那么在应用的某一地方添加商品,在另一地方就不可用。
bean中的注解可以使用@Scope来声明作用域
代码语言:javascript复制@Component
@Scope(
value=WebApplicationContext.SCOPE_SESSION
proxyMode=ScopedProxyMode.INTERFACES
)
public ShoppingCart cart() {... ...}
Scope_session表明Spring会为Web应用中的每一个会话创建一个实例shoppingcart,在每一个会话中都是单例。
ScopedProxyMode,可以延迟注入请求和会话作用域的Bean
XML中声明作用域代理
xml中可以添加scope=”session“属性
运行时注入
在Spring中,处理外部源最简单的办法就是通过属性源并通过Spring的Environment来检索属性。