Spring初始化Bean的过程

最近打算写一个spring-mvc的插件,便于做接口测试,既然是插件,那就是零耦合。知道spring有几个接口,BeanPostProcessor, InitializingBean, DisposableBean, ApplicationContextAware, BeanFactoryPostProcessor,这几个接口也涉及到bean的生命周期。
贴代码:

调用类:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31


public interface Person {

void eatMeat();

}

public class Student implements Person {

private Fork fork;



public Student() {

System.out.println("Student.Constructor");

}



public Fork getFork() {

return fork;

}



public void setFork(Fork fork) {

this.fork = fork;

System.out.println("Student.setFork");

}



public void eatMeat() {

this.fork.forkMeat();

System.out.println("Student.eatMeat");

}

public void init() {

System.out.println("Student.init");

}

}

被依赖的类:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25


public interface Fork {

void forkMeat();

}

public class WoodFork implements Fork {

String name;



public String getName() {

return name;

}

public void setName(String name) {

System.out.println("WoodFork.setName");

this.name = name;

}

public WoodFork() {

System.out.println("WoodFork.Constructor");

}



@Override

public void forkMeat() {

System.out.println("WoodFork.forkMeat");

}

}

bean的几个接口实现类:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53


import org.springframework.beans.BeansException;

import org.springframework.beans.factory.DisposableBean;

import org.springframework.beans.factory.InitializingBean;

import org.springframework.beans.factory.config.BeanFactoryPostProcessor;

import org.springframework.beans.factory.config.BeanPostProcessor;

import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

public class MyBeanPostProcessor implements BeanPostProcessor, InitializingBean, DisposableBean, ApplicationContextAware, BeanFactoryPostProcessor {

public String name;



public void setName(String name) {

this.name = name;

System.out.println("MyBeanPostProcessor.setName");

}



public MyBeanPostProcessor() {

System.out.println("MyBeanPostProcessor.Constructor");

}



public void setApplicationContext(ApplicationContext applicationContext)

throws BeansException {

System.out.println("MyBeanPostProcessor.setApplicationContext");

}



public Object postProcessBeforeInitialization(Object bean, String beanName)

throws BeansException {

System.out.println("MyBeanPostProcessor.postProcessBeforeInitialization for " + bean.getClass().getSimpleName());

return bean;

}



public Object postProcessAfterInitialization(Object bean, String beanName)

throws BeansException {

System.out.println("MyBeanPostProcessor.postProcessAfterInitialization for " + bean.getClass().getSimpleName());

return bean;

}



public void destroy() throws Exception {

System.out.println("MyBeanPostProcessor.destory");

}



public void afterPropertiesSet() throws Exception {

System.out.println("MyBeanPostProcessor.afterPropertiesSet");

}

@Override

public void postProcessBeanFactory(

ConfigurableListableBeanFactory beanFactory) throws BeansException {

System.out.println("MyBeanPostProcessor.postProcessBeanFactory");

}

}

spring配置:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


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

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd " >

<bean id="woodFork" class="com.kaige.spring.WoodFork" >

<property name="name" value="wood"></property>

</bean>

<bean id="student" class="com.kaige.spring.Student" init-method="init">

<property name="fork" ref="woodFork"></property>

</bean>

<bean class="com.kaige.spring.MyBeanPostProcessor">

<property name="name" value="processor"></property>

</bean>

</beans>

测试:


1

2

3

4

5

6

7

8

9

10


import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

public static void main(String[] args) {

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");

Student s = (Student)ctx.getBean("student");

s.eatMeat();

ctx.registerShutdownHook();

System.out.println("end");

}

}

