spring bean的作用域和生命周期

来源:互联网 发布:网络布控坐火车 编辑:程序博客网 时间:2024/03/29 04:40
spring bean的作用域和生命周期
容纳bean
(1)bean工厂:最简单的容器,提供了基础的依赖注入支持,创建各种类型的bean
(2)应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务
 
 
从ApplicationContext上下文容器中获取bean和从bean工厂容器中获取bean的区别“
 
bean的作用域

Spring Framework支持五种作用域(其中有三种只能用在基于web的)。

singleton

在每个Spring IoC容器中一个bean定义对应一个对象实例。

prototype

一个bean定义对应多个对象实例。

request

在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的SpringApplicationContext情形下有效。

session

在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext情形下有效。

global session

在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的SpringApplicationContext情形下有效。

 
  
 
BeanFactory方式(已废弃)
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
        UserService userService = (UserService)factory.getBean("userService");
        userService.sayHello();
此种方式实例化该容器时,bean不会被创建(lazy,速度慢,省内存),只有当你去使用bean时才进行加载。
移动设备使用BeanFactory(省内存)。其他九成用ApplicationContext
使用ApplicationContext时,并且为singleton时(prototype不可!),配置的bean不管你用不用,都被实例化(early,好处就是预加载,缺点就是耗内存)
 
 
 
或许bean的方法:
1     ClassPathXmlApplicationContext:从类路径中加载
2     FileSystemXmlApplicationContext: 从文件系统加载
3     XmlWebApplicationContext:从web系统中加载
 
 
 
 
 
bean的生命周期(scope=singleton为例说明)
(1)实例化(当程序加载beans.xml文件时),把我们的bean实例化到内存中,也可用factory-method 来调用有参的构造器
(2)设置属性,前提是有setter才能成功
(3)bean实现BeanNameAware接口,则可以通过setBeanName获取id号
(4)bean实现BeanFactoryAware接口,则可以获取beanFactory
(5)bean实现ApplicationContextAware接口,则调用setApplicationContext
(6)bean如果和一个后置处理器关联,则会调用两个方法,见下面的程序示例,执行”before“
(7)实现InitializingBean接口,则会调用afterPropertiesSet()方法
(8)调用定制(只有所配置的bean有,非aop)的初始化方法,xml bean里面写init-method
(9)后置处理器的”after“
(10)使用bean
(11)容器关闭
(12)bean实现DisposableBean的destroy()方法关闭数据连接,socket,文件流等
(13)调用定制的销毁方法  xml bean里面写 destroy-method
实际开发中用(1)(2)(6)(9)(10)(11)
BeanFactory 的话少了(5)(6)(9)
 
 
 
 MyBeanPostProcessor.java
复制代码
package com.myBeanPostProcessor;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;/** * Created by balfish on 15-3-29. */class MyBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {     System.out.println("postProcessBeforeInitialization 函数被调用");           return o;    }    @Override    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {     System.out.println("postProcessAfterInitialization 函数被调用");           return o;     }}
复制代码

 

 

 

applicationContext.xml的变化

 <!--配置自己的后置处理器,类似过滤器-->
    <bean id="myBeanPostProcessor"

class="com.myBeanPostProcessor.MyBeanPostProcessor" />

 

 

应用场景举例

1 记录每个对象实例化的时间

2过滤每个调用ip

3给所有对象添加属性,或者函数(面向切面aop)

 

0 0
原创粉丝点击