生活原本沉闷,但跑起来会有风。
说明:
和方式一 相比,其中的service,serviceimpl,Myascept,都一样,不同的是在工厂中的“加工”方法。所以我在这里直接写工厂类了
这第二种方法借助了spring,使用了spring中的一个增强类来实现代理功能,具体看代码中的注释:
package com.qianfeng.aop02;
import com.sun.org.apache.bcel.internal.generic.NEW;
import com.sun.org.apache.bcel.internal.generic.RETURN;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
*
* @author Administrator
* @date 2020/2/29
* 使用spring中的一个增强类来实现AOP方式
*/
public class UserFactory {
public static IUserService getIUserService() {
IUserService<Object> ius = new UserServiceImpl();
MyAscept myAscept = new MyAscept();
//1、创建增强类对象
Enhancer eh = new Enhancer();
//2、设置增强类的父类,目的是为了让他在以后可以返回一个IUserService的类型
eh.setSuperclass(IUserService.class);
//3、设置增强类的回调
eh.setCallback(new MethodInterceptor() {
/**
*
* @param o 代理对象
* @param method 被代理的方法
* @param objects 参数列表
* @param methodProxy 每个方法的代理对象
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
myAscept.before();
Object o1 = method.invoke(ius, objects);
myAscept.after();
return o1;
}
});
//通过eh对象的create()方法得到指定的对象(第二步的结果)
IUserService<Object> newius = (IUserService) eh.create();
return newius;
}
}
测试类:
package com.qianfeng.aop02;
import org.junit.Test;
/**
* Created by Administrator on 2020/2/29.
*/
public class Test02 {
@Test
public void test(){
IUserService ius = UserFactory .getIUserService();
System.out.println(ius.getAllUser());
}
}
输出结果:
before******
--------getAllUser---------
after*******
null