Spring高级装配Bean

作者: Tim在路上 | 来源:发表于2019-01-17 13:19 被阅读3次

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

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

    使用xml进行配置profile
    <!-- 开发环境配置文件 -->
        <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文件中设置

        <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)有:

        1.CONSTRUCTOR:用于描述构造器
        2.FIELD:用于描述域
        3.LOCAL_VARIABLE:用于描述局部变量
        4.METHOD:用于描述方法
        5.PACKAGE:用于描述包
        6.PARAMETER:用于描述参数
        7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
    
    1. @Retention:表示需要在什么级别保存该注释信息
      取值(RetentionPoicy)有:
        1.SOURCE:在源文件中有效(即源文件保留)
        2.CLASS:在class文件中有效(即class保留)
        3.RUNTIME:在运行时有效(即运行时保留)(常用)
    
    1. @Documented:Documented是一个标记注解
    2. @Inherited :用于声明一个注解;
    自定义注解语法:

    public @interface 注解名 {定义体}

    @Target({ ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface MyComponent {
        String value() default "";
    }
    
    @MyComponent
      public static class InjectClass {
        public void print() {
            System.out.println("hello world");
        }
    }
    

    注解的作用域和会话

    最具有代表性的例子是用户购物车,如果购物车是单例,将导致所有用户同时向同一购物车购物,如果购物车是原型作用域,那么在应用的某一地方添加商品,在另一地方就不可用。

    bean中的注解可以使用@Scope来声明作用域

    @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来检索属性。

    相关文章

      网友评论

        本文标题:Spring高级装配Bean

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