日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring小知识——profile配置

發(fā)布時(shí)間:2025/3/19 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring小知识——profile配置 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • 引言
        • 介紹
        • Spring配置步驟如下
          • 第一步:編寫三個(gè)環(huán)境的Spring配置文件如下
          • 第二步:配置Spring的主配置文件
          • 第三步:編寫測(cè)試代碼
          • 第四步:報(bào)錯(cuò)原因分析
        • 總結(jié)

引言

工作中我們會(huì)遇到一些實(shí)際有關(guān)配置不同的情況,比如生產(chǎn)數(shù)據(jù)庫(kù)配置、開發(fā)環(huán)境數(shù)據(jù)庫(kù)配置、測(cè)試環(huán)境數(shù)據(jù)庫(kù)配置,還有一些特殊方法只需要開發(fā)環(huán)境執(zhí)行生產(chǎn)環(huán)境不需要執(zhí)行的。
這種情況的解決方式一般兩種:
1、使用maven打包方式不同,不同的環(huán)境使用不同的配置文件打包(常用)
2、使用Spring提供的profile配置,不同的環(huán)境使用不同的運(yùn)行參數(shù)。

介紹

筆者針對(duì)的是Spring提供的profile配置方式的介紹。
Springboot中實(shí)現(xiàn)Profile的配置如下

@Configuration @Profile("dev") public class DevelopmentProfileConfig{@Beanpublic UserInfo userInit(){return ......;} }

那么在我們使用的Spring中是如何配置的?筆者提供了以下的配置方式以供參考:

Spring配置步驟如下

第一步:編寫三個(gè)環(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"><!-- 手動(dòng)定義一個(gè)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"><!-- 手動(dòng)定義一個(gè)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="測(cè)試環(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"><!-- 手動(dòng)定義一個(gè)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,將三個(gè)環(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>
第三步:編寫測(cè)試代碼
/*** 針對(duì)Profile的測(cè)試*/@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();}

運(yùn)行單元測(cè)試,發(fā)現(xiàn)報(bào)錯(cuò)了

三月 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)
第四步:報(bào)錯(cuò)原因分析

通過報(bào)錯(cuò)的日志分析,我們報(bào)錯(cuò)的直接原因:org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userInfo' available
沒有找到這個(gè)bean對(duì)象。
根本原因是:Skipped XML bean definition file due to specified profiles [test] not matching: class path resource [applicationContext-mainTest.xml]
翻譯過來過來就是沒有找到匹配的profiles為test的文件。
產(chǎn)生這個(gè)錯(cuò)誤的原因是我們需要提前在環(huán)境變量中激活我們需要使用的配置文件

激活的配置的參數(shù)有兩個(gè):spring.profiles.default 和 spring.profiles.active

激活的方式有以下幾種

  • 在SpringMVC中作為DispatcherServlet的初始化參數(shù)
  • <servlet><servlet-name>myspringmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定spring配置文件的位置,如果不配置默認(rèn)/WEB-INF/[servlet-name]-servlet --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:myspringmvc-servlet.xml</param-value><param-name>spring.profiles.default</param-name><!-- 在這里激活dev的配置 --><param-value>dev</param-value></init-param><load-on-startup>1</load-on-startup></servlet>
  • 在Web應(yīng)用中作為應(yīng)用上下文參數(shù)
  • <context-param><param-name>spring.profiles.default</param-name><param-value>dev</param-value> </context-param>
  • 作為環(huán)境變量
  • 作為JVM的系統(tǒng)屬性

  • 最后附一下測(cè)試結(jié)果:
    spring.profiles.default=dev之后結(jié)果

    spring.profiles.default=prod之后結(jié)果

    總結(jié)

    使用Spring提供的profile配置可以讓不同環(huán)境使用不同的配置,本文也只是拋磚引玉給大家提供一種解題思路。本文介紹了spring.profiles.default其實(shí)還有spring.profiles.active ,后者的用法和前者類似,如果共同使用則以spring.profiles.active的配置優(yōu)先。
    測(cè)試結(jié)果也證明了以上說法:


    最后,筆者使用下面配置方式并未達(dá)到預(yù)期的效果,推測(cè)原因是bean初始化的時(shí)候已經(jīng)通過環(huán)境變量或者JVM參數(shù)完成了bean參數(shù)的初始化,在此之后如果再使用applicationContext.getEnvironment().setActiveProfiles("prod")修改的話,雖然能修改Profiles參數(shù),但是bean的初始化已經(jīng)完成了,因此這個(gè)時(shí)候獲取的bean仍然是修改之前的bean。

    ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(CLASS_PATH_RESOURCE);applicationContext.getEnvironment().setActiveProfiles("prod");

    總結(jié)

    以上是生活随笔為你收集整理的Spring小知识——profile配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。