一、静态代理设计模式
静态代理:代理类通过实现与目标对象相同的接口,并在类中维护一个代理对象
优点:
可以做到在不修改目标对象的功能前提下,对目标功能扩展.
缺点:
因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护。
interface PojoDao {
void add();
}
class UserDao implements PojoDao {
@Override
public void add() {
System.out.println("添加用户");
}
}
class UserService implements PojoDao {
private PojoDao pojoDao;
public UserService(PojoDao pojoDao) {
this.pojoDao = pojoDao;
}
@Override
public void add() {
System.out.println("添加用户前,增加逻辑判断");
pojoDao.add();
}
}
public class StaticProxy {
public static void main(String[] args) {
UserDao userDao = new UserDao();
UserService userService = new UserService(userDao);
userService.add();
}
}
二、动态代理模式-基础jdk实现
动态代理:利用拦截器(继承InvocationHandler )加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
基础JDK实现
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface PojoDao {
void add();
}
class UserDao implements PojoDao {
@Override
public void add() {
System.out.println("添加用户");
}
}
class UserDaoHandler<T> implements InvocationHandler {
T dao;
public UserDaoHandler(T dao) {
this.dao = dao;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理-添加业务逻辑处理");
Object result = method.invoke(dao, args);
return result;
}
}
class DynamicProxy {
public static void main(String[] args) {
PojoDao pojoDao = new UserDao();
InvocationHandler userDaoHandler = new UserDaoHandler<PojoDao>(pojoDao);
PojoDao person = (PojoDao) Proxy.newProxyInstance(PojoDao.class.getClassLoader(),
new Class<?>[] { PojoDao.class }, userDaoHandler);
person.add();
}
}
三、动态代理模式-基础CGLIB实现
通过开源项目CGLIB实现: 对代理对象类生成的class文件加载进来,通过修改其字节码生成子类来处理。
可以通过maven项目快速依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
案例:
TODO