1 历史上在spirng1版本,全都是使用xml配置,繁琐,在jdk1.5之后java支持了注解,后来spring也开始使用注解,造成了db使用xml,业务service使用注解的统一习惯。在spring4之后,支持了java配置,springboot建议使用java配置,包括@Configuration(声明当前是一个配置类,相似xml文件)和@Bean(用在方法上,说明返回一个bean)。springboot思想是“习惯优于配置”,内置了不少习惯性配置,即自动配置。同时提供了起步依赖,包含了多种基础依赖包括spring-web,spring-mvc等等。java
总结起来,springboot的特色有二: 一是继承starter,约定优于配置;二 自己是一些库的集合,不是新的框架,无需管理各类库。spring使编码更简单,配置更简单,部署更简单,监控更简单。web
核心功能:spring
(1)独立运行的spring项目,能够打成jar包,java -jar就可运行。编程
(2)内嵌servlet容器,能够选择tomcat,jetty,undertow等,无需以war包形式部署。json
(3)提供starter,简化mvn配置,pom能够直接依赖spring-boot-starter-web,会自动引入多种依赖如hibernate,springmvc等。spring-mvc
(4)自动配置spring bean。会对类路径下的jar包里的类自动配置bean,极大减小配置。tomcat
(5)应用监控。基于http,ssh,telnet对项目进行运行时监控。springboot
(6)无代码和xml配置。spring4.x提倡java配置和注解配置结合,所以spring-boot能够实现不用spring-xml配置。session
spring-boot优势 mvc
(1)快速构建项目。
(2)集成主流开发框架,无须额外配置(无需额外管理jar包和配置xml)。
(3)项目独立运行,不需servlet容器(已经内置)。
* 默认tomcat,能够换成jerry undertow,servlets filters listeners 均可以经过声明为bean来被容器注册,还能够配置相关属性:server.port等。
(4)提供运行时监控。
(5)提升了开发部署效率。
(6)与云计算结合。
*可使用idea的spring initializr和下面的web来建立项目,在新项目里pom里有父依赖spring-boot-starter-parent,规定了各类版本和基础依赖。
* 项目提供了xxApplication做为应用入口类,其中@SpringBootApplication是Sprnig Boot项目的核心注解,主要目的是开启自动配置;main方法做为程序入口;还能够手动加上@RestController,至关于@Controller+@ResponseBody,让类里的方法都用json输出。
* application.properties,这个文件用于配置全局变量。也支持自定义文件分别保存属性。
2 springboot 经常使用模块
(1)spring-boot 主库,为各模块提供支持,SpringApplication类,提供main()方法直接启动,嵌入web应用和容器(tomcat等)。
(2)spring-boot-autoconfigure 基于claspath下的内容配置通用的大部分模块,@EnableAutoConfiguration 触发spring上下文自动配置,自动配置可能须要的bean。自动配置优先级低于用户本身定义的bean。
(3)spring-boot-starters 一组预约义的依赖,添加不一样类型的应用功能。
(4)spring-boot-cli 能够编译和运行groovy源码,提供极为简化的代码开发。
(5)spring-boot-actuator 对应用系统集成监控功能,能够查看配置和相关统计等。好比url访问查看额外配置,查看bean配置,查看最近访问的若干requet记录等。
(6)spring-boot-loader 自定义的classloader,对打包文件格式进行了定义,容许构建可用java -jar执行的jar包。
3 基本配置
(1) xxApplication是应用入口类,@SpringBootApplication是核心注解,是一个组合注解以下。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
主要是@SpringBootConfiguration(里面组合@Configuration) @EnableAutoConfiguration @ComponentScan
@Configuration 用@Configuration注解该类,等价 与XML中配置beans;用@Bean标注方法等价于XML中配置bean;但它们一样能够用在普通的spring项目中,而不是Spring Boot特有的,只是在spring用的时候,注意加上扫包配置。
@EnableAutoConfiguration 依赖springboot在类路径中的查找,自动载入应用程序所须要的bean。@Enable***这种注解spring3.x就出现了,好比@EnableWebMvc,本质上经过@Import({DelegatingWebMvcConfiguration.class}) 来引入须要的bean。@EnableAutoConfiguration也使用import,
@Import({EnableAutoConfigurationImportSelector.class}),EnableAutoConfigurationImportSelector类使用了Spring Core包的SpringFactoriesLoader类的loadFactoryNamesof()方法, SpringFactoriesLoader会查询META-INF/spring.factories文件中包含的JAR文件,spring.factories包含了自动配置列表。例如spring-boot-starter-tomcat引入了tomcat的依赖,因此EmbeddedServletContainerAutoConfiguration发现存在Tomcat.class就会注入TomcatEmbeddedServletContainerFactory来内置web容器。以下:
@Configuration
@ConditionalOnClass({Servlet.class, Tomcat.class})
@ConditionalOnMissingBean(
value = {EmbeddedServletContainerFactory.class},
search = SearchStrategy.CURRENT
)
public static class EmbeddedTomcat {
public EmbeddedTomcat() {
}
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory();
}
}
@ComponentScan 自动扫描@SpringBootConfiguration同级包以及包内的bean,因此建议入口类放在groupid+artificalid下面。
*能够关闭特定的配置,使用exclude,例如@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
(2) application.properties,保存全局属性,例如配置前缀端口啥的,支持yaml语言文件(后缀yml),例如正常版
server.port=8081
server.context-path=/test
若是用yaml语言,就是
server:
port:8081
context-path:/test
(3)spring boot starter是核心starter,包含自动配置、日志和YAML。官方还有一些集成好的starter共44种,例如
spring-boot-starter-actuator 帮助监控和管理应用。
spring-boot-starter-aop 支持面向方面的编程即AOP,包括spring-aop和AspectJ。
spring-boot-starter-jetty 引入了Jetty HTTP引擎(用于替换Tomcat)。
*若是必定要读取xml配置,例如 @ImportResource({"classpath:xxx.xml"})
3 自动注入的条件注解种类
@EnableAutoConfiguration定位到spring.factories文件,自动配置里面的功能,自动配置列表里的每一项都用了条件注解,好比上面例子的@ConditionalOnClass({Servlet.class, Tomcat.class}),在类路径下有制定的类才会进行配置。条件注解的种类包括如下等等:
@ConditionalOnBean 当容器里有指定bean的状况下
@ConditionalOnMissingBean 当容器里没有指定bean的状况下
@ConditionalOnClass 当类路径下(classpath)有指定的类的状况下
@ConditionalOnMissingClass 当类路径下没有指定的类的状况下
@ConditionalOnExpression 基于el表达式进行判断
@ConditionalOnJava 基于jdk版本为条件
@ConditionalOnWebApplication 当前项目是web项目的条件下
@ConditionalOnNotWebApplication 当前不是web项目的条件下
。。。。
以@ConditionalOnWebApplication 为例,里面依次判断 GenericWebApplicationContext,是否有session的scope,环境是不是servlet环境等来判断是否是web项目。
4 配置encoding范例
通常来讲,想配置encoding过滤器,要在web.xml里配置如下filter,配置encoding和forceEncoding,使用spring-boot也能够配置filter。
在 application.properties里面 配置参数 ,而后在配置类HttpEncodingProperties里读取。
spring.http.encoding.charset=UTF-8
spring.http.encoding.force=true
再配置bean
@Configuration //至关于<beans>
@EnableConfigurationProperties(HttpEncodingProperties.class) //载入配置文件
@ConditionalOnClass(CharacterEncodingFilter.class) //CharacterEncodingFilter在类路径下才触发
@ConditionalOnProperty(prefix = "spring.http.encoding",value = "enabled",matchIfMissing = true) //默认enabled 为true
public class HttpEncodingAutoConfiguration {
@Autowired
private HttpEncodingProperties httpEncodingProperties;
@Bean //至关于<bean>
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
public CharacterEncodingFilter characterEncodingFilter(){
CharacterEncodingFilter characterEncodingFilter=new CharacterEncodingFilter();
characterEncodingFilter.setEncoding(httpEncodingProperties.getCharset().name());
characterEncodingFilter.setForceEncoding(httpEncodingProperties.isForce());
return characterEncodingFilter; } }