天天看點

使用CGLIB實作AOP功能

package com.saly.jdk.aop;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;

import net.sf.cglib.proxy.MethodInterceptor;

import net.sf.cglib.proxy.MethodProxy;

public class CGlibProxyFactory implements MethodInterceptor{

    private Object targetObject;

    public Object createProxyIntance(Object targetObject){

        this.targetObject = targetObject;

        Enhancer enhancer = new Enhancer();

        //繼承了目标類,覆寫非final方法,代理類是目标類的子類

        enhancer.setSuperclass(this.targetObject.getClass());//

        //設定回調

        enhancer.setCallback(this);//回調intercept

        return enhancer.create();

    }

    @Override

    public Object intercept(Object proxy, Method method, Object[] args,

            MethodProxy methodProxy) throws Throwable {

        PersonServiceBean bean = (PersonServiceBean) this.targetObject;

        Object result = null;

        if(bean.getUser()!=null){

            method.invoke(targetObject, args);

        }

        return result;

    }

}

無須實作接口

public class PersonServiceBean {

    private String user = null;

    public PersonServiceBean(){

    }

    public String getUser() {

        return user;

    }

    public PersonServiceBean(String user){

        this.user = user;

    }

    public String getPersonName(Integer personId) {

        System.out.println("我是 getPersonName方法");

        return "salyfan";

    }

    public void save(String name) {

        System.out.println("我是save()方法");

    }

    public void update(String name, Integer personId) {

        System.out.println("我是update()方法");

    }

}

@Test

    public  void aopCGlibProxyFactory(){

        CGlibProxyFactory factory = new CGlibProxyFactory();

        PersonServiceBean service = (PersonServiceBean) factory.

            createProxyIntance(new PersonServiceBean("fan"));

        service.save("fanf");

    }