Spring基础课三:bean 的生命周期管理

bean的创建

  1. bean 的创建有三种方式,xml,javaConfig 和自动扫描;

  2. bean 的作用域,有 Singleton,Prototype,Session,Request,默认是 Singleton;

  3. 如果需要使用 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的依赖管理

  1. @Autowired 是按类型注入的,如果 classpath 中类型有重复,可以使用 @Qualifier 来指定名称;

  2. @Resource 是按名称注入的,名称是 @Bean 的方法名,如果 @Component 或 @Service 修饰的 bean,beanName 默认是首字符小写的类名;

  3. 通过 @Autowired private ApplicationContext applicationContext 可以自动注入上下文,不需要 bean 实现ApplicationContextAware 接口;

  4. 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的生命周期

  1. bean 的生命周期,包括创建,使用,销毁整个过程;

  2. 首先 xml 或注解形式的 bean,被转化成 beanDefination 对象;

  3. 容器初始化之后,会执行 BeanFactoryPostProcessor 的 postProcessBeanFactory 方法;

  4. 如果 bean 实现了 BeanNameAware,BeanFactoryAware,或者 ApplicationContextAware 接口,会执行其setBeanName(String beanId),setBeanFactory(BeanFactory),setApplicationContext(ApplicationContext) 方法,使得 bean内部可以访问其自身的 beanName,ioc容器,应用上下文;

  5. 如果上下文中存在实现 BeanPostProcessor 的 bean,会调用其 postProcessBeforeInitialization 方法,在 bean 构造之前,执行一些逻辑;

  6. 如果上下文中存在实现 InitializingBean 接口的 bean,会调用其 afterPropertiesSet() 方法;

  7. 如果某个 bean 配置了 init-method 属性,那么会调用其 init-method 指定的方法;

  8. 根据 beanDefination 完成类加载,构造,注入;

  9. 如果有实现 BeanPostProcessor 接口的 bean,将调用其 postAfterInitialization 方法,这就完成了整个 bean 的实例化;

bean 的销毁

  1. 首先执行 @PreDestroy 修饰的方法,然后执行实现 DisposableBean 的 destory 方法,最后执行 @Bean 配置的 destory-method 指定的方法;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章