Bean管理:
Spring IoC(控制反转)容器对象: ApplicationContext
1. 手动获取bean:
- 根据name获取bean:
Object applicationContext
.getBean(String name)
- 根据类型获取bean:
<T> T
applicationContext
.getBean(Class<T> requiredType) - 根据name获取bean(带类型转换):
<T> T
applicationContext
.getBean(String name, Class<T> requiredType)
2. Bean作用域:
Spring 框架支持五种作用域,其中后三种作用域主要在 Web 环境中生效,不关心。以下是这些作用域的说明:
- singleton:这是默认的作用域。在 Spring 容器中,同一个名称的 bean 只有一个实例。这意味着无论请求多少次,都会返回同一个实例。
- prototype:与 singleton 相反,每次使用该 bean 时,Spring 容器都会创建一个新的实例。这允许每个请求或每次注入时都有独立的 bean 实例。
- Singleton 使用场景:
- 用于共享资源管理,如数据库连接池,避免重复创建资源。
- 存储全局配置信息,保证各组件获取相同配置。
- 提供无状态服务,像日志记录器等工具类。
- 管理缓存,存储不常变的频繁访问数据。
- Prototype 使用场景:
- 处理有状态的业务对象,如用户会话对象。
- 应对多实例的业务逻辑对象,像订单处理对象。
- 用于数据转换对象,每次转换任务独立进行。
@Scope(“singleton“/”prototype“) 配置作用域
默认为singleton:单例
实际开发时,绝大部分Bean是单例的,即绝大部分Bean不关心Scope属性
@Lazy 延迟初始化
延迟到第一次使用的时候(默认是容器启动)
3.第三方Bean管理:@Bean
自定义的bean可以用@Component及其衍生注解将对象交付于IOC容器,而来自于第三方的bean(源文件只读)中用@Bean注解。
一般创建一个配置类(用@Configuration声明)对第三方bean集中管理:
例:
@Configuration
public class CommonConfig {
@Bean
public SAXReader saxReader() {
return new SAXReader();
}
}
- 通过 @Bean 注解的 name 或 value 属性可以声明 bean 的名称,如果不指定,默认 bean 的名称就是方法名。
- 如果第三方 bean 需要依赖其它 bean 对象,直接在 bean 定义方法中设置形参即可,容器会根据类型自动装配。
SpringBoot原理
SpringBoot相较于原生Spring的优点:
- 起步依赖:大大简化了pom文件中依赖的配置
- 自动配置:简化开发时Bean的声明与配置
起步依赖:
基于Maven的依赖传递
自动配置(核心):
Spring容器启动后,自动将配置类、bean对象就存入到IOC容器中。
启动类Application的注解:@SpringBootApplication –>
@EnableAutoConfiguration–>
@Import({AutoConfigurationImportSelector.class})–>
{AutoConfigurationImportSelector.class这个实现类的String[] selectImports,其返回值即为要交给IOC容器管理的类的类名,这个方法会读取以下两个文件–>
1.spring.factories
2.AutoConfiguration.imports:配置要自动配置的类,这些类中使用@Condition的衍生注解依据设定条件进行装配。