您好,登錄后才能下訂單哦!
小編給大家分享一下SpringMVC如何遷移到Springboot,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在將SpringMVC項目轉移到Springboot上的過程中,主要做了以下的事情
Profile配置
全局變量從properties文件讀入
數據源與Mybatis配置
日志文件配置
WebConfig配置(包括原有的web.xml和spring-mvc.xml)
去掉多余的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"格式,針對每個不同環境,例如:
application-pro.properties 表示預演環境
application-dev.properties 表示開發環境
application-test.properties 表示測試環境
當我們需要測試是否正常載入了profile的時候,可以在對應的.properties文件中寫入
server.port=9080
在啟動的時候就可以看到,是否已經啟動了這個端口。
在這里可以順便提一下Springboot加載配置文件的順序
home目錄下的devtools全局設置屬性( ~/.spring-boot-devtools.properties ,如果devtools激活)。
測試用例上的@TestPropertySource注解。
測試用例上的@SpringBootTest#properties注解。
命令行參數
來自 SPRING_APPLICATION_JSON 的屬性(環境變量或系統屬性中內嵌的內聯JSON)。
ServletConfig 初始化參數。
ServletContext 初始化參數。
來自于 java:comp/env 的JNDI屬性。
Java系統屬性(System.getProperties())。
操作系統環境變量。
RandomValuePropertySource,只包含 random.* 中的屬性。
沒有打進jar包的Profile-specific應用屬性( application-{profile}.properties 和YAML變量)。
打進jar包中的Profile-specific應用屬性( application-{profile}.properties 和YAML變量)。
沒有打進jar包的應用配置( application.properties 和YAML變量)。
打進jar包中的應用配置( application.properties 和YAML變量)。
@Configuration 類上的 @PropertySource 注解。
默認屬性(使用 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連接數據庫
首先要創建一個名為datasource的bean
然后將這個datasource裝配到SqlSessionFactory中
最后再將SqlSessionFactory裝配到MapperScannerConfigurer中
這一切都是在xml配置文件中配置的,比較繁瑣。在Springboot中會盡量去避免這樣子的xml配置。
Mybatis現在已經為Springboot提供了支持,我們只需要添加MyBatis-Spring-Boot-Starter這個依賴,它就會為我們去做好以下的事情:
自動檢測已有的datasource
創建一個SqlSessionFactoryBean的實例SqlSessionFactory,并將datasource裝配進去
創建一個SqlSessionTemplate的實例,并將SqlSessionFactory裝配進去
自動掃描你的mapper,將它們連接到SqlSessionTemplate,并將它們注冊到Spring的上下文,以便將它們注入到其他的bean中。
所以,在Springboot的Mybatis配置中,我們需要去做以下幾件事情:
在application-{profile}.properties中填入數據庫信息,例如:
spring.datasource.url=jdbc:oracle:thin:@//localhost:1234/example spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver spring.datasource.maxActive=10 spring.datasource.maxIdle=5 spring.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
例如:
@Mapper public 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/example log.root.level=INFO log.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. */ @Configuration public 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); } }
我寫的這個示例文件里面做了幾件事情:
引入一個XML的Http消息轉換器
引入multipartResolver
引入自定義的異常處理器
引入自定義攔截器
去掉多余的bean注入
這個算是一個題外話,但也是我實際遇到的問題之一。
在實際運行的Springboot項目的時候,我發現了一些在傳統Spring項目中沒有報錯的問題,就是多余的bean注入。
在傳統Spring項目中,這是沒有報錯的,但是在Springboot項目中就報錯了。我猜測是因為要注入bean的類方法名取的比較精簡的時候,與Springboot本身自動配置的一些bean重復了,就會報錯。
所以,把有些不需要注入的bean去掉吧。
以上是“SpringMVC如何遷移到Springboot”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。