Bean的管理
1、获取 Bean
默认的情况之下,Spring项目在启动时,会把 bean 都创建好放在 IOC 容器中进行管理,如果想要主动获取这些bean ,可以通过如下方式:
//IOC容器对象:
@Autowired
private ApplicationContext applicationContext;
1.1根据name 获取bean:
Object getBean(String name);
//例:
MyService bean = (MyService)applicationContext.getBean("MyService");
1.2根绝类型获取bean:
<T> getBean(Class<T> requiredType)
//例:
MyService bean = applicationContext.getBean(MyService.class);
1.3根据name获取bean (带类型转换):
<T> T getBean(String name,Class<T> requiredType)
//例:
MyService bean = applicationContext.getBean("MyService" , MyService.class)
注意: 这里得到的三个bean的对象都是同一个,因为都是由IOC容器控制管理的bean的对象
2、Bean的作用域
Spring中支持 五种 Bean的作用域 ,后三种在web环境才有效:
| 作用域 | 说明 |
|---|---|
| singleton | 容易内 同名称 的bean 只有一个实例 (单例)(默认) |
| prototype | 每次使用该bean 时会创建新的实例(非单例) |
| request | 每个请求范围内会创建新的实例(web环境中,了解即可) |
| session | 每个会话范围内会创建新的实例(web环境中,了解即可) |
| application | 每个应用范围内会创建新的实例(web环境中,了解即可) |
可以通过@Scope 注解来进行配置作用域:
@Scope("prototype")
默认是 singleton 的bean ,在容器启动时就会被创建,可以使用 @Lazy注解,来延迟初始化(延迟到第一次使用时)
prototype的bean ,每一次使用该bean 的时候都会创建一个新的实例。
实际开发当中,绝大部分的bean都是单例的,也就是说大部分的bean都不需要配置 scope属性。
3、第三方Bean
@Component @Controller @Service @Repository 就可以声明Bean对象
@Bean注解:如果要管理的bean对象来自于第三方(不是自定义的),是无法使用 @Component 及衍生注解声明 bean 的 ,就需要用到@Bean注解了。
//例子:
@Configuration // 标明是配置类
public class Config(){
@Bean //将第三方Bean 交给ioc容器进行管理 可以通过 @Bean注解的 name/value 属性来指定bean的名称,如果未指定,默认是方法名。
public MyBean myBean(){
return new MyBean();
}
}
如果通过第三方Bean , 需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。