【Java框架】Spring-AOP官方文档人肉翻译

       1. 首先提到了AOP和OOP。

OOP(面向对象编程)

  • 定义:面向对象编程是一种编程范式,通过类和对象来组织代码。它强调将数据和操作数据的函数封装在一起,并通过对象实例化这些类。
  • 关键概念
    • :定义对象的模板,包含属性(字段)和方法。
    • 对象:类的实例,表示具体的实体。
    • 封装:将数据和操作数据的方法绑定在一起,隐藏实现细节。
    • 继承:通过从一个类派生出新类,复用已有的代码。
    • 多态:通过方法重载和重写,实现同一接口的不同实现。

AOP(面向切面编程)

        面向切面编程(AOP)是一种编程技术,其目的是将那些横跨多个模块的功能,比如日志记录、事务管理和安全检查等,从业务逻辑中分离出来,单独进行处理和管理。这些功能通常被称为“横切关注点”,因为它们不属于单个模块或类的核心业务逻辑,而是在整个程序中以横切的方式存在。通过AOP,可以将这些横切关注点模块化,使得代码更加清晰,易于维护和扩展。

  • 关键概念
    • 切面(Aspect):模块化的横切关注点的实现。
    • 连接点(Join Point):程序执行中的特定点,如方法调用或异常抛出。
    • 切点(Pointcut):定义在哪些连接点应用切面的集合。
    • 通知(Advice):在特定的连接点上执行的代码,如方法执行前后的操作。
    • 织入(Weaving):将切面应用到目标对象的过程。

总结

  • OOP:主要关注类和对象的设计与实现,通过封装、继承和多态来提高代码的复用性和灵活性。
  • AOP:通过切面将横切关注点分离出来,实现更清晰的关注点分离,使代码更加简洁和易于维护。

        Spring AOP与AspectJ切点 Spring提供了两种简单而强大的编写自定义切面的方式,一种是使用基于模式的方法,另一种是使用@AspectJ注解风格。这两种风格都提供了完全类型化的建议和使用AspectJ切点语言,同时仍然使用Spring AOP进行织入。

2.AOP中的基本概念(这段不是太懂,看个大概)

  1. 切面(Aspect):切面就像是一个包裹,可以横跨多个类并且提供一种特定的功能。比如,日志记录可以作为一个切面,它可以在每个方法执行前后打印日志信息。

  2. 连接点(Join point):连接点就是程序执行过程中的一个具体点,比如方法的执行或者异常的处理。比如,一个方法被调用时,就是一个连接点。

  3. 通知(Advice):通知是切面在连接点执行时采取的行动。比如,一个切面可以在方法执行之前打印日志(前置通知),或者在方法执行完毕后记录日志(后置通知)。

  4. 切点(Pointcut):切点是一种定义,它匹配连接点的条件。比如,一个切点可以定义为匹配所有名称以"get"开头的方法。

  5. 引入(Introduction):引入允许在现有类中添加新方法或字段,而无需修改类的代码。比如,可以通过引入让一个类实现一个新接口,而不必修改原始类的代码。

  6. 目标对象(Target object):目标对象是一个或多个切面所影响的对象。比如,一个服务类可以是一个目标对象,它受到日志记录切面的影响。

  7. AOP代理(AOP proxy):AOP代理是AOP框架创建的对象,用于实现切面的功能。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

  8. 织入(Weaving):织入是将切面应用到目标对象以创建一个新的代理对象的过程。比如,在方法调用之前或之后,织入可以插入日志记录功能。

  9. 环绕通知(Around advice):环绕通知是一种特殊的通知类型,它可以完全控制连接点的执行。比如,一个环绕通知可以在方法执行之前和之后记录日志,并决定是否执行原始方法。

  10. Spring AOP中的通知类型:Spring AOP包括前置通知(Before advice)、后置通知(After returning advice)、异常通知(After throwing advice)和最终通知(After (finally) advice)。这些通知类型可以让你在不同的时间点执行不同的操作,比如在方法执行之前执行某些操作,或者在方法执行之后记录日志。

3.Spring AOP的功能和目标

        Spring AOP是用纯Java实现的,不需要特殊的编译过程。Spring AOP不需要控制类加载器层次结构,因此适用于在Servlet容器或应用服务器中使用。

        Spring AOP的AOP方式与大多数其他AOP框架不同。其目标不是提供最完整的AOP实现(尽管Spring AOP功能相当强大)。相反,其目标是在AOP实现和Spring IoC之间提供紧密的集成,以帮助解决企业应用程序中的常见问题。

4、Spring AOP代理

这段内容描述了Spring AOP在创建代理时的两种方式:JDK动态代理和CGLIB代理。这两种代理方式用于在运行时创建代理对象,用于实现AOP的功能。

举个例子来说,假设我们有一个接口UserService和其实现类UserServiceImpl

public interface UserService {
    void addUser(String username);
}

public class UserServiceImpl implements UserService {
    public void addUser(String username) {
        // 添加用户的实现逻辑
        System.out.println("添加用户:" + username);
    }
}

如果我们使用Spring AOP创建代理对象,并且UserServiceImpl实现了UserService接口,那么默认情况下,Spring会使用JDK动态代理来创建代理对象。这意味着我们可以这样配置AOP:

<aop:config>
    <aop:aspect ref="myAspect">
        <aop:pointcut id="myPointcut" expression="execution(* com.example.UserService.addUser(..))"/>
        <aop:before pointcut-ref="myPointcut" method="beforeAddUser"/>
    </aop:aspect>
</aop:config>

在这种情况下,Spring会使用JDK动态代理来创建UserService接口的代理对象,并在方法调用前执行beforeAddUser方法中定义的逻辑。

另一方面,如果UserServiceImpl没有实现任何接口,Spring将会使用CGLIB代理来创建代理对象。这种情况下,我们需要将proxy-target-class设置为true,告诉Spring强制使用CGLIB代理:

<aop:config proxy-target-class="true">
    <aop:aspect ref="myAspect">
        <aop:pointcut id="myPointcut" expression="execution(* com.example.UserServiceImpl.addUser(..))"/>
        <aop:before pointcut-ref="myPointcut" method="beforeAddUser"/>
    </aop:aspect>
</aop:config>

这样,Spring将会使用CGLIB代理来创建UserServiceImpl类的代理对象,并在方法调用前执行beforeAddUser方法中定义的逻辑。

未完待续。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值