BeanPostProcessor 사용 소감
처음에 생각 한 방법 은 프로젝트 의 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);
}
}
그래도 잘 될 것 같 아!기록 해 봐.앞으로 감시 수요 가 있 으 면 이런 방식 을 사용 하 는 것 을 고려 할 수 있 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.