Spring Boot 学习笔记1——原理入门
目录
- 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实例化
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方法
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"})
1、@Enable*工作原理
触发Spring Boot的配置过程有两种方法:
通过简单的@Enable*来开启一项功能的支持,避免自己配置大量的代码
@Enable*注解的工作原理:
所有的@Enable*注解都有一个@Import注解,通过@Import可以导入类(该类会交由Spring托管)及配置类(配置类里面的bean都会被Spring托管),通过导入配置类从而实现自动开启某项功能,有三种导入配置方式:
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配置日志的相关属性,如:
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