项目中AOP相关问题

答:AOP是面向切面编程,可以通过定义方法拦截器和切入点,实现将一些逻辑相同的代码块抽取到同一个模块中,这个模块就是切面。代码可以只关注业务实现,不用关注那些通用逻辑。

答:切面,通用模块;

        连接点,被拦截到的方法;

        切点,对连接点的定位;

        通知,想要增强的方法;

答:

  • 前置通知 (@Before)
  • 返回通知 (@AfterReturning)
  • 异常通知 (@AfterThrowing)
  • 后置通知 (@After)
  • 环绕通知 (@Around)

答:在技术派实战项目中使用,我利用 AOP 打印了接口的参数日志,链路id信息,以及方法的执行时间。

  • 第一步,自定义一个注解作为切点
  • 第二步,配置 AOP 切面:
    • @Aspect:标识切面
    • @Pointcut:设置切点,这里以自定义注解为切点
    • @Around:环绕切点,打印方法签名和执行时间
  • 第三步,在使用的地方加上自定义注解
  • 最后,当接口被调用时,就可以看到对应的执行日志。

答:没有用过AspectJ,只知道AspectJ 是一个易用的功能强大的 AOP 框架,属于编译时增强,性能更高,Spring AOP是运行时增强,纯Java实现。

答:Spring 的 AOP 是通过动态代理来实现的,动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。

JDK 动态代理是只能代理实现了接口的类,CGLIB 动态代理是基于继承的代理,可以代理没有实现接口的类。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以,下面是一个简单的Spring AOP项目的代码示例: 首先,创建一个接口 `UserService`,定义一些用户相关的操作方法: ```java public interface UserService { void addUser(String username); void deleteUser(String username); } ``` 然后,创建一个实现该接口的类 `UserServiceImpl`: ```java public class UserServiceImpl implements UserService { @Override public void addUser(String username) { System.out.println("Adding user: " + username); } @Override public void deleteUser(String username) { System.out.println("Deleting user: " + username); } } ``` 接着,创建一个切面类 `LoggingAspect`,用于定义切面逻辑: ```java @Aspect public class LoggingAspect { @Before("execution(* UserService.*(..))") public void beforeMethod(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println("Before method: " + methodName); } @After("execution(* UserService.*(..))") public void afterMethod(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println("After method: " + methodName); } } ``` 最后,编写一个配置类 `AppConfig`,配置Spring容器和AOP: ```java @Configuration @EnableAspectJAutoProxy @ComponentScan("com.example") public class AppConfig { @Bean public UserService userService() { return new UserServiceImpl(); } @Bean public LoggingAspect loggingAspect() { return new LoggingAspect(); } } ``` 现在,你可以创建一个启动类 `MainApp` 来运行你的应用: ```java public class MainApp { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); UserService userService = context.getBean(UserService.class); userService.addUser("John"); userService.deleteUser("Jane"); context.close(); } } ``` 在上述示例,`LoggingAspect` 切面类使用了 `@Before` 和 `@After` 注解,分别在目标方法执行前和执行后执行切面逻辑。通过 `execution(* UserService.*(..))` 定义了切点表达式,表示匹配 `UserService` 接口的所有方法。 当你运行 `MainApp` 类时,你将会看到输出的日志信息,证明切面逻辑生效。 这只是一个简单的示例,你可以根据实际需求来定义更复杂的切面逻辑和切点表达式。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值