AOP 的概念、名词解释、实现原理、常用场景

2023-05-16

AOP概念

1.aop:面向切面编程。是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充。
2.在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里
在这里插入图片描述在这里插入图片描述Aop的好处
1.每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级
2.业务模块更简洁, 只包含核心业务代码
3.降低模块间的耦合度,并有利于未来的可操作性。

原理
1.spring框架中,分为静态代理和动态代理两部分。
2.先以静态代理实现,静态代理关键是在代理对象和目标对象实现共同的接口,并且代理对象持有目标对象的引用。
静态代码实例

public interface IPerson {
    public void doSomething();
}

public class Person implements IPerson {
    public void doSomething(){
        System.out.println("I want wo sell this house");
    }
}


public class PersonProxy {
    private IPerson iPerson;
    private final static Logger logger = LoggerFactory.getLogger(PersonProxy.class);
    


public PersonProxy(IPerson iPerson) {
    this.iPerson = iPerson;
}
public void doSomething() {
    logger.info("Before Proxy");
    iPerson.doSomething();
    logger.info("After Proxy");
}

public static void main(String[] args) {
    PersonProxy personProxy = new PersonProxy(new Person());
    personProxy.doSomething();
}

动态代码示例
1.通过InvocationHandler 实现方法拦截加入代理功能
2.通过Proxy类创建动态代理实例
3.当调用生成的代理实例时,会被invocationHandler的方法拦截,方法实现就是代理的内容

public class PersonProxy implements InvocationHandler{
    private Object delegate;
    private final Logger logger = LoggerFactory.getLogger(this.getClass();
    public Object bind(Object delegate) {
        this.delegate = delegate;
        return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        try {
            logger.info("Before Proxy");
            result = method.invoke(delegate, args);
            logger.info("After Proxy");
        } catch (Exception e) {
            throw e;
        }
        return result;
    }
 
   public static void main(String[] args) {
        PersonProxy personProxy = new PersonProxy();
        IPerson iperson = (IPerson) personProxy.bind(new Person());
        iperson.doSomething();
    }
}

Aop名词解释
切面(Aspect):切面编程的完整定义模块,比如日志切面,包含了何时、对谁、如何等等所有的内容。
连接点(Join point):能够植入切面的部分,比如方法前后,抛出异常时都可以是连接点,spring只支持方法连接点
通知(Advice):要对切面添加的功能代码,比如 安全,事物,日志等功能代码。类型:before/after/around/after-returning/after-throwing
切入点(Pointcut):针对哪些连接点植入通知,也就是指定具体的拦截地点。可以通过spEL指定连接点
引入(Introduction):对目标类添加新方法及属性
目标对象(Target object):被切面切的对象。真正的业务逻辑,完全不知道存在切面
代理(proxy):实现AOP的一种原理
织入(Weaving):把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时。
在这里插入图片描述
Aop实现(增强功能与作用)
前置通知(Before advice)
返回后通知(After returning advice)
抛出异常后通知(After throwing advice)
后通知(After (finally) advice)
环绕通知(Around Advice)
前置通知:在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)
返回后通知:在某连接点(join point)正常完成后执行的通知
抛出异常后通知:在方法抛出异常退出时执行的通知
后通知:当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)
环绕通知:这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行,环绕通知是最常用的一种通知类型。大部分基于拦截的 AOP 框架,例如 Jboss,以及 EJB3里面的拦截器,都只提供环绕通知
Aop应用场景
1.权限验证
2.性能追踪
3.日志追踪
4.异常处理
5.事务 => Spring 的声明式事务管理
6.缓存
7.懒加载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AOP 的概念、名词解释、实现原理、常用场景 的相关文章

随机推荐