文档章节

Spring Bean 初始化过程

abcijkxyz
 abcijkxyz
发布于 2016/07/08 16:31
字数 786
阅读 1
收藏 0
点赞 0
评论 0

Spring 的几个接口

1.InitializingBean接口,在初始化Bean时容器会调用前者的afterPropertiesSet()方法

2.DisposableBean接口,在析构Bean时容器会调用destroy()方法,在下面的例子中好像没有体现出来(革命尚未成功,同志仍需努力)

3.BeanFactoryAware接口,当它被BeanFactory创建后,它会拥有一个指向创建它的BeanFactory的引用

4.BeanPostProcessor接口,这个接口两个方法,postProcessBeforeInitialization(Object bean, String beanName)和postProcessAfterInitialization(Object bean, String beanName) 在其他Bean构造前后执行

5.BeanFactoryPostProcessor接口,Spring IoC容器允许BeanFactoryPostProcessor在容器实际实例化任何其它的bean之前读取配置元数据,并有可能修改它

 

下面来看一下例子

  1. package com.test;
  2. public class User {
  3.     private String name;
  4.     
  5.     public String getName() {
  6.         return name;
  7.     }
  8.     public void setName(String name) {
  9.         System.out.println("User类 setName方法");
  10.         this.name = name;
  11.     }
  12.     public void init() throws Exception {
  13.         System.out.println("User类init 方法");
  14.         
  15.     }
  16.     public User(){
  17.         System.out.println("User类构造方法");
  18.     }
  19.     
  20. }

 

  1. package com.test;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.beans.factory.BeanFactory;
  4. import org.springframework.beans.factory.BeanFactoryAware;
  5. import org.springframework.beans.factory.DisposableBean;
  6. import org.springframework.beans.factory.InitializingBean;
  7. import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
  8. import org.springframework.beans.factory.config.BeanPostProcessor;
  9. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  10. public class JavaBean implements InitializingBean,DisposableBean,BeanFactoryAware,BeanPostProcessor ,BeanFactoryPostProcessor{
  11.     private String name;
  12.     public JavaBean(){
  13.         System.out.println("JavaBean类构造方法");
  14.     }
  15.     @Override
  16.     public void afterPropertiesSet() throws Exception {
  17.         System.out.println("InitializingBean 接口 afterPropertiesSet方法");
  18.         
  19.     }
  20.     @Override
  21.     public void destroy() throws Exception {
  22.         System.out.println("DisposableBean 接口 destroy方法");
  23.         
  24.     }
  25.     public void init() throws Exception {
  26.         System.out.println("JavaBean类init 方法");
  27.         
  28.     }
  29.     @Override
  30.     public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
  31.         System.out.println("BeanFactoryAware 接口 setBeanFactory方法");
  32.         
  33.     }
  34.     @Override
  35.     public Object postProcessAfterInitialization(Object bean, String beanName)
  36.             throws BeansException {
  37.         System.out.println(beanName+":BeanPostProcessor 接口 postProcessAfterInitialization方法");
  38.         return bean;
  39.     }
  40.     @Override
  41.     public Object postProcessBeforeInitialization(Object bean, String beanName)
  42.             throws BeansException {
  43.         System.out.println(beanName+":BeanPostProcessor 接口 postProcessBeforeInitialization 方法");
  44.         return bean;
  45.     }
  46.     public String getName() {
  47.         return name;
  48.     }
  49.     public void setName(String name) {
  50.         System.out.println("JavaBean类setName 方法");
  51.         this.name = name;
  52.     }
  53.     @Override
  54.     public void postProcessBeanFactory(
  55.             ConfigurableListableBeanFactory beanFactory) throws BeansException {
  56.         System.out.println("BeanFactoryPostProcessor 接口 postProcessBeanFactory 方法");
  57.     }
  58.     
  59. }

 

  1. package com.test;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Test {
  5.     /**
  6.      * @param args
  7.      */
  8.     public static void main(String[] args) {
  9.         System.out.println("加载Spring配置文件");
  10.          ApplicationContext context =  
  11.                 new ClassPathXmlApplicationContext("spring.xml"); 
  12.          System.out.println("加载Spring配置文件结束");
  13.          JavaBean bean=(JavaBean)context.getBean("javaBean");
  14.          System.out.println("获取name属性:"+bean.getName());
  15.          System.out.println("程序结束");
  16.     }
  17. }

Spring配置文件

 

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  3. <beans>
  4.     <bean id="javaBean" class="com.test.JavaBean" init-method="init">
  5.         <property name="name" value="zhjb"></property>
  6.     </bean>
  7.     <bean id="user" class="com.test.User" init-method="init">
  8.         <property name="name" value="zhjb" ></property>
  9.     </bean>
  10. </beans>

运行结果如下:

加载Spring配置文件
JavaBean类构造方法
JavaBean类setName 方法
BeanFactoryAware 接口 setBeanFactory方法
InitializingBean 接口 afterPropertiesSet方法
JavaBean类init 方法
BeanFactoryPostProcessor 接口 postProcessBeanFactory 方法
User类构造方法
User类 setName方法
user:BeanPostProcessor 接口 postProcessBeforeInitialization 方法
User类init 方法
user:BeanPostProcessor 接口 postProcessAfterInitialization方法
加载Spring配置文件结束
获取name属性:zhjb
程序结束

 

从结果进行分析,Bean的初始化顺序应该是

1.构造函数

2.初始化属性

3.如果实现了BeanFactoryAware 接口执行setBeanFactory方法

4..如果实现了InitializingBean 接口执行afterPropertiesSet方法

5.如果在配置文件中指定了init-method,那么执行该方法

6..如果实现了BeanFactoryPostProcessor 接口在 “new”其他类之前执行 postProcessBeanFactory 方法(通过这个方法可以改变配置文件里面的属性值的配置)

7.如果实现了BeanFactoryPostProcessor 接口,那么会在其他bean初始化方法之前执行postProcessBeforeInitialization 方法,之后执行postProcessAfterInitialization方法

感觉奇怪的地方就是没有执行destroy方法,目前还不知道原因在什么地方

本文转载自:http://blog.csdn.net/yuwenruli/article/details/8550691

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6195
码字总数 1876
作品 0
深圳
项目经理
深入理解Spring源码(一)-IOC容器的定位,载入,注册

前言:Spring源码继承,嵌套层次非常多,读起来非常容易晕,小伙伴们在看文章的时候一定要跟着文章的思路自己去源码里点一点,看一看,并且多看几次。就会越来越清晰。下面开始正题 1.Spring...

Meet相识_bfa5 ⋅ 05/01 ⋅ 0

2.3 IoC容器的初始化过程

简单来说,IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个启动包括BeanDefinition的Resource定位、载入和注册。 (1) Resource定位过程: 指的是BeanDefinition的资源定位,由Res...

edwardGe ⋅ 05/27 ⋅ 0

Spring IOC 实现原理

Spring IOC 实现原理 IOC: Inversion of Control ,即 "控制反转" , 不是什么技术,而是一种思想。原先需要自行实例化的对象, 交给IOC容器去实现。那么控制反转,谁被控制? 谁被反转 ? 在...

起个名忒难 ⋅ 05/17 ⋅ 0

Spring Bean注册解析(一)

Spring是通过IoC容器对Bean进行管理的,而Bean的初始化主要分为两个过程:Bean的注册和Bean实例化。Bean的注册主要是指Spring通过读取配置文件获取各个bean的声明信息,并且对这些信息进行注...

张旭峰 ⋅ 05/12 ⋅ 0

Spring中关于bean的作用域与生命周期

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什...

忻胜霄 ⋅ 06/07 ⋅ 0

spring源码解析上下文初始化ContextLoaderListener

前言 从本篇文章开始主要介绍spring源码解析相关的spring上下文初始化、bean定义解析、beanFactory创建、初始化、bean定义注册到beanFactory、bean实例化、依赖注入流程中相关的步骤,由于s...

天河2018 ⋅ 05/10 ⋅ 0

Spring是怎么解决循环依赖的

什么是循环依赖? 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图: 注意,这里不是函数的循环调用,是对...

Jack1991 ⋅ 04/27 ⋅ 0

SpringMVC源码剖析(三)- DispatcherServlet的初始化流程

在我们第一次学Servlet编程,学java web的时候,还没有那么多框架。我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根据需要重写一下doGet,doPost方法,跳转到我们定义好的...

相见欢 ⋅ 2013/01/15 ⋅ 20

Spring Boot 启动过程分析

1. Spring Boot 入口——main方法 从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以分析 Spring Boot 启动过程,我们就从这两...

徐志毅 ⋅ 05/27 ⋅ 0

Spring3.2 MVC 分析

Spring3.2 MVC 分析: SpringMVC现在应该用得很广泛了,其配置清晰,灵活度,定制能力等都是很强的,相比Struts2也是胜过一筹,还是从源码来分析一下,SpringMVC为我们做了什么。 先从配置文...

ihaolin ⋅ 2014/02/03 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 30分钟前 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 38分钟前 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 44分钟前 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 54分钟前 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

容器之查看minikue的environment——minikube的环境信息

执行如下命令 mjduan@mjduandeMacBook-Pro:~/Docker % minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.100:2376"export DOCKER_CERT_PATH="/U......

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

mysql远程连接不上

设置了root所有hosts远程登录,可是远程登录还是失败,原因可能如下: 登录本地数据库 mysql -uroot -p123456 查询用户表 mysql> select user,host,password from mysql.user; 删除密码为空的...

冰公子 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部