1)BeanPostProcessor理解
对于使用过spring的人相信对BeanPostProcessor接口并不陌生,也都知道该怎么用,这里我再次的重复下。其实就是自己写一个类来实现BeanPostProcessor接口,并实现自己的业务逻辑在如下两个方法:
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
其中第一个方法就是在初始化bean之前执行的,第二个方法就是在初始化bean之后执行的。这里有一点要注意的就是,spring容器初始化bean的时候,并不是一定按照顺序执行加载的。如果有类实现了BeanPostProcessor这个接口,则先加载这个bean。然后初始化其他bean的时候就可以用实现了BeanPostProcessor这个接口的bean来进行一些初始化工作。比如自己定义的注解或者其他的功能。
2)小demo
第一个接口
package org.mm.xiaoQ;
public interface MainInterface {
public void exec();
}
第二个接口
package org.mm.xiaoQ;
public interface TopInterface{
public String beforeExec();
public String afterExec();
}
第一个接口的实现
package org.mm.xiaoQ;
import java.io.File;
import java.util.LinkedHashSet;
import java.util.Set;
public class MainInterfaceImpl implements MainInterface{
private static TopInterface top;
private static String path="D:\\12070928\\b2g0904\\Go-Or-Not\\src\\";
private static Set<Class<?>> classes;
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
File file = new File("D:/12070928/b2g0904/Go-Or-Not/src");
System.err.println(path);
classes = new LinkedHashSet<Class<?>>();
//得到項目工程下的所有類
getClasses(file);
if(classes.size()>0){
for(Class<?> c:classes){
boolean flag = isInterface(c,"org.mm.xiaoQ.TopInterface");
System.err.println("flag:"+flag);
if(flag){
top = (TopInterface) c.newInstance();
}
}
}
System.err.println("size:"+classes.size());
MainInterface mains = new MainInterfaceImpl();
if(null!=top){
top.beforeExec();
mains.exec();
top.afterExec();
}else{
mains.exec();
}
}
@Override
public void exec() {
// TODO Auto-generated method stub
System.out.println("MainInterfaceImpl:exec()");
}
/**
* 得到某文件路徑下的所有類并加到set中
* @param file
* @throws Exception
*/
public static void getClasses(File file) throws Exception{
if(file.isDirectory()){
File[] files = file.listFiles();
for(File f:files){
getClasses(f);
}
}else{
String fPath = file.getPath();
//去掉項目路徑
fPath = fPath.replace(path, "");
//把目錄分隔符換成點(.)
fPath = fPath.replace("\\",".");
//去掉(.java)後綴
fPath = fPath.substring(0, fPath.length()-5);
System.out.println(fPath);
classes.add(Thread.currentThread().getContextClassLoader().loadClass(fPath));
}
}
/**
* 判斷某個類是否實現了某個接口
* @param c
* @param szInterface
* @return
*/
public static boolean isInterface(Class<?> c, String szInterface)
{
Class<?>[] face = c.getInterfaces();
for (int i = 0, j = face.length; i < j; i++)
{
if(face[i].getName().equals(szInterface))
{
return true;
}
else
{
Class<?>[] face1 = face[i].getInterfaces();
for(int x = 0; x < face1.length; x++)
{
if(face1[x].getName().equals(szInterface))
{
return true;
}
else if(isInterface(face1[x], szInterface))
{
return true;
}
}
}
}
if (null != c.getSuperclass())
{
return isInterface(c.getSuperclass(), szInterface);
}
return false;
}
}
第二个接口的实现
package org.mm.xiaoQ;
public class TopInterfaceImpl1 implements TopInterface{
@Override
public String beforeExec() {
// TODO Auto-generated method stub
System.err.println("before:TopInterface");
return null;
}
@Override
public String afterExec() {
// TODO Auto-generated method stub
System.err.println("after:TopInterface");
return null;
}
}
其中第二个接口就相当于BeanPostProcessor接口,而第二个接口的实现就是自己对功能的扩展。相信懂java的人都应该可以看懂以上代码。到此结束
项目目录如下