方式一、二公共代码
编写一个接口
package com.cloud.daili;
public interface UserService {
void queryUser();
void saveUser();
void deleteUser();
}
接口实现类
package com.cloud.daili;
public class UserServiceImpl implements UserService{
@Override
public void queryUser() {
System.out.println("UserServiceImpl.queryUser()");
}
@Override
public void saveUser() {
System.out.println("UserServiceImpl.saveUser()");
}
@Override
public void deleteUser() {
System.out.println("UserServiceImpl.deleteUser()");
}
}
方式一:模拟代理方式
代码模拟
package com.cloud.daili;
public class UserServiceImplProxy implements UserService{
private UserService userService;
public UserServiceImplProxy(UserService userService){
this.userService = userService;
}
@Override
public void queryUser() {
System.out.println("执行之前");
userService.queryUser();
System.out.println("执行之后");
}
@Override
public void saveUser() {
userService.saveUser();
}
@Override
public void deleteUser() {
userService.deleteUser();
}
}
方式二:实现接口
InvocationHandler接口
package com.cloud.daili;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
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);
}
@Override
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;
}
}
方式一、二测试方法
package com.cloud.daili;
import org.junit.Test;
public class MyTest {
/**
* 测试第一种代理方法
*/
@Test
public void test1(){
UserService userService = new UserServiceImpl();
userService = new UserServiceImplProxy(userService);
userService.queryUser();
}
/**
* 测试第二种代理方法
*/
@Test
public void test2(){
UserService userService=new UserServiceImpl();
userService=(UserService) new LogJdkProxy(userService).createProxyInstance();
userService.queryUser();
}
}
方式三:实现MethodInterceptor接口
UserService2.java
package com.cloud.daili;
public class UserService2 {
protected void method1(){
System.out.println("UserService.method1()");
}
void method2(){
System.out.println("UserService.method2()");
}
public void querUsers() {
System.out.println("UserServiceImpl.querUsers()");
}
public void saveUser() {
System.out.println("UserServiceImpl.saveUser()");
}
public void deleteUser() {
System.out.println("UserServiceImpl.deleteUser()");
}
}
LogCglibJdkProxy.java
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class LogCglibJdkProxy implements MethodInterceptor{
//目标对象
private Object target;
public LogCglibJdkProxy(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;
}
}
测试方法
import org.junit.Test;
public class MainTest {
@Test
public void test1() throws Exception {
UserService us=new UserService();
us=(UserService) new LogCglibJdkProxy(us).createProxyInstance();
us.querUsers();
System.out.println();
us.deleteUser();
System.out.println();
us.querUsers();
System.out.println();
us.method1();
System.out.println();
us.method2();
System.out.println();
}
}