spring aop示例_Spring Profile模式示例

spring aop示例

最近,我们介绍了Spring Profiles的概念。

此概念是针对不同部署环境的轻松配置区分符。

直接的用例(已提出)是对相关的类进行注释,以便Spring根据活动的配置文件加载适当的类。

但是,这种方法可能并不总是适用于常见的用例……通常,配置密钥是相同的,并且每个值只会随环境而变化。

在本文中,我想提出一种模式来支持按环境加载配置数据, 无需为每个概要文件(即针对每个环境)创建/维护多个类。

在整个文章中,假设每个部署环境的数据库定义(例如用户名或连接URL)不同,我将以数据库连接配置为例。

主要思想是使用一个类来加载配置(即,一个类用于DB连接定义),然后将适当的实例注入其中,以保存正确的概要文件配置数据。

为了方便和清楚起见,该过程分为三个阶段:

阶段1 :基础设施
步骤1.1 –创建一个包含所有配置数据的属性文件
步骤1.2 –为每个配置文件创建注释 步骤1.3 –确保在上下文加载期间加载了配置文件

阶段2 :实施配置文件模式
步骤2.1 –创建属性界面
步骤2.2 –为每个配置文件创建一个类 步骤2.3 –创建一个包含所有数据的抽象文件

阶段3 :使用模式
步骤3.1 –使用模式的示例

弹簧轮廓图–阶段1:基础准备

此阶段将建立使用Spring Profile和配置文件的初始基础设施。

步骤1.1 –创建一个包含所有配置数据的属性文件

假设您有一个maven风格的项目,请在src / main / resources / properties中为每个环境创建一个文件,例如:

my_company_dev.properties
my_company_test.properties
my_company_production.properties

my_company_dev.properties内容的示例:

jdbc.url = jdbc:mysql:// localhost:3306 / my_project_db
db.username = dev1
db.password = dev1 hibernate.show_sql = true

my_company_production.properties内容的示例:

jdbc.url = jdbc:mysql://10.26.26.26:3306 / my_project_db
db.username = prod1
db.password = fdasjkladsof8aualwnlulw344uwj9l34 hibernate.show_sql = false

步骤1.2 –为每个配置文件创建注释

