Spring的Bean声明、初始化、使用、销毁

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,用于描述不同的作用域。

  1. singleton(默认作用域)
    使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
  2. prototype
    使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
    下面四个作用域只有在web应用中才起作用。
  3. request
    该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean。
  4. session
    该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
  5. global-session
    该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。
  6. 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(依赖注入),可以手动注入、自动注入或基于注解注入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值