1. 程式人生 > 其它 >spring -6 補充:BeanPostProcessor實現aop編碼(基於JDK動態代理)

spring -6 補充:BeanPostProcessor實現aop編碼(基於JDK動態代理)

技術標籤:筆記javaaopproxyspring

定義原始物件的方法

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");
    }

結果: