首页 > 学院 > 开发设计 > 正文

【Spring 核心】高级装配

2019-11-08 01:57:23
字体:
来源:转载
供稿:网友

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

一、环境与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;@Configurationpublic 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>


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表