SpringBoot综述
Springboot
特点
实现容器的独立运行
可以以jar包形式启动一个具备spring容器的所有特点的工程
通过main方法执行启动一个spring容器
内嵌了servlet容器
默认内嵌式tomcat,可以根据依赖替换成jetty,undertow
提供了简化依赖
例如:开发一个web应用 spring-web,spring-webmvc,jackson-core等
springboot提供spring-boot-starter-web的简化依赖
核心特性(自动配置)
是由于低层经过了大量代码编写,扩展了自动配置的逻辑,会根据使用场景创建内存对象
手动搭建一个springboot
pom文件修改 pom.xml
添加继承springboot-parent工程
开发web应用,添加开发web应用依赖starter-web
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
src/main/java
com.wiscom.controller
package com.wiscom.controller; @RestController public class HelloController { @Autowired private HelloService helloService; @RequestMapping("hello") public String sayHi(String name){ return "controller:"+helloService.sayHi(name); } }
com.wiscom.service
package com.wiscom.service; @Service public class HelloService { public String sayHi(String name) { return "service"+"hello springboot "+name; } }
com.wiscom
package com.wiscom; //springboot的核心注解 @SpringBootApplication public class StarterDemo01 { //当前springboot中唯一的一个入口方法main public static void main(String[] args) { //SpringBoot体工程启动对象 SpringApplication.run(StarterDemo01.class, args); } }
springboot配置
application.properties
springboot的全局配置,
绝大多数应用场景使用的属性都可以在这个配置文件中配置读取
实现端口修改
访问路径的修改
src/main/resourses
application.properties
properties文件可以用yaml格式书写
这是全局配置
server.port=8090 server.context-path=/1905 #spring.datasource.driverClassName=com.jdbc.mysql.Driver #datasource #mybatis #redis #rabbitmq #elasticsearch
自动配置原理
springboot自动配置利用的注解
@Configuration
定义配置类
@bean
配置bean对象
@ConfigurationProperties
读取对象需要的属性
java语言
javaconfig:将xml语言解析成内存对象,相当于DOM/SAX解析器
jdk1.5出现,spring利用javaconfig特性,将xml文件转化为注解
@Configuration
:表示一个完整的xml文件
@ComponentScan
:表示xml中<context:compoment-scan>
@Bean
:表示一个xml文件中的<bean>
标签.......
spring 需要掌握的标签
@configuration
@Bean
@ConfigurationProperties
@conditionalOnClass
.....
将xml文件转化为注解的形式
src/main/java
com.wiscom
StartDemo.java
package com.wiscom; //springboot的核心注解 @SpringBootApplication public class StartDemo { // springboot中唯一的一个入口方法main public static void main(String[] args) { SpringApplication.run(StartDemo.class, args); } }
com.wiscom.pojo
MyBean.java
package com.wiscom.pojo; // 需要生成bean标签对象 public class Mybean { private int age; private String name; public Mybean() { System.out.println("Mybean被创建成功"); } }
com.wiscom.config
MyBeanConfig.java
package com.wiscom.config; // 配置类的注解,相当于一个独立的xml文件加载的内容 @Configuration public class MybeanConfig { // 相当于 <bean id="initMybean" class="com.wiscom.pojo.Mybean"> @Bean public Mybean initMybean(){ return new Mybean(); } }
com.wiscom.controller
HelloController.java
package com.wiscom.controller; @RestController public class HelloController { @Autowired private HelloService helloService; // 引用bean,查看是否被创建成功 @Autowired private Mybean mybean; @RequestMapping("hello") public String sayHi(String name){ return "controller:"+helloService.sayHi(name); } }
@ConfigurationProperties的使用
可以读取配置中的值:
properties/yml
可以定义前缀,自动赋值给类中的同名属性
src/main/resources
application.properties
springboot.conf.test.url=1 springboot.conf.test.username=1 springboot.conf.test.password=1 springboot.conf.test.driver=1
src/main/java
com.wiscom.pojo
Yourbean.java
package com.wiscom.pojo; public class Yourbean { private String url; private String driver; private String username; private String password; public Yourbean(){ System.out.println("YourBean已被创建"); } }
com.wiscom.config
YourBeanConfig.java
其中的属性值要从配置中读取
package com.wiscom.config; @Configuration // 配置文件中的值要以 springboot.conf.test 为前缀 @ConfigurationProperties("springboot.conf.test") public class YourBeanConfig { private String url; // springboot.conf.test.url private String username; // springboot.conf.test.username private String password; // springboot.conf.test.password private String driver; // springboot.conf.test.driver @Bean public YourBean initYourBean(){ // YourBean yb=new YourBean(); // 创建一个YourBean对象,给其中的属性赋值 yb.setUsername(username); yb.setPassword(password); yb.setDriver(driver); yb.setUrl(url); return yb; } }
自动装配的核心注解
@ConditionalOnClass
:当前环境可以扫描到类时,满足条件
@ConditionalOnBean
:当前环境存在这个Bean对象时,满足条件
@ConditionalOnMissingClass
:当环境没有class时,满足
@ConditionalOnMissingBean
:当环境灭有bean时,满足
@ConditionalOnProperties
:当环境具备什么properties属性值时,满足条件
举例
@ConditionalOnClass
src/main/java
com.wiscom.condition
ConditionalTestbean.java
package com.wiscom.condition; public class ConditionalTestbean { private int age; private String name; public ConditionalTestbean() { System.out.println("ConditionalTestbean对象已被创建"); } }
com.wiscom.config
ConditionalConfig.java
package com.wiscom.config; @Configuration // 只有ConditionalTestbean类被加载后,才会加载这个类 // 如果没有这个类,会报错,但不影响运行 @ConditionalOnClass({ConditionalTestbean.class}) public class ConditionalConfig { @Bean public ConditionalTestbean iniMybean(){ return new ConditionalTestbean(); } }
springboot的核心注解:@SpringBootApplication
@SpringBootApplication
是一个组合注解
组合注解
@SpringBootConfiguration
:标识了一个配置类效果等同于
@Configuration
@EnableAutoConfiguration
:自动转配实现注解可以实现读取所有springboot扩展配置类的全路径名称
@ComponentScan
:扫描默认情况是根据注解所在的类的包名实现扫描范围的
@EnableAutoConfiguration
Import导入了一个开启自动配置导入选择器的对象
@Import(EnableAutoConfigurationImportSelector.class)
EnableAutoConfigurationImportSelector
的父类
AutoConfigurationImportSelector
中的getCandidateConfigurations
方法获取了候选的配置类方法中通过
SpringFactoriesLoader
可以加载所有自动配置中的文件spring.factory
spring.factory
位于
Maven Dependencies
包下 ---->spring-boot-autoconfigure
--->META-INF
(元数据) ---->spring.factories
run方法启动spring容器的过程
run调用
通过启动类反射对象,收集工程各种环境信息
收集spring启动前的各种初始化信息
利用收集的环境信息开始创建容器中各种对象
bean
对象,configuratoin factory
(加载配置文件)收尾工作
将启动创建过程中的工具销毁
springboot自动配置原理
启动顺序
run方法启动
初始化收集环境信息,通过反射对象获取核心注解
@SpringBootApplication
根据初始化信息,创建spring容器中各种对象
将中间对象销毁,保留spring容器清洁,启动结束
自动配置
springboot扩展了一大批需要自动配置类
每一个配置类的结构需要使用到spring的注解功能
@Configuration
标识一个配置类,相当于加载一个xml文件
@ConfigurationProperties
对象创建初始化,从配置文件中读取属性
@Conditional
衍生注解,指定加载配置类创建bean对象的详细条件
只有满足条件才会创建相应内容
@ConditionalOnClass
@ConditionalOnBean
@ConditionalOnMissingClass
@ConditionalOnMissingBean