spring -6 补充:BeanPostProcessor实现aop编码(基于JDK动态代理)

定义原始对象的方法

public interface IUserDao {
    public void save(Person person);
    public void query(String name);
}
public class UserDaoImpl implements IUserDao{
    @Override
    public void save(Person person) {
        System.out.println("dao save...");
    }

    @Override
    public void query(String name) {

        System.out.println("dao query name "+ name);
    }
}

BeanPostProcessor的实现类

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

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ExtraFunction implements BeanPostProcessor {
    /**
     * 实现aop对原始对象的加工
     * #########基于JDK动态代理
     * @param bean  spring框架将会把原对象传入
     * @param beanName spring创建原对象的id
     * @return 我们要返回代理对象(增强对象)
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("proxy before real method executing...");
                Object ret= method.invoke(bean,args);
                System.out.println("proxy after real method executing...");
                return ret;
            }
        };
        //返回的对象id还是那个id,但是对象变了。
//        通过动态代理获得代理对象
        return Proxy.newProxyInstance(ExtraFunction.class.getClassLoader(),bean.getClass().getInterfaces(),handler);
    }
}

XML配置文件中:

<bean id="extra" class="aop.ExtraFunction"></bean>
    <bean id="userDao" class="core.UserDaoImpl"></bean>

test代码中:

 /**
     * 测试:工厂得到代理对象
     */
    @org.junit.Test
    public void test5(){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
        IUserDao userDao = (IUserDao) ctx.getBean("userDao");
        userDao.query("jackson");
    }

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值