BeanPostProcessor 사용 소감

4141 단어 springbeanxmlsun
최근 에 프로젝트 의 모든 bean 을 대리 하고 싶 습 니 다.그리고 bean 의 방법 사용 상황 을 감시 합 니 다.
        처음에 생각 한 방법 은 프로젝트 의 beanFactory 를 다시 쓴 다음 에 getBean 을 사용 하여 결과 object 를 대리 하여 나의 목적 을 달성 하 는 것 이다.그러나 getBean 을 다시 쓰 는 방법 을 발견 하면 bean 의 의존 주입 bean (set 로 들 어 온 bean) 을 대리 할 수 없습니다.
       마침 빈 포스트 프로세서 의 사용법 을 보 았 다.spring 의 xml 에 BeanPostProcessor 를 설정 한 다음 에 모든 bean 을 대리 처리 할 수 있 습 니 다. 제 수 요 를 만족 시 킬 수 있 습 니 다!
BeanPostProcessor 코드 는 다음 과 같 습 니 다:
import java.lang.reflect.Proxy;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

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

import com.alibaba.common.logging.Logger;
import com.alibaba.common.logging.LoggerFactory;

public class MyBeanPostProcesser implements BeanPostProcessor {
    private Map map = new ConcurrentHashMap(100);
    private static final Logger log = LoggerFactory.getLogger("myBeanPostProcesser");

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        MyProxy proxy = new MyProxy();

        if (beanName.contains("DB")) {
            return bean;
        }

        if (bean.toString().contains("Proxy")) {
            log.info(beanName + "    ,       !");
            return bean;
        }
        if (beanName.contains("TransactionTemplate")) {
            log.info(beanName + " TransactionTemplate ,       !   :" + bean);
            return bean;
        }

        if (map.get(beanName) != null) {
            log.info(beanName + "     ,       !");
            return map.get(beanName);
        }
        proxy.setObj(bean);
        proxy.setName(beanName);
        Class[] iterClass = bean.getClass().getInterfaces();
        if (iterClass.length > 0) {
            Object proxyO = Proxy.newProxyInstance(bean.getClass().getClassLoader(), iterClass, proxy);
            map.put(beanName, proxyO);
            return proxyO;
        } else {
            log.info(beanName + "         !");
            return bean;
        }
    }

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

}
 
프 록 시 클래스 프 록 시 코드 는 다음 과 같 습 니 다.
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import com.alibaba.common.logging.Logger;
import com.alibaba.common.logging.LoggerFactory;

import sun.reflect.Reflection;

public class MyProxy implements InvocationHandler {
    private static final Logger log = LoggerFactory.getLogger("myself");

    private Object obj;

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("begin================" + "bean    【" + name + "】   【" + method.getName() + "】========="
                + obj.getClass());
        log.error("begin================" + "bean    【" + name + "】   【" + method.getName() + "】========="
                + obj.getClass());
        return method.invoke(obj, args);
    }

    public void printDetail(String detail) {
        log.error(detail);
    }

}
 
그래도 잘 될 것 같 아!기록 해 봐.앞으로 감시 수요 가 있 으 면 이런 방식 을 사용 하 는 것 을 고려 할 수 있 습 니 다!

좋은 웹페이지 즐겨찾기