默认情况下,Spring项目启动时,会将bean对象都创建好放在IOC容器中,如果想要主动获取这些bean对象,首先注入IOC容器对象(ApplicationContext),根据需求获取对象。
注:会受到作用域及延迟初始化的影响
获取对象的三种形式
- 根据name获取bean:Object getBean(String name)
- 根据类型获取bean:<T> T getBean(Class<T> requiredType)
- 根据name获取bean(带类型转换):<T> T getBean(String name, Class<T> requiredType)
bean的作用域
在Spring框架中,bean支持五种作用域,后三种在web环境下才会生效。
作用域 | 说明 |
singleton | 容器内同名称的bean只有一个实例(单例)(默认) |
prototype | 每次使用该bean时会创建新的实例(非单例) |
request | 每个请求范围内会创建新的实例(web环境) |
session | 每个会话范围内会创建新的实例(web环境) |
application | 每个应用范围内会创建新的实例(web环境) |
可以通过@Score注解来进行配置作用域
注:
- 默认的singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟至第一次使用时)。
- prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
- 实际开发中,大部分的Bean都是单例的,也就是说大部分的Bean不需要配置scope属性。
第三方Bean
- 如果要管理的bean对象来自于第三方(不是自定义的),是无法使用@Component及衍生注解声明bean的,这时候我们就需要用到@Bean注解。
- 若要管理第三方bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类。
引入第三方Bean方案
方案三:
在第三方类中创建一个配置类
创建一个类继承ImportSelector接口
创建注解,在注解中引入继承ImportSelector的类
最后在启动类上加上所创建的注解名
总结
当我们使用自定义的类时,使用@Component注解及其衍生出来的注解。
当我们使用第三方类时,使用@Bean注解。