您的位置:首页 > 编程语言 > Java开发

Spring:AOP(一)生成代理对象

2015-12-08 15:24 417 查看
对于有接口的对象的可以使用JDK的动态代理

public interface UserService {

void queryUsers();

void saveUser();

void deleteUser();

}

public class UserServiceImpl implements UserService {

@Override

public void deleteUser() {

System.out.println(">> 删除一个User <<");

}

@Override

public void queryUsers() {

System.out.println(">> 查询所有User <<");

}

@Override

public void saveUser() {

System.out.println(">> 保存一个User <<");

}

}

代理工厂

public class LogJdkProxy implements InvocationHandler {

private Object target; // 目标对象

public LogJdkProxy(Object target) {

this.target = target;

}

/**

* 创建代理对象

*

* @return

*/

public Object createProxyInstance() {

return Proxy.newProxyInstance(getClass().getClassLoader(), //

target.getClass().getInterfaces(), //

this);

}

/**

* @param proxy

* 代理对象

* @param method

* 当前要执行的方法

* @param args

* 方法的参数

*/

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

System.out.println("== 开始执行操作 ==");

Object result = method.invoke(target, args); // 执行原方法

System.out.println("== 操作执行完毕 ==");

return result;

}

}

@Test

public void test() throws Exception {

UserService userService = new UserServiceImpl();

userService = (UserService) new LogJdkProxy(userService).createProxyInstance(); // 使用包装之的后的代理对象

userService.saveUser();

System.out.println();

userService.deleteUser();

System.out.println();

userService.queryUsers();

}

对于没有实现接口的对象使用cglib创建动态代理对象

// 不能是final的,否则不能生成子类

public class UserService {

protected void foo1() {


System.out.println(">> protected的方法 <<");

}

void foo2() {

foo3();

System.out.println(">> default的方法 <<");

}



private void foo3() {

System.out.println(">> private的方法 <<");

}



public static void foo4() {

System.out.println(">> static的方法 <<");

}



public final void foo5() {

System.out.println(">> final的方法 <<");

}

public void queryUsers() {

System.out.println(">> 查询所有User <<");

}

public void deleteUser() {

System.out.println(">> 删除一个User <<");

}

public void saveUser() {

System.out.println(">> 保存一个User <<");

}

}

代理工厂

public class LogCglibProxy implements MethodInterceptor {

private Object target; // 目标对象

public LogCglibProxy(Object target) {

this.target = target;

}

/**

* 创建代理对象

*

* @return

*/

public Object createProxyInstance() {

Enhancer enhancer = new Enhancer();

enhancer.setSuperclass(target.getClass()); // 设置父类类型

enhancer.setCallback(this);

return enhancer.create();

}

@Override

public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

System.out.println("== 开始执行操作 ==");

Object result = method.invoke(target, args); // 执行原方法

System.out.println("== 操作执行完毕 ==");



return result;

}

}

@Test

public void test() throws Exception {

UserService userService = new UserService();

userService = (UserService) new LogCglibProxy(userService).createProxyInstance(); // 使用包装之的后的代理对象

userService.saveUser();

System.out.println();

userService.deleteUser();

System.out.println();

userService.queryUsers();

System.out.println();



userService.foo1();

System.out.println();

userService.foo2();

System.out.println();



userService.foo4();

System.out.println();

userService.foo5();

System.out.println();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: