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

一、环境与profile

1.开发环境下的profile

  1. package com.bonc.config;
  2.  
  3. import javax.sql.DataSource;
  4.  
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.context.annotation.Profile;
  8. import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
  9. import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
  10.  
  11. /*
  12. * 一、注解开发profile
  13. * @Profile作用在了类上,告诉Spring这个配置类中的bean只有在dev profile激活时才创建
  14. * dev profile没有被激活的话,@Bean的注解都会被忽略掉。
  15. *
  16. * Spring3.1中,只能在类级别上使用@Profile注解,在Spring3.2开始,
  17. * 你也可以在方法级别上使用@Profile注解,与@Bean注解一同使用,这样的话就能将两个bean放置到同一个配置类中。
  18. *
  19. * 尽管只有当规定的profile被激活时,相应的bean才会被创建,但是可能会有其他的bean并没有声明在一个给定的profile中。
  20. * 没有指定profile的bean始终都会被创建,与激活哪个profile没有关系。
  21. *
  22. *
  23. * */
  24.  
  25. @Configuration
  26. @Profile("dev")
  27. public class DevelopmentProfileConfig {
  28.  
  29. @Bean(destroyMethod="shutdown")
  30. public DataSource dataSource(){
  31. return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
  32. .addScript("classpath:schema.sql")
  33. .addScript("classpath:test.sql").build();
  34. }
  35. }

二、生产环境下profile

  1. package com.bonc.config;
  2.  
  3. import javax.sql.DataSource;
  4.  
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.context.annotation.Profile;
  8. import org.springframework.jndi.JndiObjectFactoryBean;
  9.  
  10. @Configuration
  11. @Profile("prod")
  12. public class ProductionProfileConfig {
  13.  
  14. @Bean
  15. public DataSource dataSource(){
  16. JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
  17. jndiObjectFactoryBean.setJndiName("jdbc/myDS");
  18. jndiObjectFactoryBean.setResourceRef(true);
  19. jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);
  20. return (DataSource) jndiObjectFactoryBean.getObject();
  21. }
  22. }

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

  1. package com.bonc.config;
  2.  
  3. import javax.sql.DataSource;
  4.  
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.context.annotation.Profile;
  8. import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
  9. import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
  10. import org.springframework.jndi.JndiObjectFactoryBean;
  11.  
  12. @Configuration
  13. public class DataSourceConfig {
  14.  
  15. @Bean(destroyMethod="shutdown")
  16. @Profile("dev")
  17. public DataSource embeddedDataSource(){
  18. return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
  19. .addScript("classpath:schema.sql")
  20. .addScript("classpath:test.sql").build();
  21. }
  22.  
  23. @Bean
  24. @Profile("prod")
  25. public DataSource jndiDataSource(){
  26. JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
  27. jndiObjectFactoryBean.setJndiName("jdbc/myDS");
  28. jndiObjectFactoryBean.setResourceRef(true);
  29. jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);
  30. return (DataSource) jndiObjectFactoryBean.getObject();
  31. }
  32. }

四、在XML配置各种环境

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:jdbc="http://www.springframework.org/schema/jdbc"
  5. xmlns:jee="http://www.springframework.org/schema/jee"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/jee
  8. http://www.springframework.org/schema/jee/spring-jee.xsd
  9. http://www.springframework.org/schema/jdbc
  10. http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
  11. http://www.springframework.org/schema/beans
  12. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
  13. <beans profile="dev">
  14. <jdbc:embedded-database>
  15. <jdbc:script location="classpath:schema.sql"/>
  16. <jdbc:script location="classpath:test-data.sql"/>
  17. </jdbc:embedded-database>
  18. </beans>
  19. <beans profile="qa">
  20. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"/>
  21. </beans>
  22. <beans profile="prod">
  23. <jee:jndi-lookup
  24. id="dataSource"
  25. jndi-name="jdbc/myDatabase"
  26. resource-ref="true"
  27. proxy-interface="javax.sql.DataSource"/>
  28. </beans>
  29. <!--
  30. 除了所有的bean定义到了同一个XML文件中,这种配置方式与定义在单独的XML文件中的实际效果是一样的。
  31. 这里有三个bean,类型都是javax.sql.DataSource,
  32. 并且ID都是dataSource。但是运行时,只会创建一个bean,这取决处于激活状态的是那个profile
  33. -->
  34. </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的初始化参数

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <display-name>spring learning</display-name>
  8. <context-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <param-value>/WEB-INF/spring/root-context.xml</param-value>
  11. </context-param>
  12. <context-param>
  13. <param-name>spring.profiles.default</param-name>
  14. <param-value>dev</param-value>
  15. </context-param>
  16. <listener>
  17. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  18. </listener>
  19.  
  20. <servlet>
  21. <servlet-name>appServlet</servlet-name>
  22. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  23. <init-param>
  24. <param-name>spring.profiles.default</param-name>
  25. <param-value>dev</param-value>
  26. </init-param>
  27. <load-on-startup>1</load-on-startup>
  28. </servlet>
  29.  
  30. <servlet-mapping>
  31. <servlet-name>appServlet</servlet-name>
  32. <url-pattern>/</url-pattern>
  33. </servlet-mapping>
  34.  
  35. </web-app>
  1.  

【Spring 核心】高级装配的更多相关文章

  1. 【Spring】高级装配

    前言 前面讲解了bean的核心装配技术,其可应付很多中装配情况,但Spring提供了高级装配技术,以此实现更为高级的bean装配功能. 高级装配 配置profile bean 将所有不同bean定义放 ...

  2. 【Spring 核心】装配bean(二) JavaConfig装配

    前面介绍完了组件扫描和自动装配,这里再来看一下装配bean的另一种方式JavaConfig. 包路径: src/main/java com.bonc-|--config--|--CDPlayerCon ...

  3. 【Spring 核心】装配bean(三)XML配置

    项目包结构: src/main/java com.bonc.pojo--|-CompactDisc.java (接口) |-SgtPeppers.java     (实现类 实现 CompactDis ...

  4. 【Spring 核心】装配Bean(一) 自动化装配

    Spring从两个角度实现自动化装配:组件扫描 (Spring自动发现应用上下文中所创建的bean)自动装配(autowiring)自动满足bean之间的依赖 组件扫描: package test.s ...

  5. Spring 之高级装配

    [环境与Profile] 暂略 [条件化的bean] 暂略 [处理自动装配歧义性] 暂略 [ bean 的作用域] 在 @Componen . @Bean 下以及 XML 中的声明方式如下所示, @C ...

  6. Spring高级装配

    Spring高级装配 目录 一.Profile(根据开发环境创建对应的bean) 二.条件化的创建bean(根据条件创建bean) 三.处理自动装配歧义性(指定首选bean.限定符限制bean) 四. ...

  7. Spring使用笔记(三) 高级装配

    高级装配 一.环境与Profile 一)配置profile bean 环境的改变导致配置改变(需求:通过环境决定使用哪个bean),可以通过Spring的Profile解决. Profile可以在程序 ...

  8. Spring高级装配(一) profile

    Spring高级装配要学习的内容包括: Spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 以上属于高级一点的bean装配技术,如果你没有啥 ...

  9. spring学习总结——高级装配学习二(处理自动装配的歧义性)

    我们已经看到如何使用自动装配让Spring完全负责将bean引用注入到构造参数和属性中.自动装配能够提供很大的帮助.不过,spring容器中仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不 ...

随机推荐

  1. HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题)

    HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题) Description T ...

  2. tomcat支持php

    最近做项目遇到了问题,服务器是用的tomcat,而有用到php,就想在tomcat下面可以运行php,步骤如下: 1.下载php压缩包解压或者用wamp/xampp 我下载的是wamp,用的里面的ph ...

  3. Gym 100952 D. Time to go back(杨辉三角形)

    D - Time to go back Gym - 100952D http://codeforces.com/gym/100952/problem/D D. Time to go back time ...

  4. 阿里云VPC绑定EIP实现SNAT

    阿里云VPC需要了解的几个问题 什么是VPC 虚拟私有网络(Virtual Private Network),能够帮助用户基于阿里云构建出一个隔离的网络环境.用户可以完全掌控自己的虚拟网络,包括选择自 ...

  5. docker - 修改镜像/容器文件的在宿主机上的存储位置(转)

    背景 之前在使用docker的时候,由于启动container的时候用的是默认的mount(路径为 /var/lib/docker),这个目录对应的硬盘空间有限,只有200G左右.现在随着程序运行,有 ...

  6. FreeRTOS——任务管理

    1. FreeRTOS 任务不允许以任何方式从实现函数中返回——他们绝不能有一条“return”语句,也不可能执行到函数的末尾.如果一个函数不需要,可以将其删除,如在任务中使用函数vTaskDelet ...

  7. mybaits错误解决:There is no getter for property named 'parentId ' in class 'java.lang.String'

    在使用mybaitis传参数的时候,如果仅传入一个类型为String的参数,那么在 xml文件中应该使用_parameter来代替参数名. 比如mapper中如下方法,只有一个String值 publ ...

  8. [C++ Calculator 项目] 初试

    Calculator V1.0 注:这是一个C++计算器项目的初始部分. 大体功能简介: 能够输入一串数学表达式 逐字符扫描,提取数字和符号得到一组队列 逐行输出提取的符号与数字 实现代码如下: sc ...

  9. 安装j2ee开发环境

    先安装jdk,再安装eclipse ,再安装myeclipse. eclipse与myeclipse必须在图形化界面安装. 1. 挂载光驱/硬盘 mount  /mnt/cdrom/    挂载光驱 ...

  10. RequireJs加载Codemirror,配合AngularJS的坑

    requireJS加载codemirror,并且配合angularJs一起使用的时候,高亮显示代码编辑器.要注意以下几点: 1:普通Js加载CodeMirror  代码如下: <!DOCTYPE ...