`
yznxing
  • 浏览: 370486 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

BeanPostProcessor使用心得

    博客分类:
  • java
阅读更多

  最近想对项目中的所有bean进行一个代理。然后监控bean得方法的使用情况。


        刚开始想的方法是:重写项目的beanFactory,然后再getBean的使用,对结果object进行一个代理,达到我的目的。但是发现重写getBean的方法,无法对bean中的依赖注入的bean(set进来的bean)进行代理。

       正好看到了beanPostProcessor的使用方法。可以在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;
    }

}
 

代理类Proxy代码如下:
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);
    }

}
 
感觉还是比较好使的!记录一下。以后再有监控的需求,可以考虑使用这种方式了!


3
0
分享到:
评论

相关推荐

    Spring BeanPostProcessor接口使用详解

    Spring BeanPostProcessor接口使用详解 Spring BeanPostProcessor接口是Spring框架中的一种后处理器接口,允许开发者在Bean初始化前后进行自定义处理。该接口提供了两个供开发者自定义的方法:...

    Java自定义注解与spring BeanPostProcessor详解

    使用自定义注解后,我们需要编写处理这些注解的逻辑,这通常是通过注解处理器或者在运行时通过反射实现的。 接下来,我们讨论Spring的BeanPostProcessor。BeanPostProcessor是Spring框架的核心组件之一,它提供了一...

    Spring 内置 BeanPostProcessor类图.zip

    理解并使用BeanPostProcessor可以极大地扩展Spring的功能,实现诸如AOP代理、属性注入增强、依赖检查等高级功能。 `BeanPostProcessor.drawio`文件可能是用Draw.io绘制的类图,详细展示了BeanPostProcessor接口与...

    详解使用Spring的BeanPostProcessor优雅的实现工厂模式

    【Spring的BeanPostProcessor与工厂模式】 在Spring框架中,BeanPostProcessor(BPP)是一个强大的接口,它允许我们自定义bean的初始化和销毁过程。BPP是在bean实例化之后,但初始化之前以及销毁之前执行特定操作的...

    spring BeanPostProcessor 生命周期

    本节通过重写这些锚点,学习如何使用BeanPostProcessor、获取各类BeanAware并且理清bean的生命周期 代码 控制台 // 控制台的输出结果 1. postProcessBeforeInstantiation被调用 2. 构造方法被调用,name:小小 3. ...

    BeanPostProcessor实现注入的@Autowired注入的对象是增强的代理对象.rar

    如果存在多个相同类型的bean,可以通过`@Qualifier`注解指定特定的bean,或者使用`@Primary`标记一个bean为首选。 接下来,我们关注`BeanPostProcessor`接口。这个接口提供了两个方法:`...

    浅谈BeanPostProcessor加载次序及其对Bean造成的影响分析

    在Spring框架中,BeanPostProcessor(BPP)是一个至关重要的组件,它允许开发者在Spring容器创建Bean实例之后和初始化之前,以及初始化之后和实例化完成之前进行额外的处理。这为自定义Bean的行为提供了强大的灵活性...

    com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean,BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor,BeanPostProcessor,ResourceLoaderA

    BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor,BeanPostProcessor,ResourceLoaderAware,InvocationHandler。 BeanPostProcessor接口的实现类如何被注册到Spring容器2.更改bean的定义...

    Spring中的后置处理器BeanPostProcessor详解

    下面我们将详细介绍 BeanPostProcessor 的作用和使用方法。 BeanPostProcessor 接口的作用 --------------------------- BeanPostProcessor 接口是 Spring 框架中一个非常重要的接口,它提供了一种方式来在bean...

    解析Java的Spring框架的BeanPostProcessor发布处理器

    在Java配置中,我们可以在配置类上使用`@Bean`注解来创建BeanPostProcessor的实例。 以下是一个简单的例子,展示了如何在Spring应用中创建和注册一个BeanPostProcessor: ```java // 定义BeanPostProcessor实现 ...

    spring4示例代码

    spring的生命周期及BeanPostProcessor的使用,注解方式创建bean 及使用Autowried标签关联类的属性 ,泛型依赖注入的使用 spring-3 演示使用动态代理模式实现面向切面编程 使用注解方式进行AOP编程及使用配置xml方式...

    Spring Annotaion Support详细介绍及简单实例

    要使用BeanPostProcessor,开发者需要编写一个实现了该接口的类,并且将该类的实例作为一个Bean注册到Spring容器中。当Spring容器启动时,它会检测到实现了BeanPostProcessor接口的Bean,并将其特殊处理。这些...

    springAOP核心组件分析

    本知识点将围绕Spring AOP的核心组件进行分析,尤其是AnnotationAwareAspectJAutoProxyCreator类的作用,以及BeanPostProcessor接口在创建AOP代理中的角色。 首先,AnnotationAwareAspectJAutoProxyCreator是Spring...

    示例代码:spring使用【XXXPostProcessor】添加bean定义,修改bean定义、代理bean

    例如,我们可以通过实现`postProcessBeforeInitialization` 方法来创建JDK动态代理,或者在`postProcessAfterInitialization` 中使用CGLIB代理。这样,我们可以在bean的方法调用前后插入额外的行为,如日志记录、...

    Spring2.5详细注解.doc

    使用 `<context:annotation-config />` 可以方便地、一次性的声明这四个 BeanPostProcessor。 传统上,我们使用 XML 文件来配置 Bean 和 Bean 之间的依赖关系。但是,使用基于注释的配置可以简化配置过程,提高开发...

    Spring笔记(第四次)1

    本篇笔记主要涉及Spring框架的BeanPostProcessor机制、@Value注解的使用以及@Autowired的自动装配。 **一、BeanPostProcessor机制** BeanPostProcessor是Spring框架中一个非常重要的接口,它允许开发者在bean的...

    springAOP核心组件分析.pdf

    这一机制是基于代理模式实现的,具体来说,它使用了JDK动态代理或者CGLIB来生成代理对象,以便在运行时为目标对象的方法调用前后插入额外的行为。 整体来看,AnnotationAwareAspectJAutoProxyCreator作为Spring AOP...

    SSH笔记-IOC容器中 Bean 的生命周期

    5. **正常使用**:Bean现在已经被完全初始化,可以被其他Bean依赖或由应用代码直接使用。 6. **销毁处理**:当Spring容器关闭时,它会调用每个可销毁Bean的`destroy()`方法,或者如果在Bean定义中指定了`destroy-...

    Spring源码分析.docx

    例如,可以使用 BeanPostProcessor 来执行 Bean 对象的自定义逻辑或检查 Bean 对象的状态。 8. InitializingBean 与 init-method 在 BeanPostProcessor 的前置处理完成后,Spring 框架会执行 InitializingBean ...

Global site tag (gtag.js) - Google Analytics