spring代理

/**
 * 目标类接口
 * @author Administrator
 */
public interface UserService {
    public void pay();
}
public class UserServiceImpl implements UserService {
    @Override
    public void pay() {
        System.out.println("正在支付。。。。请稍候");
    }
}
/**
 * 切面类
 * @author Administrator
 */
public class MyAspect {
    public void before(){
        System.out.println("前切入。。。");
    }
    
    public void after(){
        System.out.println("后切入。。。");
    }
}
/**
 * 代理类
 * @author Administrator 等同于spring的 BeanFactory
 */
public class MyBeanFactory {
    // 开始创建代理对象
    // public UserService getBean(){}
    // jdk动态代理基于反射,依赖接口。
    // java.lang.reflect.Proxy;
    // Proxy.newProxyInstance(
    // 1.类加载器
    // 2.要代理的这个类实现的所有接口
    // 3.处理动态调用的InvocationHandler (){
    // };
    // );

    public UserService getBean() {
        // 1.准备一个要被代理的对象
        final UserService service = new UserServiceImpl();
        // 2.准备一个切面类对象
        final MyAspect myAspect = new MyAspect();

        // 3.开始创建代理对象
        UserService proxService = (UserService) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),
                UserServiceImpl.class.getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        myAspect.before();
                        Object obj = method.invoke(service, args);
                        return obj;
                    }
                });
        return proxService;
    }
}
/**
 * cglib动态代理
 * 1.目标类:业务逻辑是支付
 * 2.切面类:MyAspect
 * 3.代理类:MyBeanFactory
 */
public class UserServiceImpl {
    public void pay() {
        System.out.println("正在支付。。。。请稍候");
    }
}

/**
 * 练习: 使用cglib实现手动代理:字节码增强代理 直接在字节码上做文章, 而jdk是基于动态反射,创建类的速度更快,但局限于接口。
 * 目标类:UserServiceImpl 代理类:MyBeanFactory 前切入模式 切面类:MyAspect
 * 提示:cglib需要spring-core-3.2.0.jar 包含了cglib.jar和asm.jar这两 实现步骤见注释
 * 
 */
public class MyBeanFactory {
    public static UserServiceImpl createService() {
        // 1.目标类
        final UserServiceImpl userService = new UserServiceImpl();
        // 2切面类
        final MyAspect myAspect = new MyAspect();
        // 3.代理类 ,采用cglib,底层创建目标类的子类
        // 3.1 核心类,相当于jdk的Proxy类
        Enhancer enhancer = new Enhancer();
        // 3.2 确定要代理的类的父类 success:funtion(){ alert(123)}
        enhancer.setSuperclass(userService.getClass());
        // 3.2 设置回调函数 需要出传入一个 new MethodInterceptor()等效 jdk invoke()
        enhancer.setCallback(new MethodInterceptor() {

            @Override // 参数:1.代理对象;2.要调用的方法;3.方法的参数 4.方法的代理。
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
                    throws Throwable {
                myAspect.before();
                // 执行目标类的方法
                Object obj = method.invoke(userService, args);
                //
                myAspect.after();
                return obj;
            }
        });
        // 4.创建代理
        UserServiceImpl proxService = (UserServiceImpl) enhancer.create();
        return proxService;

    }

    public static void main(String[] agrs) {
        createService().pay();
    }
}

 


posted @ 2018-09-19 21:26  我的改变,拜您所赐。  阅读(268)  评论(0)    收藏  举报