2020-02-27(SpringAOP5个创建方法之第一个)

1、第一个创建方法,原生jdk提供的Proxy

原生jdk提供了proxy.newProxyInstance()方法,来设置代理类,具体代理如下:
原生的jdk必须提供接口 这里定义了IUserService:

package com.gaojian.aop1;

import java.util.List;

public interface IUserService <T>{

    List<T> getAllUser();

    boolean saveUser(T obj);

    boolean deleteUser(int uid);

    boolean updateUser(T obj);
}

以下是,接口的实现类:

package com.gaojian.aop1;

import java.util.List;

public class UserServiceImpl implements IUserService<Object> {
    @Override
    public List<Object> getAllUser() {
        System.out.println("======getAllUser()=======");
        return null;
    }

    @Override
    public boolean saveUser(Object object) {
        System.out.println("======saveUser()=======");
        return false;
    }

    @Override
    public boolean deleteUser(int uid) {
        System.out.println("======deleteUser(int uid)=======");
        return false;
    }

    @Override
    public boolean updateUser(Object obj) {
        System.out.println("======updateUser(Object obj)=======");
        return false;
    }
}

以下代码是切面类,负责代码的拦截

package com.gaojian.aop1;

/**
 * 切面类,负责拦截方法,并且植入代码
 */
public class MyAspect {
    public void before(){
        System.out.println("========before========");
    }

    public void after(){
        System.out.println("========after==============");
    }
}

最重点的代码,就是设置代理类对象

package com.gaojian.aop1;

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

/**
 * 一个代理类
 */
public class UserFactory {
    /**
     *  返回一个父接口类型
     * @return
     */
    public static IUserService getUserService(){
        //创建实现类对象,并且在下面传入,以开始被代理类给代理
        IUserService us = new UserServiceImpl();
        //创建切面类,给被代理类植入需求代码
        MyAspect ma = new MyAspect();
        IUserService ius = (IUserService) Proxy.newProxyInstance(us.getClass().getClassLoader(), us.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *
             * @param proxy  被代理的对象,us
             * @param method   被代理的方法
             * @param args      被代理方法的参数列表
             * @return          每个方法最终返回值
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                ma.before();
                Object obj = method.invoke(us,args);
                ma.after();
                return obj;
            }
        });
        return ius;
    }
}

以下是测试类

package com.gaojian.aop1;

import org.junit.Test;

public class TestAOP1 {
    @Test
    public void test(){
        IUserService us = UserFactory.getUserService();
        System.out.println(us.getAllUser());
        System.out.println(us.saveUser(new Object()));
        System.out.println(us.deleteUser(1));
        System.out.println(us.updateUser(new Object()));
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容