Spring高级装配Bean

2020-08-05 10:11:33 浏览数 (1)

开发、测试和生产环境的配置和切换

开发 -> 测试 -> 部署上线,每个阶段的环境的配置参数会有不同,如数据源,文件路径等。为避免每次切换环境时都要进行参数配置等繁琐的操作,可以通过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

  1. @Target:用户描述注解的作用范围

取值(ElementType)有:

代码语言:javascript复制
    1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
  1. @Retention:表示需要在什么级别保存该注释信息 取值(RetentionPoicy)有:
代码语言:javascript复制
    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)(常用)
  1. @Documented:Documented是一个标记注解
  2. @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来检索属性。

0 人点赞