springboot可以說是為了適用SOA服務出現,一方面,極大的簡便了配置,加速了開發速度;第二方面,也是一個嵌入式的web服務,通過jar包運行就是一個web服務;
還有提供了很多metric,info等度量的初級接口,可以用於監控項目的情況。
以下,將會分三部分,總結springboot的整合:
1,springboot的搭建
2,springboot的默認配置原理
3,springmvc向springboot遷移,整合,基於(app后台框架搭建三)
==================================================================
1,springboot的搭建
我使用的idea是intellij,用intellij搭建springboot 很簡單,如果使用eclipse也應該很簡單,自己網上搜索教程就用了。但建議最好用intellij,確實功能強大很大。
創建第一個springboot項目:
選擇spring initializr 然后選擇下一步,spring cloudy項目是跟springboot緊密連在一起的,所以spring cloudy項目也可以這樣搭建,只要引入相應的包就可以了。
設置包名,然后下一步:
選擇依賴的包:
thymeleaf 模板引擎是springboot 推薦的,也是一個java視圖模板,可是我個人不太喜歡,因為它是html嚴格模式的,例如input標簽缺少一個 </input> 也會各種報錯的。容錯能力比較弱。
Lombok 是一個不錯的組件,我們很多的bean類有大量的getting and setting 要我們去寫,引入該包就可以不用寫,在生成的類中,會自動為我們生成。
session 是spring組件,高度抽象的,可以跟redis整合,集中session管理,更加方便靈活。
還有一個spring組件 spring-reset-docs 是一個測試驅動的api文檔生成組件,挺喜歡的一個組件,對我們測試成功的方法生成一個接口文檔,當然出來的樣式需要做一些微調。
這個spring-reset-docs網上沒有什么資料,后面我整理一章。
其他的依賴就是mybatis,aop等就不講,你們可以根據具體的需求整合進去。
點擊“finish” 完成項目的創建。
----------------------------------------------------------------------------------------------------------------------------
2,spring 默認配置原理
spring的啟動類,需要配注解@SpringBootApplication 該注解是一個組合注解,他的核心功能是@EnableAutoConfiguration類
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import({ EnableAutoConfigurationImportSelector.class, AutoConfigurationPackages.Registrar.class }) public @interface EnableAutoConfiguration { /** * Exclude specific auto-configuration classes such that they will never be applied. */ Class<?>[] exclude() default {}; }
EnableAutoConfigurationImportSelector類使用了Spring Core包的SpringFactoriesLoader類的loadFactoryNamesof()方法。
SpringFactoriesLoader會查詢META-INF/spring.factories文件中包含的JAR文件(spring-boot-autoconfigure-1.3.x.jar )。
當找到spring.factories文件后,SpringFactoriesLoader將查詢配置文件命名的屬性。在例子中,是org.springframework.boot.autoconfigure.EnableAutoConfiguration。
在spring-boot-autoconfigure-1.3.x jar文件里,有一個spring.factories文件,該文件聲明有哪些自動配置,內容如下:
# Initializers org.springframework.context.ApplicationContextInitializer=\ org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.data.JpaRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.MongoRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JmsTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\ org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\ org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\ org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration
對於一些必須配置的項目,可以在appliaction.properties 或者application.yml 中配置,例如數據庫連接的驅動,賬戶密碼等
在Spring Boot的org.springframework.boot.autoconfigure.condition包中說明了使用@Conditional注釋來加載配置,如果沒有自定義配置就根據導入的jar包自動注入默認配置。
簡單列舉一些:
- @ConditionalOnBean
- @ConditionalOnClass
- @ConditionalOnExpression
- @ConditionalOnMissingBean
- @ConditionalOnMissingClass
- @ConditionalOnNotWebApplication
- @ConditionalOnResource
- @ConditionalOnWebApplication
以@ConditionalOnExpression注釋為例,它允許在Spring的EL表達式中寫一個條件。
@Conditional(OnExpressionCondition.class) @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.METHOD }) public @interface ConditionalOnExpression { /** * The SpEL expression to evaluate. Expression should return {@code true} if the * condition passes or {@code false} if it fails. */ String value() default "true"; }
在這個類中,我們想利用@Conditional注釋,條件在OnExpressionCondition類中定義:
public class OnExpressionCondition extends SpringBootCondition { @Override public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { // ... // we first get a handle on the EL context via the ConditionContext boolean result = (Boolean) resolver.evaluate(expression, expressionContext); // ... // here we create a message the user will see when debugging return new ConditionOutcome(result, message.toString()); } }
在最后,@Conditional通過簡單的布爾表達式(即ConditionOutcome方法)來決定。
---------------------------------------------------------------------------------------------------------------------------------
3,整合springboot ------app后台開發框架
3.1 配置application.properties
3.2 把 app后台框架搭建三的代碼直接 拷貝過來放到指定的包下
這里,我就不多說了
3.3 springMVC的配置類也可以直接拉過來,不過做一下修改
/** * Created by ouyangming on 2017/7/4. * spring mvc configure */ @Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter { private final static Logger logger = LoggerFactory.getLogger(WebMvcConfig.class); @Bean public JwtUtil getJwtUtil(){ return new JwtUtil(); } //靜態文件 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { logger.info("addResourceHandlers"); registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/"); } @Bean public FormatJsonReturnValueHandler JsonReturnHandler(){ FormatJsonReturnValueHandler formatJsonReturnValueHandler=new FormatJsonReturnValueHandler(); return formatJsonReturnValueHandler; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(getTokenHeader()) .addPathPatterns("/api/*") .excludePathPatterns( "/robots.txt"); } @Override public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) { returnValueHandlers.add(JsonReturnHandler()); } //token 在header的攔截器 public HandlerInterceptor getTokenHeader(){ return new HeaderTokenInterceptor(); } }
-----------------------------------------------------------------------------------------------------------------------------------------------
4* 填坑說明
4.1 攔截器里無法直接注入類,必須要通過bean工廠進行注入
if(jwtUtil==null){ BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(httpServletRequest.getServletContext()); jwtUtil = (JwtUtil) factory.getBean("jwtUtil"); } token=jwtUtil.updateToken(token); if(token.equals("0")){ dealErrorReturn(httpServletRequest,httpServletResponse,str); }
4.2 自定義json的統一格式,無法直接返回字符串,因為默認的thymeleaf 的默認配置,會直接識別成默認視圖名字,然后就去src/main/resources/templates找模板文件,找不到就直接報錯。
例如下面就會直接報錯了:
@RequestMapping("/api/liu") @AppResponsBody public String loginSuccess(){ return "you are success login"; }
下一章,可能准備說一下springboot自動部署的jenkins的使用;
再后面會講講如何使用spring-reset-docs或者其他API的文檔生成工具;
接下來就結合spring cloudy 或者dubbox 講講微服務的架構;
最后講講運維自動化集成, 高並發思路就差不多了。
源碼下載鏈接:源碼
QQ交流群:458419464