javascript
Spring小知识——profile配置
文章目錄
- 引言
- 介紹
- Spring配置步驟如下
- 第一步:編寫三個環(huán)境的Spring配置文件如下
- 第二步:配置Spring的主配置文件
- 第三步:編寫測試代碼
- 第四步:報錯原因分析
- 總結(jié)
引言
工作中我們會遇到一些實際有關(guān)配置不同的情況,比如生產(chǎn)數(shù)據(jù)庫配置、開發(fā)環(huán)境數(shù)據(jù)庫配置、測試環(huán)境數(shù)據(jù)庫配置,還有一些特殊方法只需要開發(fā)環(huán)境執(zhí)行生產(chǎn)環(huán)境不需要執(zhí)行的。
這種情況的解決方式一般兩種:
1、使用maven打包方式不同,不同的環(huán)境使用不同的配置文件打包(常用)
2、使用Spring提供的profile配置,不同的環(huán)境使用不同的運行參數(shù)。
介紹
筆者針對的是Spring提供的profile配置方式的介紹。
Springboot中實現(xiàn)Profile的配置如下
那么在我們使用的Spring中是如何配置的?筆者提供了以下的配置方式以供參考:
Spring配置步驟如下
第一步:編寫三個環(huán)境的Spring配置文件如下
applicationContest-dev.xml 配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd"><!-- 手動定義一個bean --><bean id="userInfo" name="userInfo2" class="com.leo.model.UserInfo" init-method="myInit"destroy-method="myDestroy"><property name="id" value="2"></property><property name="name" value="開發(fā)環(huán)境配置"></property><property name="age" value="18"></property></bean> </beans>applicationContest-dev.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd"><!-- 手動定義一個bean --><bean id="userInfo" name="userInfo2" class="com.leo.model.UserInfo" init-method="myInit"destroy-method="myDestroy"><property name="id" value="2"></property><property name="name" value="測試環(huán)境配置"></property><property name="age" value="18"></property></bean> </beans>applicationContest-prod.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd"><!-- 手動定義一個bean --><bean id="userInfo" name="userInfo2" class="com.leo.model.UserInfo" init-method="myInit"destroy-method="myDestroy"><property name="id" value="2"></property><property name="name" value="生產(chǎn)環(huán)境配置"></property><property name="age" value="18"></property></bean> </beans>第二步:配置Spring的主配置文件
配置applicationContest-mainTest.xml,將三個環(huán)境的配置文件引入
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd"><beans profile="test"><import resource="applicationContext-test.xml"></import></beans><beans profile="prod"><import resource="applicationContext-prod.xml"></import></beans><beans profile="dev"><import resource="applicationContext-dev.xml"></import></beans> </beans>第三步:編寫測試代碼
/*** 針對Profile的測試*/@Testpublic void profileTest() throws InterruptedException {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(CLASS_PATH_RESOURCE);UserInfo userInfo = (UserInfo) applicationContext.getBean("userInfo");System.out.println(userInfo);TimeUnit.SECONDS.sleep(3);applicationContext.registerShutdownHook();}運行單元測試,發(fā)現(xiàn)報錯了
三月 01, 2020 1:23:18 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6c629d6e: startup date [Sun Mar 01 13:23:18 CST 2020]; root of context hierarchy "D:\Program Files\Java\jdk1.8.0_45\bin\java" -ea -Didea.launcher.port=7532 "-Didea.launcher.bin.path=D:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0.2\lib\idea_rt.jar;D:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0.2\plugins\junit\lib\junit-rt.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\zipfs.jar;E:\WorkSpace\Git\spring-framework-learning-example\chapter-4-springmvc-sourcecode-analysis\target\test-classes;E:\WorkSpace\Git\spring-framework-learning-example\chapter-4-springmvc-sourcecode-analysis\target\classes;D:\Library\maven\repository\junit\junit\4.12\junit-4.12.jar;D:\Library\maven\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Library\maven\repository\org\springframework\spring-webmvc\4.3.25.RELEASE\spring-webmvc-4.3.25.RELEASE.jar;D:\Library\maven\repository\org\springframework\spring-aop\4.3.25.RELEASE\spring-aop-4.3.25.RELEASE.jar;D:\Library\maven\repository\org\springframework\spring-beans\4.3.25.RELEASE\spring-beans-4.3.25.RELEASE.jar;D:\Library\maven\repository\org\springframework\spring-context\4.3.25.RELEASE\spring-context-4.3.25.RELEASE.jar;D:\Library\maven\repository\org\springframework\spring-core\4.3.25.RELEASE\spring-core-4.3.25.RELEASE.jar;D:\Library\maven\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\Library\maven\repository\org\springframework\spring-expression\4.3.25.RELEASE\spring-expression-4.3.25.RELEASE.jar;D:\Library\maven\repository\org\springframework\spring-web\4.3.25.RELEASE\spring-web-4.3.25.RELEASE.jar;D:\Library\maven\repository\javax\servlet\javax.servlet-api\3.0.1\javax.servlet-api-3.0.1.jar;D:\Library\maven\repository\javax\servlet\jsp\jsp-api\2.2\jsp-api-2.2.jar;D:\Library\maven\repository\org\springframework\spring-test\4.3.25.RELEASE\spring-test-4.3.25.RELEASE.jar;D:\Library\maven\repository\org\aspectj\aspectjrt\1.8.9\aspectjrt-1.8.9.jar;D:\Library\maven\repository\org\aspectj\aspectjweaver\1.8.9\aspectjweaver-1.8.9.jar" com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 BeanTest,profileTest 三月 01, 2020 1:23:18 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6c629d6e: startup date [Sun Mar 01 13:23:18 CST 2020]; root of context hierarchy 三月 01, 2020 1:23:18 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [applicationContext-mainTest.xml] 三月 01, 2020 1:23:19 下午 org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader doRegisterBeanDefinitions 信息: Skipped XML bean definition file due to specified profiles [test] not matching: class path resource [applicationContext-mainTest.xml] 三月 01, 2020 1:23:19 下午 org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader doRegisterBeanDefinitions 信息: Skipped XML bean definition file due to specified profiles [prod] not matching: class path resource [applicationContext-mainTest.xml] 三月 01, 2020 1:23:19 下午 org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader doRegisterBeanDefinitions 信息: Skipped XML bean definition file due to specified profiles [dev] not matching: class path resource [applicationContext-mainTest.xml]org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userInfo' availableat org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:682)at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1218)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1082)at BeanTest.profileTest(BeanTest.java:39)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)第四步:報錯原因分析
通過報錯的日志分析,我們報錯的直接原因:org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userInfo' available
沒有找到這個bean對象。
根本原因是:Skipped XML bean definition file due to specified profiles [test] not matching: class path resource [applicationContext-mainTest.xml]
翻譯過來過來就是沒有找到匹配的profiles為test的文件。
產(chǎn)生這個錯誤的原因是我們需要提前在環(huán)境變量中激活我們需要使用的配置文件
激活的配置的參數(shù)有兩個:spring.profiles.default 和 spring.profiles.active
激活的方式有以下幾種
最后附一下測試結(jié)果:
spring.profiles.default=dev之后結(jié)果
spring.profiles.default=prod之后結(jié)果
總結(jié)
使用Spring提供的profile配置可以讓不同環(huán)境使用不同的配置,本文也只是拋磚引玉給大家提供一種解題思路。本文介紹了spring.profiles.default其實還有spring.profiles.active ,后者的用法和前者類似,如果共同使用則以spring.profiles.active的配置優(yōu)先。
測試結(jié)果也證明了以上說法:
最后,筆者使用下面配置方式并未達(dá)到預(yù)期的效果,推測原因是bean初始化的時候已經(jīng)通過環(huán)境變量或者JVM參數(shù)完成了bean參數(shù)的初始化,在此之后如果再使用applicationContext.getEnvironment().setActiveProfiles("prod")修改的話,雖然能修改Profiles參數(shù),但是bean的初始化已經(jīng)完成了,因此這個時候獲取的bean仍然是修改之前的bean。
總結(jié)
以上是生活随笔為你收集整理的Spring小知识——profile配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring源码分析——Bean的生命周
- 下一篇: java位于算——一个测试搞懂位运算