关于BeanPostProcessor的理解

11 篇文章 0 订阅
6 篇文章 1 订阅

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的人都应该可以看懂以上代码。到此结束

项目目录如下



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值