spring框架中AOP菜鸟

AOP(Aspect Oriented Programming),即面向切面编程,是一种用于分离关注点的编程思想。在 Java 语言中,使用 AOP 可以动态地将代码片段(通常称为“切面”)织入到现有代码中,实现对原有代码的增强或修改。

Spring 框架提供了完整的支持 AOP,我们可以使用 Spring AOP 实现代码的切面处理,为程序的运行时加入额外的行为和逻辑。

1. Spring AOP 的基本概念

在介绍 Spring AOP 的具体使用方法之前,先来了解一下 Spring AOP 的一些基本概念。

- 连接点(Join Point):程序执行过程中可以插入 AOP 拦截器的点,比如方法的调用、异常抛出、属性访问等。

- 切点(Pointcut):实际需要拦截的连接点,通过表达式或者注释的方式定义。

- 通知(Advice):在连接点上要执行的增强代码,分为前置通知、后置通知、返回通知、异常通知、环绕通知等不同类型。

- 切面(Aspect):切点 + 通知 的组合,用于定义横切面的关注点。

- 引入(Introduction):允许向现有的类添加新的接口和方法。

- 目标对象(Target Object):被一个或多个切面织入通知的原有程序对象。

- AOP 代理(AOP Proxy):将切面织入目标对象的代理对象,实际上是 Java 代理或者 CGLIB 代理。

2. Spring AOP 的实现方式

Spring AOP 支持两种方式实现切面:

- 基于代理的 AOP(Proxy-Based AOP):Spring AOP 通过 Java 代理或者 CGLIB 生成代理对象,实现切面的织入。

- 基于注解的 AOP(Annotation-Based AOP):Spring AOP 通过在切面上添加注解,实现切点和通知的定义。

在基于代理的 AOP 中,Spring AOP 提供了两种代理方式:

- JDK 动态代理(JDK Dynamic Proxy):通过反射和代理模式实现的动态代理,在运行时动态地为目标对象创建代理对象。JDK 动态代理只能代理具有接口的目标对象。

- CGLIB 代理(CGLIB Proxy):基于继承的代理方式,在编译时为目标对象生成代理对象,并重写目标对象的方法。CGLIB 代理可以代理任何类,包括没有实现接口的类。

3. Spring AOP 的使用方法

接下来,将介绍如何在 Spring 框架中使用 AOP 实现切面编程。

(1)基于 XML 配置文件的方式

在 Spring 的 XML 配置文件中,需要定义一个切面(aspect),并指定切点、通知等相关信息。

例如,下面的代码演示了如何定义一个基于 XML 配置的切面:

```xml

```

在上面的代码中,我们定义了一个名为“myAspect”的切面,将“myInterceptor”的实例作为通知加入到“around”的拦截器链中。另外,定义了一个“userService”的目标对象,并使用“aop:config”定义了一个代理对象,使用“execution(* com.example.UserService.*(..))”定义了切点。

(2)基于注解的方式

通过在切面上添加注解实现切点和通知的定义,可以使代码更简洁,更直观。Spring AOP 提供了以下几个注解:

- @Aspect:定义切面;

- @Pointcut:定义切点;

- @Before:定义前置通知;

- @AfterReturning:定义返回通知;

- @AfterThrowing:定义异常通知;

- @After:定义后置通知;

- @Around:定义环绕通知。

下面的代码演示了如何使用基于注解的方式实现一个简单的 AOP 切面:

```java

@Aspect

@Component

public class MyAspect {

@Pointcut("execution(* com.example.UserService.*(..))")

private void pointcut() {}

@Before("pointcut()")

public void before() {

System.out.println("before advice");

}

@After("pointcut()")

public void after() {

System.out.println("after advice");

}

}

```

在上面的代码中,定义了一个名为“pointcut”的切点,使用“@Before”和“@After”分别定义了前置通知和后置通知。

4. Spring AOP 的应用场景

Spring AOP 通常应用于以下几个场景:

- 日志记录:在执行方法前、后记录方法名、异常信息等;

- 权限控制:根据用户权限检查是否有权利执行方法;

- 缓存控制:将结果缓存起来,下次调用直接返回结果;

- 事务管理:在方法执行前开启事务,在方法执行后提交或回滚事务等。

下面的代码示例,将演示如何使用 Spring AOP 实现权限控制:

```java

@Aspect

@Component

public class SecurityAspect {

@Autowired

private SecurityManager manager;

@Pointcut("@annotation(com.example.annotation.RequirePermission)")

private void requirePermission() {}

@Before("requirePermission()")

public void checkPermission() {

if (!manager.hasPermission()) {

throw new SecurityException("require permission");

}

}

}

@Service

public class UserServiceImpl implements UserService {

@Override

@RequirePermission

public void createUser(String name) {

System.out.println("create user " + name);

}

}

@Controller

public class UserController {

@Autowired

private UserService userService;

@RequestMapping("/createUser")

public void createUser(String name) {

userService.createUser(name);

}

}

```

在上面的代码中,定义了一个名为“SecurityAspect”的切面,并使用“@RequirePermission”注解定义了一个切点,使用“@Before”定义了一个前置通知。

当“UserController”调用“UserService.createUser”方法时,切面会先拦截,检查用户是否有权限执行该方法,如果没有,则抛出异常。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(99) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部