Spring Boot 概述
Spring boot是一个脚手架:
可以很快很方便整合其他的外部框架
提供了自动配置功能
可实现其开箱即用特性
springBoot自动配置原理:
启动类的注解(@SpringBootApplication)上有EnableAutoConfiguration这个注解,这个注解实现了自动配置功能
EnableAutoConfiguration上面有@Import注解
引入了AutoConfigurationImportSelector.class
这个类,这个类里面都是springboot整合外部框架的配置
实现自动扫描:
启动类的注解(@SpringBootApplication)上有@ComponentScan
自动扫描并加载符合条件的Bean到容器中,默认扫描启动类所在的包开始扫描
Spring Boot常用注解:
@SpringBootApplication 启动类注解
@Component,@Controller,@Service:将类给
Spring框架中的BeanFactory工厂接口的实现类
对象
@SpringBootTest:测试类交给spring管理。
@Autowired:描述告诉spring框架要为此属性注入一个值
spring入门案例
创建一个DefaultCache类然后交给spring 管理。
@Component
public class DefaultCache {}
//第二步
@SpringBootTest
public class DefaultCacheTests {
@Autowired
private DefaultCache defaultCache;
@Test
public void testCache() {
System.out.println(defaultCache);
}
}
程序执行流程解析:
1.程序首先会找到启动类(@SpringBootApplication)
2.启动类上面有两个注解: @EnableAutoConfiguration+@ComponentScan
@EnableAutoConfiguration会去加载一些程序运行所需要的配置,@ComponentScan会从启动类所在的包下开始扫描整个包结构,会将带有特定的注解的类扫描到spring容器中,
3.通过扫描之后spring容器里就存在了DefaultCacheTests对象
4.SpringBootTest这个注解的类就表明是一个测试类,程序到@Autowired,此时它就会到spring容器中DefaultCache这个对象,或者是他的子类对象
spring对象作用域+延迟加载+生命周期方法
Spring Bean中的作用域有五个singleton,prototype,request,session,globalsession
案例:
package com.cy.pj.common.cache;
@Component
@Scope("singleton")
@Lazy
public class DefaultCache {
public DefaultCache() {
System.out.println("cache()");
}
@PostConstruct
public void init() {
System.out.println("init()");
}
@PreDestroy
public void destory() {
System.out.println("destory");
}
}
1.@Component 会被扫描进spring容器
2.@Scope("singleton")指定存储的域为singleton
singleton里面存储的是单例的只有一份
3.@Lazy告诉spring框架此类支持延迟加载,在程序中
DefaultCache被扫描到spring容器,带@Lazy此时bean工厂对象不会马上创建他的实例,什么时候用才会去加载他的实例
4.@PostConstruct 注解用于描述bean对象生命周期方法中 的初始化方法
5.@PreDestroy 注解用于描述Bean对象生命周期方法中的销毁方法
程序在加载时,首先回去加载静态方法=>构造方法=>初始化方法=>销毁方法
6.如果作用域prototype,这个作用域不是单例的(每次获取都会创建新实例),也不会交个spring去管理,spring可以对它初始化,因为spring不管他,所以要手动的去销毁
spring加强练习
package com.cy.pj.common.cache;
public interface Cache {}
//接口子类1
package com.cy.pj.common.cache;
import org.springframework.stereotype.Component;
@Component
public class WeakCache implements Cache{
}
//接口子类2
package com.cy.pj.common.cache;
@Component
public class DefaultCache implements Cache{
}
//测试类
@SpringBootTest
public class CacheTests {
@Autowired
@Qualifier("defaultCache")
private Cache cache;
@Test
public void testCache() {
System.out.println(cache);
}
}
- 通过扫描,会将子类1+子类2扫描到spring容器中
- @Autowired注入容器时是父类的接口,而spring容器中有两个子类的对象,此时就无法完成注入
此时就需要加 @Qualifier("defaultCache")为注入指定一个对象,指定的是子类2,此时取到的对象就是子类2的对象
小结
1.Spring boot 是什么? (脚手架而非框架)可以很容易的去整合外部框架
2.Spring boot 核心优势?(启动依赖,自动配置-开箱即用,健康检查-系统监控)
整合时只需要加入相对于的依赖,不需要写繁琐的配置,就可以直接使用
3.Spring boot项目启动时,Bean的初始化过程是怎样的?(查找,加载,读和存储配置,创建和存储实例对象)
查找:类上指定的注解 加载:加载到spring容器
4.Spring boot 项目启动时,Bean对象的依赖注入过程是怎样的?(标记,查找,注入)