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等等。

   总结起来,springboot的特点有二: 一是继承starter,约定优于配置;二 本身是一些库的集合,不是新的框架,无需管理各种库。spring使编码更简单,配置更简单,部署更简单,监控更简单。

    核心功能:

  (1)独立运行的spring项目,可以打成jar包,java -jar就可运行。

  (2)内嵌servlet容器,可以选择tomcat,jetty,undertow等,无需以war包形式部署。

  (3)提供starter,简化mvn配置,pom可以直接依赖spring-boot-starter-web,会自动引入多种依赖如hibernate,springmvc等。

  (4)自动配置spring bean。会对类路径下的jar包里的类自动配置bean,极大减少配置。

  (5)应用监控。基于http,ssh,telnet对项目进行运行时监控。

  (6)无代码和xml配置。spring4.x提倡java配置和注解配置结合,因此spring-boot可以实现不用spring-xml配置。

    spring-boot优点 

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


}

posted @ 2017-05-12 16:05  练拳码农  阅读(352)  评论(0编辑  收藏  举报