bean的创建
-
bean 的创建有三种方式,xml,javaConfig 和自动扫描;
-
bean 的作用域,有 Singleton,Prototype,Session,Request,默认是 Singleton;
-
如果需要使用 request 或者 session 作用域的 bean,只指定 scope 的 value,是不够的,还需要指定 proxyMode,因为假设 beanA 是单例的,依赖于 request 的 beanB,那么 beanA 只会被构造和注入一次,而 beanB 是每个 request,构建一次,所以就不知道如何注入,声明 proxyMode 后,注入 beanB ,就是通过代理类;
// 使用 request 的作用域,还需要 RequestContextLoaderListener
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=
ScopeProxyMode.INTERFACES/ScopeProxyMode.TARGET_CLASS CGLIB)
bean的依赖管理
-
@Autowired 是按类型注入的,如果 classpath 中类型有重复,可以使用 @Qualifier 来指定名称;
-
@Resource 是按名称注入的,名称是 @Bean 的方法名,如果 @Component 或 @Service 修饰的 bean,beanName 默认是首字符小写的类名;
-
通过 @Autowired private ApplicationContext applicationContext 可以自动注入上下文,不需要 bean 实现ApplicationContextAware 接口;
-
spring profile 可以根据不同的参数注入不同的 bean,达到多环境的差异化配置,与 maven 的 profile 不同,maven 是在构建 war 包时,进行替换,而 spring profile 是运行时生效,通过 application.properties 中的 spring.profiles.active 和spring.profiles.default 属性(spring.profiles.active优先级更高),如果都没有设置,就不会创建定义在 @Profile 下的 bean;
@Configuration
class SpringApplicationCtx{
@Bean
@Profile("dev")
public DataSource dataSource(){
return new("开发数据库"); }
@Bean
@Profile("test")
public DataSource dataSource(){
return new("测试数据库"); }
}
bean的生命周期
-
bean 的生命周期,包括创建,使用,销毁整个过程;
-
首先 xml 或注解形式的 bean,被转化成 beanDefination 对象;
-
容器初始化之后,会执行 BeanFactoryPostProcessor 的 postProcessBeanFactory 方法;
-
如果 bean 实现了 BeanNameAware,BeanFactoryAware,或者 ApplicationContextAware 接口,会执行其setBeanName(String beanId),setBeanFactory(BeanFactory),setApplicationContext(ApplicationContext) 方法,使得 bean内部可以访问其自身的 beanName,ioc容器,应用上下文;
-
如果上下文中存在实现 BeanPostProcessor 的 bean,会调用其 postProcessBeforeInitialization 方法,在 bean 构造之前,执行一些逻辑;
-
如果上下文中存在实现 InitializingBean 接口的 bean,会调用其 afterPropertiesSet() 方法;
-
如果某个 bean 配置了 init-method 属性,那么会调用其 init-method 指定的方法;
-
根据 beanDefination 完成类加载,构造,注入;
-
如果有实现 BeanPostProcessor 接口的 bean,将调用其 postAfterInitialization 方法,这就完成了整个 bean 的实例化;
bean 的销毁
- 首先执行 @PreDestroy 修饰的方法,然后执行实现 DisposableBean 的 destory 方法,最后执行 @Bean 配置的 destory-method 指定的方法;