国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

從SpringMVC遷移到Springboot的方法步驟

2024-07-13 10:16:09
字體:
來源:轉載
供稿:網友

在將SpringMVC項目轉移到Springboot上的過程中,主要做了以下的事情

  1. Profile配置
  2. 全局變量從properties文件讀入
  3. 數據源與Mybatis配置
  4. 日志文件配置
  5. WebConfig配置(包括原有的web.xml和spring-mvc.xml)
  6. 去掉多余的bean注入

本篇文章除了介紹做了些什么和怎么做之外,會多很多多余的廢話,關于對原理的一些探討,知其然也要知其所以然。

Profile配置

在傳統的Spring項目中,多個profile的配置方式首先是在pom.xml文件中寫入多個profile,再通過啟動項目前先執行一個maven文件來預加載選定的profile環境。加載完之后,執行項目的時候,會根據已加載的Environment,來決定去將哪個.properties文件load到全局變量中。

而在Springboot中對多個profile的管理就非常簡單了。

可以在jar包用命令行運行時選擇profile

java -jar example.jar --spring.profiles.active=test

或者在application.properties這個全局配置中配置

在application.properties中添加spring.profiles.active=test

以上兩種方法均可啟動“test"這個profile,前者在執行上的優先級要高于后者。

(順便一提,在Springboot里面,這兩種方式本質上都是用“外部化配置”的方式,來對Environment進行編輯和替換)

另外,每個獨立的profiles的配置方式為以"application-xxx.properties"格式,針對每個不同環境,例如:

  1. application-pro.properties 表示預演環境
  2. application-dev.properties 表示開發環境
  3. application-test.properties 表示測試環境

當我們需要測試是否正常載入了profile的時候,可以在對應的.properties文件中寫入

server.port=9080

在啟動的時候就可以看到,是否已經啟動了這個端口。

在這里可以順便提一下Springboot加載配置文件的順序

  1. home目錄下的devtools全局設置屬性( ~/.spring-boot-devtools.properties ,如果devtools激活)。
  2. 測試用例上的@TestPropertySource注解。
  3. 測試用例上的@SpringBootTest#properties注解。
  4. 命令行參數
  5. 來自 SPRING_APPLICATION_JSON 的屬性(環境變量或系統屬性中內嵌的內聯JSON)。
  6. ServletConfig 初始化參數。
  7. ServletContext 初始化參數。
  8. 來自于 java:comp/env 的JNDI屬性。
  9. Java系統屬性(System.getProperties())。
  10. 操作系統環境變量。
  11. RandomValuePropertySource,只包含 random.* 中的屬性。
  12. 沒有打進jar包的Profile-specific應用屬性( application-{profile}.properties 和YAML變量)。
  13. 打進jar包中的Profile-specific應用屬性( application-{profile}.properties 和YAML變量)。
  14. 沒有打進jar包的應用配置( application.properties 和YAML變量)。
  15. 打進jar包中的應用配置( application.properties 和YAML變量)。
  16. @Configuration 類上的 @PropertySource 注解。
  17. 默認屬性(使用 SpringApplication.setDefaultProperties 指定)。

全局變量從properties文件讀入

在上一面一小節寫了針對不同環境的properties配置,這里會寫關于如果將這些屬性寫入到全局變量中,方便后面其他地方直接調用。

/** * 全局變量 */public class Global { public static String examplePath; @Value("${example_path}")  public void setExamplePath(String example) {    Global.examplePath = examplePath;  }}

通過這樣子,我們便將.properties文件中的

example_path=http://localhost:9090

這個屬性讀到了全局變量中。

數據源與Mybatis配置

在傳統的Spring項目中,用Mybatis連接數據庫

  1. 首先要創建一個名為datasource的bean
  2. 然后將這個datasource裝配到SqlSessionFactory中
  3. 最后再將SqlSessionFactory裝配到MapperScannerConfigurer中

這一切都是在xml配置文件中配置的,比較繁瑣。在Springboot中會盡量去避免這樣子的xml配置。
Mybatis現在已經為Springboot提供了支持,我們只需要添加MyBatis-Spring-Boot-Starter這個依賴,它就會為我們去做好以下的事情:

  1. 自動檢測已有的datasource
  2. 創建一個SqlSessionFactoryBean的實例SqlSessionFactory,并將datasource裝配進去
  3. 創建一個SqlSessionTemplate的實例,并將SqlSessionFactory裝配進去
  4. 自動掃描你的mapper,將它們連接到SqlSessionTemplate,并將它們注冊到Spring的上下文,以便將它們注入到其他的bean中。

