AOP
什么是AOP
- 面向切面编程(方面),利用
AOP
可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 - 通俗说:不通过修改源代码的基础上,在主干功能里面添加新功能
- 使用登录例子说明
AOP
例如:在上述的登录功能中,需要添加一个用户权限的判断的功能,前提在不修改原来的代码基础上实现,这时就可以使用我们的动态代理模式进行实现。
AOP
底层原理实现有两种方式:
- 有接口情况,使用
JDK
动态代码 - 没有接口情况,使用
CGLIB
动态代码
AOP
基于jdbk
动态代理的实现
使用JDK
动态代理,使用Proxy
类里面的方法创建代理对象
动态代理实现步骤:
- 代理对象和真实对象实现相同的接口
- 调用
Proxy
类中静态方法newProxyInstance
方法 - 使用代理对象调用方法
method.invoke("传入真实对象","参数")
方法【这个方法目的是调用需要被增强的方法】 - 对方法进行增强
static Object newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h)
返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。
第一个参数是:当前类的加载路径,类名.Class.getClassLoader
第二个参数是:代理类实现的接口
注意是:如果传入是接口:直接`接口名.Class`如:Class[] loginClass = {UserLogin.class};
如果传入是接口的实现类:`接口实现类名.Class.IgetInterfaces`
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
Object proxy:表示需要增强类对象
Method method:表示增强的方法
Object[] args:表示增强方法的参数
method.invoke,表示调用需要被增强的方法
实现的步骤
1.定义一个登录接口UserLogin
public interface UserLogin {
// 用于实现登录功能
void login();
}
2.定义登录接口实现类UserLoginImpl
public class UserLoginImpl implements UserLogin{
@Override
public void login() {
System.out.println("登录成功!");
}
}
3.创建增强类
也就是对被方法的执行增强,增强的方式有
- 前置通知:就是在增强该方法前执行
- 后置通知:就是在增强该方法后执行
- 环绕通知:就是在该方法前后都会执行
- 异常通知:就是该方法出现异常才会执行
- 最终通知:就是该方法不管是否出现异常都会执行
/**
* @Author 海康
* @Version 1.0
*/
// 功能增强类
public class EnhanceClass {
public void enhance(){
System.out.println("增强权限判断》》》");
}
}
4.创建代理类
在该类中传入需要代理接口的实现对象
/**
* @Author 海康
* @Version 1.0
*/
public class ProxyClass implements InvocationHandler {
// 传入需要代表接口实现类
private UserLogin userLogin;
public ProxyClass(UserLogin userLogin){
this.userLogin = userLogin;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 登录成功后进行功能增强,调用被增强的方法
Object invoke = method.invoke(userLogin, args);
// 创建增强类对象
EnhanceClass enhanceClass = new EnhanceClass();
enhanceClass.enhance();
return invoke;
}
}
5.test
类
class TestProxy{
@Test
public void testProxyObject(){
// 创建接口实现类
UserLogin userLogin = new UserLoginImpl();
// 创建代理类对象
ProxyClass proxyClass = new ProxyClass(userLogin);
// 调用Proxy类中的静态方法
// 第一个参数:
ClassLoader classLoader = TestProxy.class.getClassLoader();
// 第二个参数:【重点】[下面演示两个参数传入,只需要传入其中的一个]
// 如果传入是: 接口
Class[] inter = {UserLogin.class};
// 如果传入是:接口的实现类,还需要getInterfaces()方法返回该类实现的接口
Class<?>[] interfaces = userLogin.getClass().getInterfaces();
// 第三个参数:代理类对象,也就是上面的 proxyClass
UserLogin o = (UserLogin) Proxy.newProxyInstance(classLoader, inter, proxyClass);
o.login();
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)