Spring攻略学习笔记 --创建Bean后处理器 (一)

2014-11-24 11:27:37 · 作者: · 浏览: 23

一、知识点


Bean后处理器允许在初始化回调方法前后进行额外的Bean处理。Bean后处理器的主要特性是逐个处理IoC容器中的所有Bean实例,而不只是单个Bean实例。一般来说,Bean后处理器用于检查Bean属性的有效性,或根据特定条件修改Bean属性。

Bean后处理器的基本要求是实现BeanPostProcessor接口。通过实现postProcessBeforeInitialization() 和 postProcessAfterInitialization() 方法,可以在初始化回调方法前后处理所有Bean。Spring将在调用初始化回调方法前后向这两个方法传递每个Bean实例,步骤如下:

(1)构造函数或者工厂方法创建Bean实例

(2)为Bean属性设值和Bean引用

(3)调用感知接口中定义的设值方法

(4)将Bean实例传递给每个Bean后处理器中的postProcessBeforeInitialization()方法

(5)调用初始化回调方法

(6)将Bean实例传递给每个Bean后处理器中的postProcessAfterInitialization()方法

(7)Bean准备就绪,可以使用

(8)容器关闭时,调用销毁回调函数

使用Bean工厂作为IoC容器时,Bean后处理器只能编程注册,即通过addBeanPostProcessor方法注册。如果使用应用程序上下文,只需要在Bean配置文件中声明一个处理器实例,它就会自动注册。


二、代码示例

StorageConfig标记接口

[java]
package com.codeproject.jackie.springrecipesnote.springadvancedioc;

/**
* 标记接口,让Bean后处理器区分应检查的Bean
* @author jackie
*
*/
public interface StorageConfig {
public String getPath();
}

package com.codeproject.jackie.springrecipesnote.springadvancedioc;

/**
* 标记接口,让Bean后处理器区分应检查的Bean
* @author jackie
*
*/
public interface StorageConfig {
public String getPath();
} Cashier类
[java]
package com.codeproject.jackie.springrecipesnote.springadvancedioc;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

import org.springframework.beans.factory.BeanNameAware;

/**
* Cashier类实现BeanNameAware感知接口和,StorageConfig标记接口
* @author jackie
*
*/
public class Cashier implements BeanNameAware, StorageConfig {
private String name;
private BufferedWriter writer;
private String path;

public void setPath(String path) {
this.path = path;
}

public void openFile() throws IOException {
File file = new File(path, name + ".txt");
FileWriter fw = new FileWriter(file, true);
writer = new BufferedWriter(fw);
}

public void checkout(ShoppingCart cart) throws IOException {
double total = 0;
for (Product product : cart.getItems()) {
total += product.getPrice();
}
writer.write(new Date() + "\t" + total + "\r\n");
writer.flush();
}

public void closeFile() throws IOException {
writer.close();
}

@Override
public String getPath() {
return path;
}

@Override
public void setBeanName(String beanName) {
this.name = beanName;
}
}

package com.codeproject.jackie.springrecipesnote.springadvancedioc;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

import org.springframework.beans.factory.BeanNameAware;

/**
* Cashier类实现BeanNameAware感知接口和,StorageConfig标记接口
* @author jackie
*
*/
public class Cashier implements BeanNameAware, StorageConfig {
private String name;
private BufferedWriter writer;
private String path;

public void setPath(String path) {
this.path = path;
}

public void openFile() throws IOException {
File file = new File(path, name + ".txt");
FileWriter fw = new FileWriter(file, true);
writer = new BufferedWriter(fw);
}