1. bean组件的装配
bean的装配,即bean对象的创建及属性赋值,容器创建bean对象后再传递给代码。代码通过ApplicationContext的getBean()方法,从容器获取指定的bean实例(容器默认会调用bean类的无参构造器),创建空值的实例对象。
XML装配方式是Spring刚刚出现的时候最主要的装配方式,使用XML装配方式,需要将用到的所有bean都写入到XML文件中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="someService" class="com.lyj.main.service.SomeServiceImpl"/>
</beans>
其他的装配方式有自动化(注解)装配bean(最常用最高效)、Java代码装配bean(用于将第三方库中的组件装配到你的应用中)。
2. bean的作用域
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean的实例化,还可以通过scope属性,为Bean指定特定的作用域,Spring支持5种作用域。
2.1 singleton(默认实现)
单例模式,即在整个Spring容器中,只有一个实例。在容器ApplicationContext对象创建时,会创建好所有单例对象,并放到Map中,所以singleton的作用域与容器对象一致。优点是获取对象的速度快,缺点是会占用一定的内存。
<bean id="someService" class="com.lyj.main.service.SomeServiceImpl"/>
<bean id="someService" class="com.lyj.main.service.SomeServiceImpl" scope="singleton"/>
2.2 prototype
原型模式,每次使用getBean()方法获取bean对象时,都是一个新的实例对象。在调用容器ApplicationContext的getBean()方法时,才进行装配,所以作用域延迟到了使用对象的时候。优点是不占用内存,缺点是获取对象的速度慢。
<bean id="someService" class="com.lyj.main.service.SomeServiceImpl" scope="prototype"/>
2.3 request
对于每次HTTP请求,都将会产生一个不同的Bean实例。
2.4 session
对于每个不同的HTTP session,都将产生一个不同的Bean实例。
2.5 globalSession
类似标准的http session作用域,不过仅仅在基于portlet的web应用当中才有意义。
3. bean的生命始末
可以为Bean定制对象创建后的初始化行为,也可以为Bean定制销毁前的生命行为,方法原型:
public void methodName(){}
3.1 定制初始化行为(对象创建后调用)
在配置文件的标签中,增加"init-method"属性,指定初始化方法的名称,可以完成构造方法的功能,例如属性赋值、初始化其他对象等等。一般把构造方法中的耗时操作放到"init-method"中,方便快速创建对象,并调用对象的业务方法(但是业务方法执行还是会在"init-method"后)。
<bean id="someService" class="com.lyj.main.service.SomeServiceImpl" init-method="init"/>
3.2 定制销毁行为(对象销毁前调用)
在配置文件的标签中,增加"destroy-method"属性,指定销毁处理方法的名称。一般用于清除对象,释放内存。(注意:Bean对象必须为单例的,因为只有是单例的,容器在关闭时才能找到该对象)
<bean id="someService" class="com.lyj.main.service.SomeServiceImpl" destroy-method="tearDown"/>
Demo的完整调用代码:
// 配置文件路径
String configLocation = "applicationContext.xml";
// 创建容器对象
ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
// 获取bean对象
SomeService someService = (SomeService) context.getBean("someService");
// 调用对象的业务方法
someService.doSome();
// 关闭容器
((ClassPathXmlApplicationContext)context).close();