通常,AOP 将代码功能的不同方面分离为单独的代码片段,并相互独立地实现它们。这是一个非常单一的责任原则。这次,它的实现方式不仅是不同功能单独实现的,而且我们可以将它们连接在一起。这是单独定义的。在其他部分分别编码并获得 Spring 配置之前和之后执行什么?我们已经看到类似的东西了。类需要正确操作的依赖关系在单独的段(XML 或 Java 代码)中定义。对于 AOP,同样使用 Spring 也不奇怪。方面在配置文件或类中配置。
通常,AOP 将代码功能的不同切面分离为单独的代码片段,并相互独立地实现它们。这是一个非常单一的责任原则。这次,它的实现方式不仅是不同功能单独实现的,而且我们可以将它们连接在一起。这是单独定义的。在其他部分分别编码并获得 Spring 配置之前和之后执行什么?我们已经看到类似的东西了。类需要正确操作的依赖关系在单独的段(XML 或 Java 代码)中定义。对于 AOP,同样使用 Spring 也不奇怪。切面在配置文件或类中配置。
@@ -902,11 +902,11 @@ public class SpringConfigurationAspect {
}
```
该类用`@Configuration`注解进行注解,以便 Spring 知道该类包含配置。`@Aspect`注解表示此配置还可以包含方面定义。方法上的`@Around`注解给出了通知的类型,注解的参数字符串是切入点表达式。如果通知类型不同,则应使用注解之一,`@Before`、`@After`、`@AfterReturning`或`@AfterThrowing`。
该类用`@Configuration`注解进行注解,以便 Spring 知道该类包含配置。`@Aspect`注解表示此配置还可以包含切面定义。方法上的`@Around`注解给出了通知的类型,注解的参数字符串是切入点表达式。如果通知类型不同,则应使用注解之一,`@Before`、`@After`、`@AfterReturning`或`@AfterThrowing`。
Spring 中的 AOP 实现通过为目标对象生成代理对象来工作,处理器调用我们在 Spring 配置中定义的方面。这就是您不能将方面放在`final`类或`final`方法上的原因。此外,您不能在`private`或`protected`方法上配置方面。原则上,`protected`方法可以被代理,但这不是一个好的实践,因此 Spring AOP 不支持它。类似地,不能将方面放在不是 SpringBean 的类上。它们是由代码直接创建的,而不是通过 Spring 创建的,并且在创建对象时没有机会返回代理而不是原始对象。简单地说,如果不要求 Spring 创建对象,它就不能创建自定义对象。我们最不想做的就是执行这个程序,看看方面是如何执行的。审计日志的实现非常简单。我们使用标准日志,这对于审计日志的实际应用来说是不够的。我们所做的唯一特殊的事情是使用一个由名称`AUDIT_LOG`而不是类名称标识的记录器。在大多数日志框架中,这是对日志记录器的合法使用。尽管我们通常使用类来标识记录器,但是使用字符串来标识记录器是绝对可能的。在我们的日志记录中,这个字符串也将被打印在控制台的日志行中,并且它将在视觉上突出。
Spring 中的 AOP 实现通过为目标对象生成代理对象来工作,处理器调用我们在 Spring 配置中定义的切面。这就是您不能将切面放在`final`类或`final`方法上的原因。此外,您不能在`private`或`protected`方法上配置切面。原则上,`protected`方法可以被代理,但这不是一个好的实践,因此 Spring AOP 不支持它。类似地,不能将切面放在不是 SpringBean 的类上。它们是由代码直接创建的,而不是通过 Spring 创建的,并且在创建对象时没有机会返回代理而不是原始对象。简单地说,如果不要求 Spring 创建对象,它就不能创建自定义对象。我们最不想做的就是执行这个程序,看看切面是如何执行的。审计日志的实现非常简单。我们使用标准日志,这对于审计日志的实际应用来说是不够的。我们所做的唯一特殊的事情是使用一个由名称`AUDIT_LOG`而不是类名称标识的记录器。在大多数日志框架中,这是对日志记录器的合法使用。尽管我们通常使用类来标识记录器,但是使用字符串来标识记录器是绝对可能的。在我们的日志记录中,这个字符串也将被打印在控制台的日志行中,并且它将在视觉上突出。