Bean是由Spring IoC容器实例化、组装和管理的对象。
先通过一个简单的例子来了解把对象声明为Bean的作用。
1. Bean声明
在applicationContext.xml中配置bean的定义
<bean id="screwDriver" class="com.pxy.ScrewDriver"></bean>
//ScrewDriver.java
public class ScrewDriver {
public void use(){
System.out.println("use screwDriver");
}
}
2. Bean使用
public class TestController {
public static void main(String[] args) {
//1. 初始化容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2. 获取对象
ScrewDriver screwDriver = context.getBean("screwDriver",ScrewDriver.class);
//3. 使用对象
screwDriver.use();
}
}
3. 试一把
运行TestController文件,结果报错:
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException:
IOException parsing XML document from class path resource [applicationContext.xml];
nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml]
cannot be opened because it does not exist
就是说找不到applicationContext.xml的所在的路径,查看out文件夹:
发现文件不全,没有web目录下的文件。file->project Structure
点击Fix
再运行TestController文件,还是报错了,报错信息同上。file->project Structure->Modules
发现最右侧Source Folders没有包括WEB-INF文件夹,所以没找到WEB-INF文件夹下的配置文件,点击选中WEB-INF,再点击Sources,即可把WEB-INF标记为Sources。
再次运行TestController文件,控制台打印use screwDriver
,out目录也增加了WEB-INF文件夹下的配置文件。
从上面的例子可以看出,一个类被声明成Bean之后,它就被托付到IOC容器,啥时候实例化、实例化后怎么用,全都交给IOC容器来操心,无需程序员来管理。但程序员可以在声明Bean时通过配置项告诉IOC容器,需要实例化多少个实例,哪个实例在哪里用,怎么给对象的属性赋值等。
4. 配置Bean的实例的个数和作用范围
通过声明scope配置项,可以灵活定义Bean的作用范围。例如,当你希望每次IOC容器返回的Bean是同一个实例时,可以设置scope为singleton;当你希望每次IOC容器返回的Bean实例是一个新的实例时,可以设置scope为prototype。
<bean id="screwDriver" class="com.pxy.ScrewDriver" scope="prototype"></bean>
共有6种scope,用于描述不同的作用域。
- singleton(默认作用域)
使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。 - prototype
使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
下面四个作用域只有在web应用中才起作用。 - request
该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean。 - session
该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。 - global-session
该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。 - application
限定一个Bean的作用域为ServletContext的生命周期。
5. 配置Bean被创建和销毁时要执行的代码
Bean被托付给了IOC容器,程序员想让它在被创建或被销毁时执行一下指定的方法,就可以通过配置init-method和destroy-method实现。
- Bean创建
通过init-method指定初始化Bean对象的方法:
<bean id="screwDriver" class="main.java.com.pxy.ScrewDriver" init-method="init"></bean>
这样配置之后,Bean对象创建时就会首先调用init方法。
- Bean销毁
通过destroy-method指定Bean销毁时执行的方法:
<bean id="screwDriver" class="main.java.com.pxy.ScrewDriver" init-method="init" destroy-method="cleanup"></bean>
6.配置Bean实例化后的属性的值
配置Bean实例化后的属性的值就是要实现IOC(依赖注入),可以手动注入、自动注入或基于注解注入。