JAVA_Bean的管理

294 阅读2分钟

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定义方法中设置形参即可,容器会根据类型自动装配。