所以,在Springboot的Mybatis配置中,我們需要去做以下幾件事情:

在application-{profile}.properties中填入數據庫信息,例如:

spring.datasource.url=jdbc:oracle:thin:@//localhost:1234/examplespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriverspring.datasource.maxActive=10spring.datasource.maxIdle=5spring.datasource.maxWait=-1

通過這種方式,我們便在Spring上下文中注冊了datasource這個bean。

創建一個MybatisConfig文件,用java的方式取代xml:

/** * Created by WuTaoyu on 2017/12/7. */@Configuration@EnableTransactionManagement@MapperScan("com.example.db.dao")public class MybatisConfig {  @Autowired  private DataSource dataSource;  @Bean(name = "sqlSessionFactory")  public SqlSessionFactory sqlSessionFactoryBean() {    SqlSessionFactoryBean sqlsession = new SqlSessionFactoryBean();    sqlsession.setDataSource(dataSource);    try {      //添加XML目錄      ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();      sqlsession.setMapperLocations(resolver.getResources("classpath:mapping/*.xml"));      return sqlsession.getObject();    } catch (Exception e) {      e.printStackTrace();      throw new RuntimeException(e);    }  }  @Bean  public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {    return new SqlSessionTemplate(sqlSessionFactory);  }  @Bean  public PlatformTransactionManager annotationDrivenTransactionManager() {    return new DataSourceTransactionManager(dataSource);  }  @Bean(name = "exampleSequence")  public OracleSequenceMaxValueIncrementer exampleSequenceBean(){    OracleSequenceMaxValueIncrementer exampleSequence = new OracleSequenceMaxValueIncrementer();    exampleSequence.setIncrementerName("EXAMPLE_SEQ");    exampleSequence.setDataSource(dataSource);    return exampleSequence;  }}

@MapperScan是掃描這個包下面的mapper。

另外這里mapper.xml的位置,是在resource文件夾下面建了一個mapping文件夾,放在下面。

這里的作用跟XML比較類似,是將傳統的xml表達方式用.java文件來描述出來,本質上還是將datasource一步步注入。

由于示例用的是oracle數據庫,所以最后一個exampleSequence是示范如何添加序列。

對所有mapper的interface注解@Mapper

例如:

@Mapperpublic interface UserMapper { ...}

日志文件配置

Logback支持用properties的方式外部化配置,但是對于比較細的配置來說,還是要沿用xml配置。

為了讓xml文件從.properties文件讀取一些路徑之類可能需要經常修改的靜態配置,需要在logback-spring.xml中配置

 <property resource="application.properties" />  <property name="log.root.level" value="${log.root.level}" />  <property name="log.path" value="${log.path}" />  <property name="log.moduleName" value="${log.module}" />

這樣子就可以將application.properties文件中的

log.path=/home/logs/examplelog.root.level=INFOlog.module=example

讀入到logback-spring.xml中,然后再去調用。

WebConfig配置

WebConfig的主要作用是替代web.xml和spring-mvc.xml進行一些基礎配置。

1、關于web.xml

傳統的Spring項目都有配置一個web.xml文件,這個文件的作用是:當我們把war包放入應用容器(例如tomcat)中運行時,容器會根據web.xml去加載filter(過濾器)、servlet、error-page、welcome-file-list、listener(監聽器)、context-param(上下文參數)、resource-ref(資源配置)等配置。

包括ContextLoaderListener這個監聽器,就是在這里加載進去,用于在啟動容器的時候,自動裝配ApplicationContext的配置信息。

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

這個ApplicationContext是Spring IOC的核心(繼承自BeanFactory),所有單例的Bean會在這個時候就被實例化。
以及,SpringMVC中很重要的一個DispatcherServlet也是在這里加載進去,并制定根據哪個xml文件來配置DispatcherServlet。

<servlet>    <servlet-name>SpringMVC</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:spring-mvc.xml</param-value>    </init-param>    <load-on-startup>1</load-on-startup>    <!--<async-supported>true</async-supported>--></servlet>

2、關于spring-mvc.xml

spring-mvc.xml是SpringMVC的配置文件,在這里可以配置我們引入的、需要定制化的bean,例如ViewResolver、multipartResolver、HTTP消息轉換器、自定義的攔截器等等。

以上都與Springboot無關,主要是為了知其然也知其所以然,如果不感興趣的可以不看。

再講回Springboot的配置。Springboot有一個說法叫“約定優于配置”,就是盡量用約定的方式,而不是特地去針對性地配置(需要特殊配置的時候再去配置)。

引入spring-boot-starter-web這個“開箱即用”的依賴之后,spring-boot-starter-web下包含了一個spring-boot-autoconfigure。
有了這個依賴之后,就可以使用@EnableAutoCongiguration注解。這個注解就會根據引入的依賴來猜測你需要的Spring配置并幫你配置好。因為已經引入了spring-boot-starter-web的話,這個注解就會將web相關的配置配置好。

另外,@SpringBootApplication這個注解中已經包含了@EnableAutoCongiguration注解。所以只要在啟動類ExampleServerApplication上注解@SpringBootApplication就可以自動把web配置給配置好了。

當然,我們可能還有一些特殊的配置,這時候就可以創建一個WebConfig去定制

/** * Created by WuTaoyu on 2017/12/8. */@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {  @Override  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {    converters.add(marshallingHttpMessageConverter());  }  public MarshallingHttpMessageConverter marshallingHttpMessageConverter(){    MarshallingHttpMessageConverter marshallingHttpMessageConverter = new MarshallingHttpMessageConverter();    List<MediaType> mediaTypes = new ArrayList<MediaType>();    mediaTypes.add(MediaType.TEXT_XML);    mediaTypes.add(MediaType.APPLICATION_XML);    XStreamMarshaller xStreamMarshaller=new XStreamMarshaller();    marshallingHttpMessageConverter.setSupportedMediaTypes(mediaTypes);    marshallingHttpMessageConverter.setMarshaller(xStreamMarshaller);    marshallingHttpMessageConverter.setUnmarshaller(xStreamMarshaller);    return marshallingHttpMessageConverter;  }  //配置文件上傳  @Bean(name = {"multipartResolver"})  public MultipartResolver multipartResolver(){    CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver();    commonsMultipartResolver.setDefaultEncoding("utf-8");    commonsMultipartResolver.setMaxUploadSize(10485760000L);    commonsMultipartResolver.setMaxInMemorySize(40960);    return commonsMultipartResolver;  }  //異常處理  @Bean  public ExceptionHandler exceptionResolver(){    ExceptionHandler exceptionHandler = new ExceptionHandler();    return exceptionHandler;  }  //攔截器  @Override  public void addInterceptors(InterceptorRegistry registry){    registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**");    super.addInterceptors(registry);  }}

我寫的這個示例文件里面做了幾件事情:

  1. 引入一個XML的Http消息轉換器
  2. 引入multipartResolver
  3. 引入自定義的異常處理器
  4. 引入自定義攔截器

去掉多余的bean注入

這個算是一個題外話,但也是我實際遇到的問題之一。

在實際運行的Springboot項目的時候,我發現了一些在傳統Spring項目中沒有報錯的問題,就是多余的bean注入。

在傳統Spring項目中,這是沒有報錯的,但是在Springboot項目中就報錯了。我猜測是因為要注入bean的類方法名取的比較精簡的時候,與Springboot本身自動配置的一些bean重復了,就會報錯。

所以,把有些不需要注入的bean去掉吧。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳西县| 临泽县| 绥中县| 余姚市| 中方县| 新化县| 万荣县| 黑山县| 天峻县| 博乐市| 江口县| 新丰县| 白山市| 南华县| 仁化县| 镇远县| 诸暨市| 子洲县| 和静县| 鹤岗市| 金堂县| 景洪市| 师宗县| 侯马市| 衡山县| 遵义县| 从江县| 天长市| 舟山市| 阿克苏市| 木里| 兴山县| 塔河县| 抚松县| 昂仁县| 娄烦县| 全南县| 金阳县| 会泽县| 辛集市| 崇礼县|