Java Proxy
代码实现
- UserService.java
public interface UserService {
/**
* 查询所有
*/
void queryAll();
}
- UserServiceImpl.java
public class UserServiceImpl implements UserService {
@Override
public void queryAll() {
System.out.println("query all...");
}
}
- UserServiceProxy.java
public class UserServiceProxy implements UserService {
/**
* 被代理的服务
*/
private UserService userService;
@Override
public void queryAll() {
if(userService == null) {
userService = new UserServiceImpl();
}
before();
userService.queryAll();
after();
}
private void before() {
System.out.println("before...");
}
private void after() {
System.out.println("after...");
}
}
测试
public class UserServiceProxyTest {
@Test
public void queryAllTest() {
UserService userService = new UserServiceProxy();
userService.queryAll();
}
}
- 结果
before...
query all...
after...
Java dynamic proxy
- DefaultInvocationHandler.java
代码实现
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DefaultInvocationHandler implements InvocationHandler {
/**
* 目标文件
*/
private final Object target;
public DefaultInvocationHandler(final Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("DefaultInvocationHandler Start...");
Object result = method.invoke(target, args);
System.out.println("DefaultInvocationHandler End...");
return result;
}
}
测试
- CASE ONE
package com.ryo.spring.aop.service.impl;
import com.ryo.spring.aop.handler.DefaultInvocationHandler;
import com.ryo.spring.aop.service.UserService;
import org.junit.Test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class UserServiceImplTest {
/**
* Method: queryAll()
*/
@Test
public void queryAllTest() throws Exception {
final UserService target = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start...");
Object result = method.invoke(target, args);
System.out.println("end...");
return result;
}
});
proxy.queryAll();
}
}
测试结果
start...
query all...
end...
- CASE TWO
@Test
public void queryAllTwoTest() {
final UserService target = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new DefaultInvocationHandler(target));
proxy.queryAll();
}
测试结果
DefaultInvocationHandler Start...
query all...
DefaultInvocationHandler End...
Java CgLib
如果类没有接口,则 Java 动态代理就行不通了。
此时,cglib 就可以上场了。
简介
jar 引入
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
代码实现
- UserServiceImpl.java
public class UserServiceImpl {
public void queryAll() {
System.out.println("query all...");
}
}
- CglibProxy.java
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
*
* @author houbinbin
* @date 2017/1/5
*/
public class CglibProxy implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib intercept start...");
//通过代理子类调用父类的方法
Object object = methodProxy.invokeSuper(o, objects);
System.out.println("cglib intercept end...");
return object;
}
/**
* 获取代理类
* @param clazz 类信息
* @return 代理类结果
*/
public Object getProxy(Class clazz){
Enhancer enhancer = new Enhancer();
//目标对象类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术创建目标对象类的子类实例作为代理
return enhancer.create();
}
}
测试
/**
* Method: queryAll()
* 依赖于CGLIB,不需要interface
*/
@Test
public void queryAllTest() throws Exception {
UserServiceImpl proxy = (UserServiceImpl) new CglibProxy().getProxy(UserServiceImpl.class);
proxy.queryAll();
}
结果:
cglib intercept start...
query all...
cglib intercept end...