您的位置:首页 > 编程语言 > Java开发

Spring Boot 学习笔记1——原理入门

2017-11-16 16:41 573 查看


目录

Spring Boot概念
Spring Boot启动流程
自动配置
@Enable*工作原理
Spring Boot外部配置
日志配置

Spring Boot概念

1、Spring Boot是什么

Spring Boot是用来简化Spring应用初始搭建及开发过程的全新框架,它使用“习惯优于配置”的原则,只需很少甚至完全不使用xml配置,只使用自动配置,避免定义大量的样板化配置。

Spring Boot不是为已解决的问题提供新的解决方案,而是为Spring平台带来一种新的开发体验,简化已有技术的使用。

2、Spring Boot核心功能

Spring Boot可以以jar包形式独立运行
内嵌Servlet容器(如Tomcat、Jetty),可以把项目打包成jar包直接运行,无须以war包形式部署
自动配置,Spring Boot会为在类路径中的jar包里的类自动配置Bean
配置简单,通过java及注解配置组合,如Spring4.x提供的新特性:条件注解(@Conditional)
监控简单

3、Spring Boot搭建

官方构建工具Spring initializer(http://start.spring.io)
开发工具,如IntelliJ IDEA、Spring Tool Suite、Eclipse+sts插件
Spring Boot CLI(命令行界面)
不同的搭建方式实际上都是用了官方构建工具,都需要联网

Spring Boot启动流程

1、Spring Boot启动流程图



https://www.processon.com/view/link/59812124e4b0de2518b32b6e

2、入口类

入口类被@SpringBootApplication注解,里有一个main方法,main方法中通过SpringApplication.run()方法启动Spring Boot项目


  

@SpringBootApplication包括三个注解,功能如下:

@EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置

@SpringBootConfiguration(内部为@Configuration):被标注的类也叫配置类,等于在spring的applicationContext.xml配置文件中,装配所有bean事务,提供了一个spring的上下文环境

@ComponentScan:组件扫描,可自动发现和装配Bean,默认扫描SpringApplication的run方法里的Booter.class所在的包路径下文件,所以最好将该启动类放到根包路径下



1、SpringApplication实例化

2、调用该实例的run方法

3、SpringApplication实例化





•设置配置类
•推断是否为WEB环境,根据classpath里面能否存在某个特征类:org.springframework.web.context.ConfigurableWebApplicationContext
•实例化META-INF/spring.factories文件中的ApplicationContextInitializer类
•实例化META-INF/spring.factories文件中的ApplicationListener类
•推断主类

4、执行run方法



实例化META-INF/spring.factories文件中的SpringApplicationRunListener类
加载配置环境ConfigurableEnvironment,包括:创建web/非web配置环境、加载属性文件等
创建上下文对象,不同的environment会创建不同的ApplicationContext

Web:AnnotationConfigEmbeddedWebApplicationContext 

Standard:AnnotationConfigApplicationContext
将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联
刷新上下文,是实现自动化配置的关键,包括spring.factories的加载,bean的实例化等核心工作

自动配置

1、自动配置过程



@SpringBootApplication 包含了@EnableAutoConfiguration,而@EnableAutoConfiguration的关键是使用了@Import注解:@Import({EnableAutoConfigurationImportSelector.class,AutoConfigurationPackages.Register.class})
SpringFactoriesLoader.loadFactoryNames(factoryClass,classLoader)方法会根据factoryClass.getName()到项目系统路径下所有的spring.factories文件中找到相应的key,返回配置工厂类的类名集合,上级方法再通过反射获取这些类的类对象、构造方法,最终生成配置工厂类的实例

2、获取配置工厂类集合



                            AutoConfigurationImportSelector的selectImports方法

•getCandidateConfigurations方法调用了SpringFactoriesLoader.loadFactoryNames(factoryClass,classLoader)方法,返回配置类名集合
•去重、排序
•去除@EnableAutoConfiguration里的exclude数组中的类(可以通过@SpringBootApplication(exclude = {Xxxx.class})关闭某些自动配置)

3、spring.factories文件



每一个配置类都使用了@Configuration注解和某种条件注解,配置类可以向Spring容器注册Bean来开启某项功能,条件注解如:

@ConditionalOnBean:当容器里有指定的Bean的条件下

@ConditionalOnClass:当类路径下有指定的类条件下

@ConditionalOnProperty:指定的属性是否有指定的值

这些条件注解都使用了@Conditional,只是传入了不同的条件实现类(实现Condition接口,重写其match方法)

4、自定义配置类

如果需要,我们可以在resources目录下创建spring.factories文件,添加类似配置,然后编写配置类,配置类如:





通过配置类,可以修改Spring Boot提供的默认配置,如下代码可修改视图解析器的配置:

  @Bean

  public InternalResourceViewResolver viewResolver(){

  InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

  viewResolver.setPrefix("/WEB-INF/classes/views");

  viewResolver.setSuffix(".jsp");

  viewResolver.setViewClass(JstlView.class);

  }

虽然Spring Boot推荐不使用xml配置,但如果必须要用的话,可以在配置类外面通过@ImportResource来加载xml配置,如:@ImportResource({"classpath:myContext1.xml”,”classpath:myContext2.xml"})

何如根据不同的环境加载不同的xml文件,可以利用application.properties中的spring.profiles.active属性(可能为dev、test、prod)

方式一:利用该属性到不同文件夹中取配置文件,如:

@ImportResource({"classpath:${spring.profiles.active}/myContext1.xml”,”classpath:${spring.profiles.active}/myContext2.xml"})

方式二:利用该属性拼接文件名,如:

@ImportResource({"classpath:myContext1-${spring.profiles.active}.xml”,”classpath:myContext2-${spring.profiles.active}.xml"})

@Enable*工作原理

1、@Enable*工作原理

触发Spring Boot的配置过程有两种方法:

1.spring.factories:由Spring Boot触发探测classpath目录下的类,进行自动配置
2.@Enable*:有时需要由starter的用户触发查找自动配置文件的过程
通过简单的@Enable*来开启一项功能的支持,避免自己配置大量的代码

@Enable*注解的工作原理:

所有的@Enable*注解都有一个@Import注解,通过@Import可以导入类(该类会交由Spring托管)及配置类(配置类里面的bean都会被Spring托管),通过导入配置类从而实现自动开启某项功能,有三种导入配置方式:

1.直接导入配置类:如@EnableScheduling使用了@Import(SchedulingConfiguration.class),SchedulingConfiguration是一个配置类,里面注册了一个scheduledAnnotationProcessor的Bean
2.根据条件选择配置类:利用ImportSelector,我们可以在注解上添加一些属性,然后根据属性的不同加载不同的配置类,如@EnableAsync
3.动态注册Bean

2、自定义Enable*注解

直接导入配置类:



根据条件选择配置类:





Spring Boot外部配置

1、Spring Boot默认外部配置文件

Spring Boot的外部配置文件默认为application.properties或application.yml,通常放在src/main/resources下

#application.properties

server.port=9090

server.context-path=/xxx

#Application.yml

server:

    port: 9090

    contextPath: /xxx

注意:key后面的冒号,后面一定要跟一个空格

通过@Value注入,如:

@Value(”${server.port}”)

Private String port;

也可以通过@ConfigurationProperties把配置文件的属性和一个Bean的属性关联, prefix是属性的前缀如:



如何根据不同环境加载不同的application.properties文件,首先有一个名为application.properties的配置文件,里面是不受环境影响的公共属性,同时还有一个属性:spring.profiles.active=dev(test或prod),然后每种环境对应有一个配置文件,如application-dev.properties、application-prod.properties,系统会自动根据application.properties中的spring.profiles.active的值自动加载对应的配置文件。

2、自定义外部配置文件

@ConfigurationProperties(prefix="server",location={"classpath:config/myProperties.properties"})

prefix是属性的前缀,location是配置文件的位置,1.5版本后就没有location这个属性了,可以使用:

@Configuration

@ConfigurationProperties(prefix=“server”)

@PropertySource("classpath:config/myProperties.properties")

多个配置文件:

@PropertySource({@PropertySource("classpath:config/myProperties1.properties"),

@PropertySource("file:/d:/config/myProperties2.properties"})

如何根据不同环境加载不同配置文件,可参考前面xml配置文件的配置。

日志

1、日志的使用

如何引入日志:

因为spring-boot-starter包含了spring-boot-starter-logging,故无需要在maven中添加依赖,Spring Boot默认用Logback来记录日志,并用INFO级别输出到控制台,可以直接使用Spring Boot的默认日志配置

代码中如何使用:

private Logger logger = LoggerFactory.getLogger(this.getClass());

如何配置:

我们可以在application.properties配置日志的相关属性,如:

•debug=true#以debug模式启动应用
•通过logging.level.*做级别控制:
        logging.level.root=INFO#所有类日志都以INFO级别输出

        logging.level.com.mypackage=DEBUG#com.mypackage包下所有class以DEBUG级别输出

•文件输出:
        logging.path=D:\\log#在D:\log文件夹生成一个日志文件为 spring.log

        logging.file=my.log#在项目的当前路径下生成一个my.log日志文件

        logging.path和logging.file都可以是相对路径或者绝对路径,如若同时使用,则只有logging.file生效

2、外部日志配置文件



http://logback.qos.ch/manual/index.html

多环境日志输出:



name:用来指定受此loger约束的某一个包或者具体的某一个类

Level:用来设置打印级别,如果未设置此属性,那么当前loger将会继承上级的级别

Addtivity:是否向上级loger传递打印信息,默认是true

视频资源

http://edu.51cto.com/center/course/lesson/index?id=187419

http://edu.51cto.com/center/course/lesson/index?id=114640


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: