Spring Boot 学习笔记1——原理入门
2017-11-16 16:41
573 查看
Spring Boot启动流程
自动配置
@Enable*工作原理
Spring Boot外部配置
日志配置
Spring Boot不是为已解决的问题提供新的解决方案,而是为Spring平台带来一种新的开发体验,简化已有技术的使用。
内嵌Servlet容器(如Tomcat、Jetty),可以把项目打包成jar包直接运行,无须以war包形式部署
自动配置,Spring Boot会为在类路径中的jar包里的类自动配置Bean
配置简单,通过java及注解配置组合,如Spring4.x提供的新特性:条件注解(@Conditional)
监控简单
开发工具,如IntelliJ IDEA、Spring Tool Suite、Eclipse+sts插件
Spring Boot CLI(命令行界面)
不同的搭建方式实际上都是用了官方构建工具,都需要联网
https://www.processon.com/view/link/59812124e4b0de2518b32b6e
@SpringBootApplication包括三个注解,功能如下:
@EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置
@SpringBootConfiguration(内部为@Configuration):被标注的类也叫配置类,等于在spring的applicationContext.xml配置文件中,装配所有bean事务,提供了一个spring的上下文环境
@ComponentScan:组件扫描,可自动发现和装配Bean,默认扫描SpringApplication的run方法里的Booter.class所在的包路径下文件,所以最好将该启动类放到根包路径下
1、SpringApplication实例化
2、调用该实例的run方法
•设置配置类
•推断是否为WEB环境,根据classpath里面能否存在某个特征类:org.springframework.web.context.ConfigurableWebApplicationContext
•实例化META-INF/spring.factories文件中的ApplicationContextInitializer类
•实例化META-INF/spring.factories文件中的ApplicationListener类
•推断主类
实例化META-INF/spring.factories文件中的SpringApplicationRunListener类
加载配置环境ConfigurableEnvironment,包括:创建web/非web配置环境、加载属性文件等
创建上下文对象,不同的environment会创建不同的ApplicationContext
Web:AnnotationConfigEmbeddedWebApplicationContext
Standard:AnnotationConfigApplicationContext
将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联
刷新上下文,是实现自动化配置的关键,包括spring.factories的加载,bean的实例化等核心工作
@SpringBootApplication 包含了@EnableAutoConfiguration,而@EnableAutoConfiguration的关键是使用了@Import注解:@Import({EnableAutoConfigurationImportSelector.class,AutoConfigurationPackages.Register.class})
SpringFactoriesLoader.loadFactoryNames(factoryClass,classLoader)方法会根据factoryClass.getName()到项目系统路径下所有的spring.factories文件中找到相应的key,返回配置工厂类的类名集合,上级方法再通过反射获取这些类的类对象、构造方法,最终生成配置工厂类的实例
AutoConfigurationImportSelector的selectImports方法
•getCandidateConfigurations方法调用了SpringFactoriesLoader.loadFactoryNames(factoryClass,classLoader)方法,返回配置类名集合
•去重、排序
•去除@EnableAutoConfiguration里的exclude数组中的类(可以通过@SpringBootApplication(exclude = {Xxxx.class})关闭某些自动配置)
每一个配置类都使用了@Configuration注解和某种条件注解,配置类可以向Spring容器注册Bean来开启某项功能,条件注解如:
@ConditionalOnBean:当容器里有指定的Bean的条件下
@ConditionalOnClass:当类路径下有指定的类条件下
@ConditionalOnProperty:指定的属性是否有指定的值
这些条件注解都使用了@Conditional,只是传入了不同的条件实现类(实现Condition接口,重写其match方法)
通过配置类,可以修改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.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
根据条件选择配置类:
#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的值自动加载对应的配置文件。
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配置文件的配置。
因为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生效
http://logback.qos.ch/manual/index.html
多环境日志输出:
name:用来指定受此loger约束的某一个包或者具体的某一个类
Level:用来设置打印级别,如果未设置此属性,那么当前loger将会继承上级的级别
Addtivity:是否向上级loger传递打印信息,默认是true
http://edu.51cto.com/center/course/lesson/index?id=114640
目录
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=187419http://edu.51cto.com/center/course/lesson/index?id=114640
相关文章推荐
- Spring boot入门实例 简易登录(精通Spring+4.x++企业应用开发实战 学习笔记二)
- Spring Boot 学习笔记(一)——入门
- [spring入门学习笔记][spring的IoC原理]
- [spring入门学习笔记][spring的IoC原理]
- SpringBoot学习笔记 入门
- spring boot学习笔记(5)springboot运行原理
- [Spring入门学习笔记][Spring的AOP原理]
- spring-boot入门学习笔记
- [Spring入门学习笔记][Spring的AOP原理]
- (小白学习笔记)Springboot入门(一):Specification
- SpringBoot学习笔记(3) Spring Boot 运行原理,自动配置
- spring boot 学习笔记(入门篇)
- [Spring入门学习笔记][Spring Boot]
- [Spring入门学习笔记][Spring Boot]
- Springboot入门学习笔记(二)
- springboot 学习笔记【3】Spring Boot中使用Spring-data-jpa
- spring-boot学习笔记3
- spring boot学习 初级入门
- Spring Boot学习笔记
- springboot学习笔记