结果:
MyBeanPostProcessor.Constructor
MyBeanPostProcessor.setName
MyBeanPostProcessor.setApplicationContext
MyBeanPostProcessor.afterPropertiesSet
MyBeanPostProcessor.postProcessBeanFactory
WoodFork.Constructor
WoodFork.setName
MyBeanPostProcessor.postProcessBeforeInitialization for WoodFork
MyBeanPostProcessor.postProcessAfterInitialization for WoodFork
Student.Constructor
Student.setFork
MyBeanPostProcessor.postProcessBeforeInitialization for Student
Student.init
MyBeanPostProcessor.postProcessAfterInitialization for Student
WoodFork.forkMeat
Student.eatMeat
end
MyBeanPostProcessor.destory

时间: 2024-11-01 07:54:07

Spring初始化Bean的过程的相关文章

简单的Spring的bean实例化过程

以XmlBeanFactory为例,最简单的取bean方式是:   BeanFactory factory = new XmlBeanFactory(new FileSystemResource("D:\\workspace\\JavaApplication2\\src\\javaapplication2\\spring\\beans.xml")); Car obj = (Car)factory.getBean("car");  Bean的配置文件内容也很简单:  

spring入门(4) spring中Bean的生命周期总结

Spring中Bean的生命周期,在学习spring的过程中bean的生命周期理解对学习spring有很大的帮助,下面我就分别介绍在 ApplicationContext和BeanFactory中Bean的生命周期. 1.在ApplicationContext中Bean的生命周期 生命周 期执行的过程如下: 1.需找所有的bean根据bean定义的信息来实例化bean 2.使用依赖注入,spring按bean 定义信息配置bean的所有属性 3.若bean实现了BeanNameAware接口,工

Spring中bean的基本xml配置

xml   在spring容器内拼凑bean叫作装配.装配bean的时候,你是在告诉容器,需要哪些bean,以及容器如何使用依赖注入将它们配合在一起.    理论上,bean装配可以从任何资源获得,包括属性文件,关系数据库等,但xml是最常见的spring 应用系统配置源.Spring中的几种容器都支持使用xml装配bean,包括:    XmlBeanFactory ,    ClassPathXmlApplicationContext ,    FileSystemXmlApplicatio

[Spring] 声明Bean

定义如下接口: package com.springinaction.springidol; public interface Performer { void perform() throws PerformanceException; } 1 创建spring配置 spring容器提供了两种配置bean的方式,使用xml文件或java注解.一个典型的spring xml配置文件如下: <?xml version="1.0" encoding="UTF-8"

spring之Bean的生命周期

Bean的生命周期: Bean的定义--Bean的初始化--Bean的使用--Bean的销毁 Bean的定义 Bean 是 Spring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Bean 也可以不是指定的实体类,这就是抽象 Bean . Bean的初始化 Spring中bean的初始化回调有两种方法 一种是在配置文件中声明init-method="init",然后在一个实体类中用init()方法来初始化 另一种是实现Ini

spring的bean到底在什么时候实例化

问题描述 今天面试遇到这个问题,面试官问我spring的bean在什么时候实例化,我说在被依赖的时候实例化,例如set注入或者构造注入的时候,然后他问我如果在XML里就配置一个<bean id="" name="">这样这个bean是否会被实例化,如果是在什么时候实例化,我回答不会实例化.后面聊到spring的事务管理器,他跟我说那事务管理器没有注入,在什么时候实例化,我没回答上来,不知道大家有啥想法? 问题补充:那事务管理器什么时候实例化? 解决方案

Java中Spring获取bean方法小结_java

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢? Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制.BeanFactory使管理不同类型的Java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供

Java类获取Spring中bean的5种方式_java

获取Spring中的bean有很多种方式,再次总结一下:第一种:在初始化时保存ApplicationContext对象 ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId"); 说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring.第二种:通过Spring提供的工

Spring初始化Map的问题

问题描述 action中定义的mapprivateMap<String,String>myMap=newHashMap<String,String>();publicMap<String,String>getMyMap(){returnmyMap;}publicvoidsetMyMap(Map<String,String>myMap){this.myMap=myMap;} xml配置如下<beanid="complaintAction&quo