/**
* 目标类接口
* @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();
}
}