在src.main.java.com.mycompany.annotation中为每个Profile创建注释,例如:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Profile("DEV")
public @interface Dev {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Profile("PRODUCTION")
public @interface Production {
}

为每个配置文件创建一个枚举:
公共接口MyEnums {

public enum Profile{
DEV,
TEST,
PRODUCTION
}

步骤1.3 –确保在上下文加载期间加载了配置文件

  • 定义一个系统变量以指示代码在哪个环境中运行。
    在Tomcat中,转到$ {tomcat.di} /conf/catalina.properties并插入一行:
    profile = DEV(根据您的环境)
  • 定义一个类来设置活动配置文件
    public class ConfigurableApplicationContextInitializer implementsApplicationContextInitializer<configurableapplicationcontext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {String profile = System.getProperty("profile");if (profile==null || profile.equalsIgnoreCase(Profile.DEV.name())){applicationContext.getEnvironment().setActiveProfiles(Profile.DEV.name());   }else if(profile.equalsIgnoreCase(Profile.PRODUCTION.name())){applicationContext.getEnvironment().setActiveProfiles(Profile.PRODUCTION.name()); }else if(profile.equalsIgnoreCase(Profile.TEST.name())){applicationContext.getEnvironment().setActiveProfiles(Profile.TEST.name()); }}
    }
  • 确保在上下文加载期间加载了该类
    在项目web.xml中,插入以下内容:
    <context-param><param-name>contextInitializerClasses</param-name><param-value>com.matomy.conf.ConfigurableApplicationContextInitializer</param-value>
    </context-param>

阶段2:实施配置文件模式

此阶段利用我们之前构建的基础架构并实现配置文件模式。

步骤2.1 –创建属性界面
为您拥有的配置数据创建一个接口。
在我们的情况下,该接口将提供对四个配置数据项的访问。 所以看起来像这样:

public interface SystemStrings {String getJdbcUrl();
String getDBUsername();
String getDBPassword();
Boolean getHibernateShowSQL();
//.....

步骤2.2 –为每个配置文件创建一个类

开发配置文件示例:

@Dev //Notice the dev annotation
@Component("systemStrings")
public class SystemStringsDevImpl extends AbstractSystemStrings implements SystemStrings{public SystemStringsDevImpl() throws IOException {//indication on the relevant properties filesuper("/properties/my_company_dev.properties");} 
}

生产资料示例:

@Prouction //Notice the production annotation
@Component("systemStrings")
public class SystemStringsProductionImpl extends AbstractSystemStrings implements SystemStrings{public SystemStringsProductionImpl() throws IOException {//indication on the relevant properties filesuper("/properties/my_company_production.properties");} 
}

上面的两个类是属性文件与相关环境之间进行绑定的位置。

您可能已经注意到,这些类扩展了一个抽象类。 这项技术很有用,因此我们不需要为每个Profile定义每个getter,从长远来看,这是无法管理的,实际上,这样做是没有意义的。

蜜糖和蜂蜜位于下一步,其中定义了抽象类。

步骤2.3 –创建一个包含所有数据的抽象文件

public abstract class AbstractSystemStrings implements SystemStrings{//Variables as in configuration properties file
private String jdbcUrl;
private String dBUsername;
private String dBPassword;
private boolean hibernateShowSQL;public AbstractSystemStrings(String activePropertiesFile) throws IOException {//option to override project configuration from externalFileloadConfigurationFromExternalFile();//optional..//load relevant propertiesloadProjectConfigurationPerEnvironment(activePropertiesFile);  }private void loadProjectConfigurationPerEnvironment(String activePropertiesFile) throws IOException {Resource[] resources = new ClassPathResource[ ]  {  new ClassPathResource( activePropertiesFile ) };Properties props = null;props = PropertiesLoaderUtils.loadProperties(resources[0]);jdbcUrl = props.getProperty("jdbc.url");dBUsername = props.getProperty("db.username"); dBPassword = props.getProperty("db.password");hibernateShowSQL = new Boolean(props.getProperty("hibernate.show_sql"));  
}//here should come the interface getters....

阶段3:使用模式

您可能还记得,在前面的步骤中,我们定义了一个配置数据接口。

现在,我们将在需要每个环境不同数据的类中使用该接口

请注意,该示例是与Spring博客中给出的示例的主要区别,因为现在我们不需要为每个概要文件创建一个类 ,因为在这种情况下,我们在概要文件中使用相同的方法并且仅改变数据

步骤3.1 –使用模式的示例

@Configuration
@EnableTransactionManagement
//DB connection configuration class 
//(don't tell me you're still using xml... ;-)
public class PersistenceConfig {@Autowiredprivate SystemStrings systemStrings; //Spring will wire by active profile@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactoryNg(){LocalContainerEntityManagerFactoryBean factoryBean= new LocalContainerEntityManagerFactoryBean();factoryBean.setDataSource( dataSource() );factoryBean.setPersistenceUnitName("my_pu");       JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(){{// JPA propertiesthis.setDatabase( Database.MYSQL);
this.setDatabasePlatform("org.hibernate.dialect.MySQLDialect");this.setShowSql(systemStrings.getShowSqlMngHibernate());//is set per environemnt..           }};       factoryBean.setJpaVendorAdapter( vendorAdapter );factoryBean.setJpaProperties( additionalProperties() );return factoryBean;}
//...
@Beanpublic ComboPooledDataSource dataSource(){ComboPooledDataSource poolDataSource = new ComboPooledDataSource();try {poolDataSource.setDriverClass( systemStrings.getDriverClassNameMngHibernate() );} catch (PropertyVetoException e) {e.printStackTrace();}       //is set per environemnt..poolDataSource.setJdbcUrl(systemStrings.getJdbcUrl());poolDataSource.setUser( systemStrings.getDBUsername() );poolDataSource.setPassword( systemStrings.getDBPassword() );//.. more properties...       return poolDataSource;}
}

我将不胜感激和改进。
请享用!

参考:来自我们JCG合作伙伴 Gal Levinsky的Spring Profile模式,来自Gal Levinsky的博客博客。


翻译自: https://www.javacodegeeks.com/2012/08/spring-profile-pattern-example_7.html

spring aop示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何提高学习效率?

学习效率 目录 介绍如何提高规律展开介绍如何提高规律展开编辑本段介绍 学习效率对中学生的重要性无须在此多言。提高孩子的学习效率是每个老师的心愿&#xff0c;更是学生及其家长的追求目标。学习兴趣、学习能力和学习效率三者是和谐统一的辩证关系&#xff0c;将这三项标准严…

基于Matlab/Simulink不平衡电网工况下级联H桥光伏并网逆变器仿真模型

本次更新的内容为级联H桥光伏并网逆变器相关的控制&#xff0c;后面会针对储能系统在级联H桥拓扑上的应用进行分享。由于传统发电造成的环境污染问题和光伏电池板价格持续创新低&#xff0c;太阳能从众多种类的可再生能源中拔地而起&#xff0c;因而光伏逆变器成为国内外学者和…

MATLAB格式化字符串

sprintf(%s City %d Quarter,str,i);

“速课小龙”项目冲刺3

第三天 日期&#xff1a;2018/6/15 一.今日完成任务情况及遇到的问题 姓名完成情况遇到的问题解决方法邓旭 通过对昨天的知识进行再学习&#xff0c;已经能进行文件上传。并且开始着手于出题模块。 今天着手只是模型的基础层搭建&#xff0c;所以难度相对较少。未有问题解决陈逸…

Java和Lagom的CQRS

我很高兴在Chicago Java User Group上进行了讨论&#xff0c;并讨论了Lagom如何实现CQRS&#xff08;命令查询责任隔离模式&#xff09;。 值得庆幸的是&#xff0c;有一个录音&#xff0c;我还把这些幻灯片发布在slideshare上 。 抽象&#xff1a; 一旦应用程序变得相当复杂…

matlab字符串处理

matlab字符串处理 %字符串处理 a= a;b=b b;c=cccc;m= length(a);%获取字符串长度 str = [str1,str2];%无缝连接两个字符串 d=strcat(a,c);%连接两个字符串,每个字符串最右边的空格被裁切 e=strvcat(a,b,m);%连接多行字符串,每行长度可不等,自动把非最长字符串最右边补空…

一天最好学习时间

一天中各个时段的学习状态k 时间状态适合做的事情 6、 7点机体休息完毕并进入如兴奋状态&#xff0c;肝脏已将体内的毒素全部排净&#xff0c;头脑清醒&#xff0c;大脑记忆力强。 第一次最佳记忆期8、9点 神经兴奋性提高&#xff0c;记忆仍保持最佳状态&#xff0c;心…

PAT 之 A+B和C

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard 题目描述 给定区间 [-2的31次方, 2的31次方] 内的3个整数 A、B 和 C&#xff0c;请判断 AB 是否大于 C。 输入描述 输入第1行给出正整数T(<10)&#xff0c;是测试用例的个数。随后给出T组测试用例…

使用Spring boot,Thymeleaf,AngularJS从零开始构建新的Web应用程序-第2部分

在本系列博客中&#xff0c;我们将使用Springboot&#xff0c;Angular等构建完整的Web应用程序。 在上一个博客中&#xff0c;我们与Thymeleaf建立了基本的登录页面。 在此博客中&#xff0c;我们将介绍bower &#xff0c;它用于管理前端依赖项&#xff0c;例如CSS&#xff0c…

MATLAB字符串和ASCII码的转换

字符串转ASCII码&#xff1a;abs&#xff0c;如&#xff1a;abs(a);abs(what);ASCII码转字符串&#xff1a;char&#xff0c;如&#xff1a;char(97);char([97,98,99]);

怎么样开会才有效果?

SAP项目实施过程中&#xff0c;难免不了要开不少的会议&#xff0c;无论是最前期的选型&#xff0c;还是商谈&#xff0c;乃至后面上线评审都免不了将很多项目干系人聚在一起就出现的问题或大家关心的问题摆在台面上做探讨。但只要你开过大会议你就会知道很多时候开会纯粹是为了…

一天中的最佳学习时间

一天中的最佳学习时间   一个人在一天的不同时期&#xff0c;大脑活动的效率是不同的&#xff0c;学习时间的最佳选择应该是一天中大脑最清醒的时侯。   生理学家研究认为&#xff0c;一天之内有4个学习的高效期。如果你使用得当&#xff0c;可以轻松自如地掌握、消化、巩…

MATLAB字符串数组中查找指定子串

1. strfindFind one string within another Syntaxk strfind(str, pattern)&#xff1b; k strfind(cellstr, pattern)&#xff1b;2. 如果使用的cell并且比较麻烦&#xff0c;可以自己写查找函数id zeros(0,1); for i1:size(txt,1)if strcmp(txt{i},str)id(end1) i;end en…

网络15软工个人作业5——软件工程总结

一、请回望开学时的第一次作业&#xff0c;你对于软件工程课程的想象 1. 对比开篇博客你对课程目标和期待&#xff0c;“希望通过实践锻炼&#xff0c;增强计算机专业的能力和就业竞争力”&#xff0c;对比目前的所学所练所得&#xff0c;在哪些方面达到了你的期待和目标&#…

喷喷计算机语言掌握的程度

简历或招聘经常会说以下几个词&#xff1a; 了解&#xff0c;掌握&#xff0c;熟练&#xff0c;精通 上面这四个词&#xff0c;各有各的说法。这里我也就先说说我的看法&#xff0c;欢迎大家跟水。不指望统一&#xff0c;但讨论中会加深各位对上述4个词的影响。也省得小朋友各个…

MATLAB字符串转换函数

abs&#xff1a;把串译成ASCII码 char&#xff1a;任何类型转换成串 double&#xff1a;任意类型转换成双精度数值 fprintf&#xff1a;格式化数据写到文件或屏幕 sprintf&#xff1a;以控制格式把数值转换为串 sscanf&#xff1a;在格式控制下把串转换成数 setstr&#…

eclipselink_EclipseLink MOXy作为JAXB提供者

eclipselinkEclipseLink MOXy是JAXB提供程序&#xff0c;并且是内置在JDK中的默认JAXB提供程序的引人注目的替代品。 首先是一个简单的测试&#xff0c;将Java对象编组为XML&#xff1a; 这是模型&#xff1a; XmlRootElement(nameMemberDetailsRequest, namespacehttp://bk.…

dijkstra算法学习

dijkstra算法学习 一、最短路径 单源最短路径&#xff1a;计算源点到其他各顶点的最短路径的长度 全局最短路径&#xff1a;图中任意两点的最短路径 Dijkstra、Bellman-Ford、SPFA求单源最短路径 Floyed可以求全局最短路径&#xff0c;但是效率比较低 SPFA算法是Bellman-Ford算…

+++程序员高手修炼之路

正在做Andy Hunt和David Thomas的《程序员修炼之路》英文注释版&#xff08;The Pragmatic Programmer&#xff09;的最后审稿工作。 这本书虽然很早就读过一些&#xff0c;但现在再读&#xff0c;仍然暗暗称奇。作者一定是在长期工作中养成了记笔记的习惯&#xff0c;才能写出…

MATLAB字符转数据

fstr2num(0.00682329)fstr2double(s)