博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【译】Spring 4 @Profile注解示例
阅读量:5732 次
发布时间:2019-06-18

本文共 6124 字,大约阅读时间需要 20 分钟。

前言

译文链接:

本文将探索Spring中的@Profile注解,可以实现不同环境(开发、测试、部署等)使用不同的配置。同样,除了使用注解也会给出基于XML配置的示例作为对比。

假设你有一个应用涉及数据库交互,你可能希望在开发环境上使用mysql数据库,在生产环境上使用oracle数据库,那么使用Spring的Profiles,可以轻松达到这个目的,接下来我们将给出一个实例详细介绍这种情况。

涉及技术及开发工具

  • Spring 4.0.6.RELEASE
  • Maven 3
  • JDK 1.6
  • Eclipse JUNO Service Release 2

工程目录结构

步骤一:往pom.xml中添加依赖

4.0.0
com.websystique.spring
Spring4ProfilesExample
1.0.0
jar
Spring4ProfilesExample
4.0.6.RELEASE
org.springframework
spring-core
${springframework.version}
org.springframework
spring-context
${springframework.version}
org.springframework
spring-orm
${springframework.version}
org.apache.maven.plugins
maven-compiler-plugin
3.2
1.6
1.6

步骤二:创建Spring配置类

Spring配置类是指用@Configuration注解标注的类,这些类包含了用@Bean标注的方法。这些被@Bean标注的方法可以生成bean并交由spring容器管理。

package com.websystique.spring.configuration; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration; @Configuration@ComponentScan(basePackages = "com.websystique.spring")public class AppConfig {         @Autowired    public DataSource dataSource;      }

以上配置只有一个属性被自动注入,接下来我们将展示这个dataSource属性可以根据不同的环境(开发环境或生产环境)注入不同的bean。

package com.websystique.spring.configuration; import javax.sql.DataSource; public interface DatabaseConfig {     DataSource createDataSource();     }

一个简单的接口,可以被所有可能的环境配置实现

package com.websystique.spring.configuration; 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.DriverManagerDataSource; @Profile("Development")@Configurationpublic class DevDatabaseConfig implements DatabaseConfig {     @Override    @Bean    public DataSource createDataSource() {        System.out.println("Creating DEV database");        DriverManagerDataSource dataSource = new DriverManagerDataSource();        /*         * Set MySQL specific properties for Development Environment         */        return dataSource;    } }
package com.websystique.spring.configuration; 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.DriverManagerDataSource; @Profile("Production")@Configurationpublic class ProductionDatabaseConfig implements DatabaseConfig {     @Override    @Bean    public DataSource createDataSource() {        System.out.println("Creating Production database");        DriverManagerDataSource dataSource = new DriverManagerDataSource();        /*         * Set ORACLE specific properties for Production environment         */        return dataSource;    } }

以上两个配置类都实现了DatabaseConfig接口,特殊的地方在于它们都用@Profile标注。

被@Profile标注的组件只有当指定profile值匹配时才生效。

可以通过以下方式设置profile值:

1、设置spring.profiles.active属性(通过JVM参数、环境变量或者web.xml中的Servlet context参数)

2、ApplicationContext.getEnvironment().setActiveProfiles(“ProfileName”)

根据你的实际环境设置profile值,然后被profile标注(而且value=设置值)的bean才会被注册到spring容器。

步骤三:运行main方法测试

package com.websystique.spring; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class AppMain {         public static void main(String args[]){        AnnotationConfigApplicationContext  context = new AnnotationConfigApplicationContext();        //Sets the active profiles        context.getEnvironment().setActiveProfiles("Development");        //Scans the mentioned package[s] and register all the @Component available to Spring        context.scan("com.websystique.spring");         context.refresh();        context.close();    } }

注意以上代码,context.scan("com.websystique.spring")扫描到该包并开始注册所有被@Component标注的bean时,如果同时遇到被@Profile注解标注的bean时,会与profile值做比较,profile值匹配则注册到spring容器,否则直接跳过。

在我们这个例子中,DevDatabaseConfig会被注册到Spring容器中。

运行以上程序,结果如下:

Creating DEV database

附:基于XML的配置

替换DevelopmentDatabaseConfig配置为dev-config-context.xml (src/main/resources/dev-config-context.xml)

替换ProductionDatabaseConfig配置为prod-config-context.xml (src/main/resources/prod-config-context.xml)

替换AppConfig配置为app-config.xml (src/main/resources/app-config.xml)

根据实际的profile配置,相应的config-context.xml文件会被加载,其它的会被忽略。

最后,main方法如下:

package com.websystique.spring; import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext; public class AppMain {         public static void main(String args[]){        AbstractApplicationContext  context = new ClassPathXmlApplicationContext("app-config.xml");        //Sets the active profiles        context.getEnvironment().setActiveProfiles("Development");        /*         * Perform any logic here         */        context.close();    } }

运行程序,会得到相同的结果。

程序源码

 

转载于:https://www.cnblogs.com/chenpi/p/6213849.html

你可能感兴趣的文章
C++ 重写重载重定义区别
查看>>
C++多态之 虚函数实现机制
查看>>
微信Tinker的一切都在这里,包括源码(一)
查看>>
这些新的生物识别你肯定不知道
查看>>
外籍IT也埋怨。
查看>>
跑酷游戏_1
查看>>
美团闪回工具MyFlash
查看>>
MySQL 5.7 SQL MODE严格模式带来的影响
查看>>
最近架构随想
查看>>
WPF老矣,尚能饭否——且说说WPF今生未来(中):策略
查看>>
思科限速之QOS案例
查看>>
Vs2017 NPM 安装 部署
查看>>
<实战> 分析PermGen上存放的被Classloader所加载的类实践
查看>>
技术工坊|如何利用ERC875协议开发世界杯区块链门票?(北京)
查看>>
Django_4_视图
查看>>
Linux的netstat命令使用
查看>>
shell实例100例《五》
查看>>
lvm讲解,磁盘故障小案例
查看>>
24.5 saltstack远程执行命令
查看>>
配置IP
查看>>