• 【Spring 核心】高级装配


    高级装配用来适应开发和生产 不同环境下的软切换

    一、环境与profile

    1.开发环境下的profile

    package com.bonc.config;
    
    import javax.sql.DataSource;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Profile;
    import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
    import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
    
    /*
     * 一、注解开发profile
     * @Profile作用在了类上,告诉Spring这个配置类中的bean只有在dev profile激活时才创建
     * dev profile没有被激活的话,@Bean的注解都会被忽略掉。
     * 
     * Spring3.1中,只能在类级别上使用@Profile注解,在Spring3.2开始,
     * 你也可以在方法级别上使用@Profile注解,与@Bean注解一同使用,这样的话就能将两个bean放置到同一个配置类中。
     * 
     * 尽管只有当规定的profile被激活时,相应的bean才会被创建,但是可能会有其他的bean并没有声明在一个给定的profile中。
     * 没有指定profile的bean始终都会被创建,与激活哪个profile没有关系。
     * 
     * 
     * */
    
    @Configuration
    @Profile("dev")
    public class DevelopmentProfileConfig {
    
        @Bean(destroyMethod="shutdown")
        public DataSource dataSource(){
            return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
                    .addScript("classpath:schema.sql")
                    .addScript("classpath:test.sql").build();
        }
    }

    二、生产环境下profile

    package com.bonc.config;
    
    import javax.sql.DataSource;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Profile;
    import org.springframework.jndi.JndiObjectFactoryBean;
    
    @Configuration
    @Profile("prod")
    public class ProductionProfileConfig {
    
        @Bean
        public DataSource dataSource(){
            JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
            jndiObjectFactoryBean.setJndiName("jdbc/myDS");
            jndiObjectFactoryBean.setResourceRef(true);
            jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);
            return (DataSource) jndiObjectFactoryBean.getObject();
        }
    }

    三、在同一个类中配置开发与生产环境

    package com.bonc.config;
    
    import javax.sql.DataSource;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Profile;
    import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
    import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
    import org.springframework.jndi.JndiObjectFactoryBean;
    
    @Configuration
    public class DataSourceConfig {
    
        @Bean(destroyMethod="shutdown")
        @Profile("dev")
        public DataSource embeddedDataSource(){
            return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
                    .addScript("classpath:schema.sql")
                    .addScript("classpath:test.sql").build();
        }
        
        @Bean
        @Profile("prod")
        public DataSource jndiDataSource(){
            JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
            jndiObjectFactoryBean.setJndiName("jdbc/myDS");
            jndiObjectFactoryBean.setResourceRef(true);
            jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);
            return (DataSource) jndiObjectFactoryBean.getObject();
        }
    }

    四、在XML配置各种环境

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:jdbc="http://www.springframework.org/schema/jdbc"
            xmlns:jee="http://www.springframework.org/schema/jee"
            xsi:schemaLocation="
            http://www.springframework.org/schema/jee
            http://www.springframework.org/schema/jee/spring-jee.xsd
            http://www.springframework.org/schema/jdbc
            http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
        <beans profile="dev">
            <jdbc:embedded-database>
                <jdbc:script location="classpath:schema.sql"/>
                <jdbc:script location="classpath:test-data.sql"/>
            </jdbc:embedded-database>
        </beans>
        <beans profile="qa">
            <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"/>
        </beans>
        <beans profile="prod">
            <jee:jndi-lookup 
            id="dataSource"
            jndi-name="jdbc/myDatabase"
            resource-ref="true"
            proxy-interface="javax.sql.DataSource"/>
        </beans>
    <!--
        除了所有的bean定义到了同一个XML文件中,这种配置方式与定义在单独的XML文件中的实际效果是一样的。
        这里有三个bean,类型都是javax.sql.DataSource,
        并且ID都是dataSource。但是运行时,只会创建一个bean,这取决处于激活状态的是那个profile
     -->
    </beans>

    五、激活profile
     Spring在确定哪个profile处于激活状态时,需要依赖两个独立的属性;spring.profiles.active和 spring.profiles.default。
    如果设置了spring.profiles.active属性的活,那么它的值就会用来确定是那个profile是激活的。
    如果没有设置spring.profiles.active的属性值,Spring将查找spring.profiles.default的值。
    如果两者都没设置,那就没有激活的profile,只会创建那些没有定义在profile中的值。
    有多种方式来设置这两个属性:
    1.作为DispatcherServlet的初始化参数

    2.作为Web应用的上下文参数
    3.作为JNDI条目;
    4.作为环境变量
    5.作为JVM的系统属性
    6.在集成测试类上,使用@ActiveProfiles注解设置。

    比较推荐的是在web.xml配置 作为DispatcherServlet的初始化参数

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
            http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name>spring learning</display-name>
      <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>/WEB-INF/spring/root-context.xml</param-value>
      </context-param>
      <context-param>
          <param-name>spring.profiles.default</param-name>
          <param-value>dev</param-value>
      </context-param>
      <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      
      <servlet>
          <servlet-name>appServlet</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
              <param-name>spring.profiles.default</param-name>
              <param-value>dev</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
      </servlet>
      
      <servlet-mapping>
          <servlet-name>appServlet</servlet-name>
          <url-pattern>/</url-pattern>
      </servlet-mapping>
      
    </web-app>
    
    


  • 相关阅读:
    将aaaa替换成aaba 分类: python 小练习 2013-10-28 18:28 246人阅读 评论(0) 收藏
    使用生成器返回fibs列表 分类: python Module python基础学习 2013-10-28 18:19 283人阅读 评论(0) 收藏
    python中的生成器(generator) 分类: python Module python基础学习 2013-10-28 17:41 310人阅读 评论(0) 收藏
    遇到的问题总结 分类: 问题总结 2013-10-28 17:21 263人阅读 评论(0) 收藏
    win7 下安装ipython 分类: python基础学习 software 2013-10-19 12:23 1383人阅读 评论(0) 收藏
    获取函数中的参数 分类: 正则表达式 2013-10-16 15:14 221人阅读 评论(0) 收藏
    使用termcolor模块 分类: python Module 2013-10-12 14:06 459人阅读 评论(0) 收藏
    Mysql启动失败
    java-抽象类
    java三大特性--多态(1)
  • 原文地址:https://www.cnblogs.com/zhengwenqiang/p/6804616.html
Copyright © 2020-2023  润新知