Spring的Bean和自动配置
目录
一、Bean的作用域
二、Bean的生命周期
三、Spring Boot自动配置
1.Spring加载Bean
1.1 解决方案
@ComponentScan
@Import
1.导入类
2.导入ImportSelector接口实现类
2.总结
一、Bean的作用域
在Spring中支持6种作用域,后四种在Spring MVC环境才生效。
作用域 | 说明 |
singleton:单例作用域 | 每个Spring Ioc容器内同名称的bean只有一个实例(单例)(默认) |
prototype:原型作用域(多例作用域) | 每次使用该bean时会创建新的实例 |
request:请求作用域 | 每个HTTP请求生命周期内,创建新的实例(web环境中) |
session:会话作用域 | 每个HTTP Session生命周期内,创建新的实例(web环境中) |
Application:全局作用域 | 每个ServletContext生命周期内,创建新的实例(web环境中) |
websocket:HTTP Websocket作用域 | 每个WebSocket生命周期内,创建新的实例(web环境中) |
二、Bean的生命周期
生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个对象的生命周期。
Bean的生命周期分为以下5个部分:
- 实例化(为Bean分配内存空间)
- 属性赋值(Bean注入和装配,比如@AutoWired)
- 初始化
- 使用Bean
- 销毁Bean
三、Spring Boot自动配置
SpringBoot的自动配置就是当Spring容器启动后,一些配置类,bean对象等就自动存入到了Ioc容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。
SpringBoot自动配置,就是指SpringBoot是如何将依赖jar包中的配置类以及Bean加载到Spring IoC容器中的。
1.Spring加载Bean
Spring通过五大注解和@Bean 注解可以帮助我们把Bean加载到SpringIoc容器中,以上有个前提就是注解需要和SpringBoot启动类在同一目录下(@SpringBootApplication 注解标注的类就是SpringBoot项目的启动类)。
当我们引入第三方的Jar包时,第三方的Jar代码目录肯定不在启动类的目录下,如果告诉Spring帮我们管理这些Bean呢?
1.1 解决方案
我们需要指定路径或者引入的文件跟启动类一个目录 ,告诉Spring,让Spring进行扫描到。
常见的解决方案有两种:
1.@ComponentScan 组件扫描
2.@Imort 导入(使用@Import导入的类会被Spring加载到IoC容器中)
@ComponentScan
通过@ComponentScan注解指定Spring扫描路径
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@ComponentScan("com.bite.autoconfig")
@SpringBootApplication
public class SpringAutoconfigApplication {public static void main(String[] args) {SpringApplication.run(SpringAutoconfigApplication.class, args);}
}
可以指定扫描多个包
@ComponentScan({"com.bite.autoconfig","com.example.demo"})
运行程序:
可以看到,这次biteConfig Bean获取到了。
@Import
@Import 导入主要有以下几种形式:
1.导入类
2.ImortSelector 接口类
1.导入类
@Import(BiteConfig.class)
@SpringBootApplication
public class SpringAutoconfigApplication {public static void main(String[] args) {SpringApplication.run(SpringAutoconfigApplication.class, args);}
}
如果多了一些配置项时,可以导入多个类:
Import({BiteConfig.class, BiteConfig2.class})
@SpringBootApplication
public class SpringAutoconfigApplication {public static void main(String[] args) {SpringApplication.run(SpringAutoconfigApplication.class, args);}
}
2.导入ImportSelector接口实现类
- ImportSelector 接口实现类
public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {//需要导⼊的全限定类名return new String[]{"com.bite.autoconfig.BiteConfig","com.bite.autoconfig.BiteConfig2"};}
- 启动类
@Import(MyImportSelector.class)
@SpringBootApplication
public class SpringAutoconfigApplication {public static void main(String[] args) {SpringApplication.run(SpringAutoconfigApplication.class, args);}
}
可以看到,导入ImportSelector接口实现类的方法实现让Spring 扫描得到。
2.总结
SpringBoot 自动配置原理的大概流程如下:
当SpringBoot程序启动时,会加载配置文件当中所定义的配置类,通过@Import注解将这些配置类全部加载到Spring的IoC容器中并交给IoC容器管理。