/**
* AOP:面向切面编程。
* 1.对业务逻辑的各个部分进行隔离
* 2.耦合度降低
* 3.提高程序的可重用性,
* 4.同时提高了开发的效率
* 主要的功能: 日志记录,性能统计,安全控制,事务处理,异常处理
* 功能: 让关注点代码与业务代码分离!(关注点,重复代码就叫做关注点)(关注点形成的类,就叫切面(类)!)
* 体现:代理模式
*/
-
静态代理
/**
* 方法接口
*/
public interface IUserDao {
void save();
}
/**
* 接口实现
*/
public class UserDao implements IUserDao {
@Override
public void save() {
System.out.println("存储数据");
}
}
/**
* 代理类
*/
public static class UserDaoProxy implements IUserDao {
private UserDao userDao;
public UserDaoProxy(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
System.out.println("检测数据类型是否符合标准");
userDao.save();
System.out.println("打印日志");
}
}
/**
* 具体方法调用
*/
public static void main(String[] args) {
//静态代理
new UserDaoProxy(new UserDao()).save();
}
2、jdk动态代理
/**
* Created on 2019/4/5.
* jdk动态代理
* 实现类,所以必须使用接口
* 缺点:jdk动态代理,必须是面向接口,目标业务类必须实现接口
*
* @author Grak
* @since 1.0
*/
public class JDKProxy implements InvocationHandler {
// 这其实业务实现类对象,用来调用具体的业务方法
private Object target;
public JDKProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
System.out.println("调用开始处理");
result = method.invoke(target, args);
System.out.println("调用结束处理");
return result;
}
public static void main(String[] args) {
IUserDao userDao = new UserDao();// 被代理对象
JDKProxy invocationHandlerImpl = new JDKProxy(userDao);//代理方法
ClassLoader loader = userDao.getClass().getClassLoader();//类信息
Class<?>[] interfaces = userDao.getClass().getInterfaces();//接口
// 主要装载器、绑定类,接口,代理方法
BaseSaticProxy.IUserDao newProxyInstance = (BaseSaticProxy.IUserDao) Proxy.newProxyInstance(loader, interfaces, invocationHandlerImpl);
newProxyInstance.save();
}
}
3、CGLIB动态代理
/**
* Created on 2019/4/5.
* CGLIB动态代理
* 不要求委托类必须实现接口,底层采用asm字节码生成框架生成代理类的字节码
*
* @author Grak
* @since 1.0
*/
public class CGLIBProxy implements MethodInterceptor {
private Object targetObject;
public Object getInstance(Object target) {
// 设置需要创建子类的类
this.targetObject = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("开启事物");
Object result = methodProxy.invoke(targetObject, objects);
System.out.println("关闭事物");
// 返回代理对象
return result;
}
public static void main(String[] args) {
CGLIBProxy cglibProxy = new CGLIBProxy();
BaseSaticProxy.IUserDao userDao = (BaseSaticProxy.IUserDao) cglibProxy.getInstance(new BaseSaticProxy.UserDao());
userDao.save();
}
}