java动态代理demo

jasmine 于 2019-02-08 发布

DTO

/**
 * 增强注解
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface NeedLog {
}

/**
 * @description: 接口
 */
public interface UserService {
    void getUserInfo(String id);
}

/**
 * @description: 实现类
 */
@NeedLog
public class UserServiceImpl implements UserService {
    @Override
    public void getUserInfo(String id) {
        System.out.println("---sjn---查询用户信息:" + id);
    }
}

增强器

/**
 * @description: 增强接口
 */
public interface EnhancerHandler {
    default Object afterDo(Object t){
        return t;
    }
    default void preDo(){}
}

public class LogEnhancerHandler implements EnhancerHandler {
    @Override
    public Object afterDo(Object res) {
        System.out.println("---LogEnhancerHandler---afterDo---");
        return "---LogEnhancerHandler---afterDo---";
    }

    @Override
    public void preDo() {
        System.out.println("---LogEnhancerHandler---preDo---");
    }
}

public class CheckEnhancerHandler implements EnhancerHandler {
    @Override
    public Object afterDo(Object t) {
        System.out.println("---check---afterDo");
        return t;
    }

    @Override
    public void preDo() {
        System.out.println("---check---preDo");
    }
}

BeanFactory

public class BeanFactory {
    /**
     * 单例池
     */
    Map<String, Object> singles = new HashMap();
    Map<String, EnhancerHandler> enhancers = new HashMap();

    public void register(String name, Object bean) {
        singles.put(name, bean);
    }

    public void addEnhancers(EnhancerHandler[] ens) {
        for (EnhancerHandler enhancer : ens) {
            String name = enhancer.getClass().getName();
            enhancers.put(name, enhancer);
        }
    }

    public Object getBean(String beanName) {
        return singles.get(beanName);
    }

    /**
     * 初始化对类进行增强,然后将代理的类放到单例池中
     */
    public void init() {
        singles.forEach((name, bean) -> {
            if (bean.getClass().isAnnotationPresent(NeedLog.class)) {
                ProxyFactory proxyFactory = new ProxyFactory();
                UserService uProxy = (UserService) proxyFactory.createProxy(bean, bean.getClass(), enhancers.values().stream().toArray(EnhancerHandler[]::new));
                singles.put(name, uProxy);
            }
        });
    }
}

动态代理工厂

public class ProxyFactory {
    public static Object createProxy(Object target, Class<?> clazz, EnhancerHandler[] enhancerHandlers) {
        return Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(), clazz.getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                preProcess(enhancerHandlers);
                Object res = method.invoke(target, args);
                afterProcess(res, enhancerHandlers);
                return res;
            }
        });
    }

    private static void afterProcess(Object res, EnhancerHandler[] enhancerHandlers) {
        for (EnhancerHandler enhancerHandler : enhancerHandlers) {
            enhancerHandler.afterDo(res);
        }
    }

    private static void preProcess(EnhancerHandler[] enhancerHandlers) {
        for (EnhancerHandler enhancerHandler : enhancerHandlers) {
            enhancerHandler.preDo();
        }
    }
}

测试类

public class ProxyTest {
    public static void main(String[] args) {
        UserService im = new UserServiceImpl();
        BeanFactory beanFactory = new BeanFactory();
        //注册UserService
        beanFactory.register("UserService",im);

        LogEnhancerHandler logEnhancerHandler = new LogEnhancerHandler();
        CheckEnhancerHandler checkEnhancerHandler = new CheckEnhancerHandler();
        EnhancerHandler[] enhancerHandlers = {checkEnhancerHandler, logEnhancerHandler};

        //注册增强器
        beanFactory.addEnhancers(enhancerHandlers);

        beanFactory.init();
        UserService userService = (UserService) beanFactory.getBean("UserService");
        userService.getUserInfo("张三");
    }
}