在Spring中容器在初始化某个bean的时候会有相应的生命周期,类似于Servlet,有相应的init,destory等方法

例如:如下service

1
2
3
4
5
6
7
8
9
10
11
public class UserService {
    public void init(){
        System.out.println("UserService init .....");
    }
    public void execute(){
        System.out.println("UserService execute...");
    }
    public void distory(){
        System.out.println("UserService distory...");
    }
}

想让容器在初始化该bean之前调用init方法,容器销毁之后执行distory方法,可以这样配置

1
2
3
<bean id="userService" class="com.fz.service.UserService"
      init-method="init" destroy-method="distory">
</bean>

测试代码:

1
2
3
4
5
6
7
@Test
public void getProperties(){
    ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService user = (UserService) ctx.getBean("userService");
    System.out.println(user);
    ctx.destroy();
}

注意:这里是直接使用的applicationContext接口的实现类ClassPathXmlApplicationContext,因为下面要用到ctx.destroy()方法,这个方法

在ApplicationContext接口里是没有的。

打印结果:

假如现在我们再获取一次userService对象呢?

1
2
3
4
5
6
7
8
9
@Test
public void getProperties(){
    ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService user = (UserService) ctx.getBean("userService");
    UserService user1 = (UserService) ctx.getBean("userService");
    System.out.println(user);
    System.out.println(user1);
    ctx.destroy();
}

此时,结果如下:


从上图可以看出,此时对象是获取了两次,并且这两个对象是同一个对象(因为默认的scope属性是singleton,但是init和distory都是只执行了一次。

假如现在我们再配置上scope=prototype之后呢?

1
2
3
<bean id="userService" class="com.fz.service.UserService"
    init-method="init" destroy-method="distory" scope="prototype">
</bean>

同样的测试代码,结果如下:

此时发现,现在是init了两次,也获取到两个不同的bean。但是distory却没有执行。

可以看出在配置了prototype之后,ClassPathXmlApplicationContext是监控不到bean的生存和销毁的。

总结:

1、在bean初始化之前执行某个方法:init-method="init"

2、在容器销毁之后执行某个方法: destroy-method="distory"

3、如果同一个bean获取多次,此时init-method和destroy-method都只执行一次(没有使用prototype情况下)

4、init-method、destroy-method不要和scope=prototype一起使用

5、init-method和destroy-method一般情况下我们开发人员很少使用,但是spring自己却需要使用。

   比如:在Spring的连接池中就用到了destroy-method方法,不用该数据源的时候则把它关闭。

1
2
3
4
5
6
7
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- results in a setDriverClassName(String) call -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="masterkaoli"/>
</bean>


SpringXML方式配置bean的生命周期lifecycle的更多相关文章

  1. SpringXML方式配置bean的生存范围Scope

    在一个bean的配置里面可以指定一个属性Scope,也就是bean的范围,bean的生命周期. Scope可取的值5种:singleton(默认).prototype.request.session. ...

  2. spring配置bean的生命周期

    配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  3. SpringXML方式配置bean的集合注入:list,map,properties

    新建一个bean,设置相应的集合属性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class Collecti ...

  4. SpringXML方式配置bean的自动装配autowire

    Spring的自动装配,也就是定义bean的时候让spring自动帮你匹配到所需的bean,而不需要我们自己指定了. 例如: User实体类里面有一个属性role 1 2 3 4 5 6 7 publ ...

  5. SpringXML方式配置bean的懒加载lazy-init

    lazy-init(懒加载),表示该bean在容器初始化的时候不进行初始化. 例如: <bean name="role1" class="com.fz.entity ...

  6. spring:bean的生命周期

    1.spring中bean的生命周期 (1)概念 在spring框架中,所有的bean对象都有生命周期,就是指bean的创建.初始化.服务.销毁的一个过程. (2)bean的生命周期 bean的定义 ...

  7. IoC容器装配Bean(xml配置方式)(Bean的生命周期)

    1.Spring管理Bean,实例化Bean对象 三种方式 第一种:使用类构造器实例化(默认无参数) package cn.itcast.spring.initbean; /** * 使用构造方法 实 ...

  8. Spring学习五----------Bean的配置之Bean的生命周期

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的生命周期 1.定义 2.初始化 3.使用 4.销毁 初始化和销毁的三种方式 1.实现org.springframework.beans.fa ...

  9. java Spring系列之 配置文件的操作 +Bean的生命周期+不同数据类型的注入简析+注入的原理详解+配置文件中不同标签体的使用方式

    Spring系列之 配置文件的操作 写在文章前面: 本文带大家掌握Spring配置文件的基础操作以及带领大家理清依赖注入的概念,本文涉及内容广泛,如果各位读者耐心看完,应该会对自身有一个提升 Spri ...

随机推荐

  1. Glide Picasso和Fresco的对比

    比较Picasso.Glide 和 Fresco 三种图片加载库 比较 Picasso 与 Glide 总体来说二者极为相似,有着近乎相同的 API 的使用风格,但 Glide 在缓存策略和加载 gi ...

  2. Linux下多线程下载工具myget

    [root@superdba ~]# mytgetMytget 0.0.99: A download accelerator for GNU/LinuxUsage: mytget [options]. ...

  3. oracle 分区表详解

    一.分区表的概述: Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任 ...

  4. mysql中sql语句中常见的group_concat()函数意思以及用法,oracle中与其一样的功能函数是wmsys.wm_concat()

    1.group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一 ...

  5. hadoop HA+kerberos HA集群搭建

    IP.主机名规划 hadoop集群规划: hostname IP hadoop 备注 hadoop1 110.185.225.158 NameNode,ResourceManager,DFSZKFai ...

  6. c# c++通信--命名管道通信

    进程间通信有很多种,windows上面比较简单的有管道通信(匿名管道及命名管道) 最近做个本机c#界面与c++服务进行通信的一个需求.简单用命名管道通信.msdn都直接有demo,详见下方参考. c+ ...

  7. 重新想,重新看——CSS3变形,过渡与动画②

    本篇文章主要用来归纳总结CSS3变形属性. CSS3变形属性大致可以分为以下三个部分: 变形控制属性 2D变形函数 3D变形函数 下面将对其一一进行分析: 1.变形控制属性 所谓的变形控制属性主要指“ ...

  8. NSURLSession 的学习资料

    一个nsurlsession的一些学习资料 http://www.cocoachina.com/ios/20161018/17785.html

  9. [BZOJ4756]Promotion Counting

    Description The cows have once again tried to form a startup company, failing to remember from past ...

  10. validateJarFile jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

    项目环境 Maven.Tomcat7.0.27.jdk1.8.0_111 报这个错误的原因是项目中依赖 javax.servlet-api 包和Tomcat本身的包冲突了,Tomcat本身也有这个包 ...