- Bean配置项
- Bean的作用域
- Bean的生命周期
- Bean的自动装配及Aware接口
一、Bean的配置项
- Id:这个Bean的唯一标识
- class:具体要实例化的那一个类
- Scope:范围,作用域
- Constructor arguments:构造器的参数(构造器注入)
- properties:属性(设值注入)
- Autowiring mode:自动装配的模式
- lazy-initialization mode:懒加载的模式
- Initialization/destruction method:初始化和销毁的方法
我们在使用时,理论上只有class是必须的,其他都可以不配置,但是为了获取方便,一般也需要配置id。
二、Bean的作用域
- singleton:单例,指的是一个Bean容器只存在一份,IOC容器每次返回的是同一个Bean实例。
- prototype:使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
- request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
- session:该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
- 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并进行装配,若有多个相同类型则报错。