spring boot 入门

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;     } }

相关文章
相关标签/搜索