• Bean配置项
  • Bean的作用域
  • Bean的生命周期
  • Bean的自动装配及Aware接口

一、Bean的配置项

  1. Id:这个Bean的唯一标识
  2. class:具体要实例化的那一个类
  3. Scope:范围,作用域
  4. Constructor arguments:构造器的参数(构造器注入)
  5. properties:属性(设值注入)
  6. Autowiring mode:自动装配的模式
  7. lazy-initialization mode:懒加载的模式
  8. Initialization/destruction method:初始化和销毁的方法

 我们在使用时,理论上只有class是必须的,其他都可以不配置,但是为了获取方便,一般也需要配置id。

二、Bean的作用域

  1. singleton:单例,指的是一个Bean容器只存在一份,IOC容器每次返回的是同一个Bean实例。
  2. prototype:使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
  3. request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
  4. session:该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
  5.  global-session:该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。

三、Bean的生命周期

  • 定义:就是在XML配置文件中配置了这个bean的id,class等
  • 初始化:spring启动并加载配置文件里的bean
  • 使用:通过配置文件取出bean并使用
  • 销毁:回收bean容器中这个bean的所有实例

详细介绍一下bean的初始化和销毁

初始化:初始化有两种方式,第一种方式是让该类实现org.springframework.beans.factory.InitializingBean接口,覆盖afterPropertiesSet方法,第二种方式是在配置文件中配置init-method。下面配置文件中的init-method和destroy-method是在你的com.chj.spring.InitAndDestroySeqBean这个类里面写的。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     xmlns:context="http://www.springframework.org/schema/context"  
     xsi:schemaLocation="http://www.springframework.org/schema/beans  
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
 http://www.springframework.org/schema/context  
 http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
 
   <context:annotation-config/>  
   
   <bean id="initAndDestroySeqBean" class="com.chj.spring.InitAndDestroySeqBean" init-method="initMethod" destroy-method="destroyMethod"/>
</beans>

销毁:也是两种,第一种方式是让该类实现org.springframework.beans.factory. DisposableBean接口,覆盖destroy方法,第二种是在配置文件中配置destroy-method。

public class InitializingDisposableInit implements InitializingBean,DisposableBean {
	@Override
	public void destroy() throws Exception {
		System.out.println("执行InitializingDisposableInit: destroy");
	}
	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("执行InitializingDisposableInit: afterPropertiesSet");
	}
	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				"classpath:beans-impl.xml");
		context.close();
	}
}

无论是实现InitializingBean/DisposableBean接口,还是在配置文件中配置初始化和销毁,都是针对某一个确定的bean。还有一种方式就是配置全局的默认初始化和销毁方法,需要在配置文件中添加default-init-method="init"和default-destory-method="destory"。

如果同时使用了三种方式,即某个类继承了InitializingBean和DisposableBean接口,又在XML配置文件中配置了default-init-method="init"和default-destory-method="destory",最后还在该类的配置语句中配置了init-method="initMethod" destroy-method="destroyMethod",那程序该如何执行呢?

答案是: InitializingBean,DisposableBean两个接口的方法destroy() 、afterPropertiesSet()会分别先于配置语句中配置的init-method="initMethod" destroy-method="destroyMethod"的两个方法执行,default-init-method="init"和default-destory-method="destory"配置的两个方法被init-method="initMethod" destroy-method="destroyMethod"的两个方法覆盖了,不会执行!

四、SpringBean之Aware接口

Spring中提供了一些以Aware结尾的接口(比如BeanNameAware),Aware,是感应和感知的意思。当bean实现了对应的Aware接口时,BeanFactory会在生产bean时根据它所实现的Aware接口,给bean注入对应的属性,从而让bean获取外界的信息。实现了Aware接口的bean在被初始化之后,可以获取相应资源,通过Aware接口,可以对Spring相应资源进行操作(有些一定要慎重,比如ApplicationContextAware),为对Spring进行简单扩展提供了方便的入口。

ApplicationContextAware:当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。

BeanNameAware:如果某个bean需要访问配置文件中本身bean的id属性,这个Bean类通过实现该接口,在依赖关系确定之后,初始化方法之前,提供回调自身的能力,从而获得本身bean的id属性,该接口提供了void setBeanName(String name)方法实现,需要指出的是该方法的name参数就是该bean的id属性,加调该setBeanName方法可以让bean获取得自身的id属性。 

ResourceLoaderAware:ResourceLoaderAware回调接口负责将ResourceLoader对象注入到当前的受管Bean实例中,其定义如下。当受管Bean获得ResourceLoader对象后,它便能够通过它获得各种资源。
五、自动装配(Autowiring)

Spring引入Autowire(自动装配)机制就是为了解决<bean>标签下<property>标签过多的问题,<property>标签过多会引发两个问题:

  • 如果一个Bean中要注入的对象过多,比如十几二十个(这是很正常的),那将导致Spring配置文件非常冗长,可读性与维护性差
  • 如果一个Bean中要注入的对象过多,配置麻烦且一不小心就容易出错

因此,为了解决使用<property>标签注入对象过多的问题,Spring引入自动装配机制,简化开发者配置难度,降低xml文件配置大小。

使用Autowire去除<property>标签

下面来看一下使用Autowire去除<property>,autowire有两处点:

  • 可以配置在<beans>根标签下,表示对全局<bean>起作用,属性名为default-autowire
  • 可以配置在<bean>标签下,表示对当前<bean>起作用,属性名为autowire

通常都是在<beans>根标签下配置自动装配比较多,default-autowire有四种取值:

  • no:默认,即不进行自动装配,每一个对象的注入比如依赖一个<property>标签
  • byName:按照beanName进行自动装配,使用setter注入
  • byType:按照bean类型进行自动装配,使用setter注入
  • constructor:与byType差不多,不过最终属性通过构造函数进行注入

这里研究的是去除<property>标签,因此第一种不管;constructor装配不太常用,因此这里也不管,重点看最常用的byName与byType,至于具体使用哪种根据自己的业务特点进行相应的设置。

byName意为在spring配置文件中查询beanName与属性名一致的bean并进行装配,若类型不匹配则报错;

byType意为在spring配置文件中查询与属性类型一致的bean并进行装配,若有多个相同类型则报错。