文档章节

spring Bean实例生命周期行为

_
 _桃子_
发布于 2015/12/06 18:13
字数 482
阅读 153
收藏 9

    花了一下午的时间,整理测试了一下Bean的生命周期行为.

    首先排一个序。完整的测试代码后面贴出来。

  1. 加载当前Bean的构造器    

  2. 加载@Autowired注入的依赖关系的构造器。(也就是加载依赖的Bean)

  3. 加载普通的依赖Bean构造器(<property name="person" ref="person"/>)

  4. 注入依赖关系<property name="person" ref="person"/>

  5. 执行@PostConstruct注解的方法

  6. 执行afterPropertiesSet    

  7. 执行 init-method

  8. 执行 服务逻辑

  9. 执行@PreDestroy注解(需要销毁Bean才会执行)

  10. 执行destroy(需要销毁Bean才会执行)     

  11. 执行destroy-method(需要销毁Bean才会执行

    一般实际生产都采用零配置,为了测试通过XML加载指定Bean。

代码 :

Car.java 依赖Bean,通过@Autowired注入House实力

package com.peach.springtest.model;

public class Car {

    public Car() {
        System.out.println("Test car constructor");
    }

}

House.java 主Bean

package com.peach.springtest.model;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


public class House implements InitializingBean, DisposableBean {

    private Person person;

    @Autowired
    private Car car;

    public House() {
        System.out.println("Test house Constructor");
    }

    public void status() {
        System.out.println("There is one person and one car");
    }

    @Autowired

    public void setPerson(Person person) {
        System.out.println("Test House setPerson");
        this.person = person;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Test house afterPropertiesSet");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("Test house postConstruct");
    }

    public void initMethod() {
        System.out.println("Test house initMethod");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("Test house preDestroy");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("Test house destroy");
    }

    public void destroyMethod() {
        System.out.println("Test house destroyMethod");
    }
}

Person.java 通过XML property ref 注入到House实力

package com.peach.springtest.model;

public class Person {

    public Person() {
        System.out.println("Test Person constructor");
    }

}

SpringDriver.java  加载spring 容器

package com.peach.springtest;

import com.peach.springtest.model.House;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDriver {

    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        House house = (House) context.getBean("house");
        house.status();
        context.registerShutdownHook();
    }
}

ApplicationContext.xml  

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-4.2.xsd">

    <!--<context:component-scan base-package="com.peach.springtest.*"/>-->

    <context:annotation-config />
    <bean id="house" class="com.peach.springtest.model.House" init-method="initMethod" destroy-method="destroyMethod">
        <property name="person" ref="person"/>
    </bean>
    <bean id="person" class="com.peach.springtest.model.Person"/>
    <bean id="car" class="com.peach.springtest.model.Car"/>

</beans>


执行结果:


© 著作权归作者所有

_
粉丝 1
博文 5
码字总数 2988
作品 0
成都
私信 提问
Spring中管理Bean依赖注入之后和Bean销毁之前的行为

对于Singleton作用域的Bean,Spring容器将会跟踪它们的生命周期,容器知道何时实例化结束、何时销毁。Spring可以管理Bean在实例化结束之后和Bean销毁之前的行为。 Bean依赖关系注入之后的行为...

摆渡者
2014/03/06
5.4K
0
Java程序员从笨鸟到菜鸟之(七十)细谈Spring(三)IOC和spring基本配置详解

对于IoC 的一些知识点,相信大家都知道他在Spring框架中所占有的地位,应该可以算的上是核心之一吧,所以IOC是否理解清楚,决定了大家对Spring整个框架的理解 Ioc的理解 spring 的两个核心概...

长平狐
2012/11/12
145
0
Spring(Lifecycle)

Jetty/Spring初始化: Jetty/Spring api: Bean生命周期之初始化: 1.容器寻找Bean的定义信息并且将其实例化。 2.容器对Bean进行依赖注入,Spring按照Bean定义信息配置Bean的所有属性。 3.如果B...

赵-猛
2017/04/11
55
0
Spring Bean的生命周期

1.当调用者通过getBean(beanName)向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在实例化Bean之前,将调用接...

我吃草莓
2014/04/10
234
0
SpringFramework核心技术一(IOC:Bean的范围)

Bean的范围 当你创建一个bean定义时,你创建一个配方来创建由该bean定义定义的类的实际实例。bean定义是一个配方的想法很重要,因为它意味着,就像一个类一样,您可以从一个配方创建许多对象...

王木东
2018/05/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于谷歌浏览器崩溃,打不开任何界面

首先:谷歌浏览器右键打开属性,在箭头所指的位置复制粘贴 -no-sandbox。(需要空一格再写入 -no-sandbox) 其次:你打开谷歌浏览器可以看到如下提醒,提醒你,稳定性和安全性会有所下降,但...

Raphael98
15分钟前
0
0
java 删除文件夹下的文件

/** * 删除已经下载过的文件 * @param path * @return */ @ApiOperation(value = "删除已经下载过的Excel",httpMethod="",notes="") @GetMapping("/deleteExcel") public Object downLoad(@......

简小姐
15分钟前
1
0
如何安装GMP,MPFR,MPC,ELF,无需共享库?

如何使用当前版本, 使用正确版本的依赖关系,不使用包管理器(如yum,rpm,apt,dpkg)并且不使用共享库,来逐块安装GCC(GNU编译器集合)? 典型的开发人员可能希望以典型的方式安装GCC,使...

mskk
19分钟前
1
0
Rancher + VMware PKS实现全球数百站点的边缘K8S集群管理

Sovereign Systems是一家成立于2007年的技术咨询公司,帮助客户将传统数据中心技术和应用程序转换为更高效的、基于云的技术平台,以更好地应对业务挑战。曾连续3年提名CRN,并且在2012年到2...

RancherLabs
24分钟前
1
0
docker修改log-driver后启动失败问题解决

vi /etc/sysconfig/docker 去掉--log-driver=journald 重启docker,重新run一个容器

abowu
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部