一个简单的AOP实例

上一篇谢了动态代理,这篇写spring中的一个重要特征AOP,来进行spring的面向切面编程.

首先配置pom.xml文件

  <dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.9</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.7</version>
      <scope>runtime</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

2,我们先写一个接口,里面还是正常的增删改查方法

3,写这个接口的实现类,并实现接口的方法

package User;

public class UserDaoImpl implements UserDao {
    @Override
    public void add() {
        System.out.println("实现了add方法");
    }

    @Override
    public void delete() {
        System.out.println("实现了delete方法");
    }

    @Override
    public void update() {
        System.out.println("实现了update方法");
    }

    @Override
    public void query() {
        System.out.println("实现了query方法");
    }
}

4,然后我们可以写一个类继承MethodBeforeAdvice接口,再写一个类继承AfterReturningAdvice接口(前置后置通知),这时候我们的xml配置文件只需要这样写:

    <bean id="before" class="AOP.before"></bean>
    <bean id="after" class="AOP.After"></bean>
    <bean id="Impl" class="User.UserDaoImpl"></bean>
    <bean id="diy" class="Diy.diy"></bean>
 <aop:config>
     <aop:pointcut id="pointcutaop" expression="execution(* User.UserDaoImpl.*(..))"/>
     <aop:advisor advice-ref="before" pointcut-ref="pointcutaop"></aop:advisor>
     <aop:advisor advice-ref="after" pointcut-ref="pointcutaop"></aop:advisor>
 </aop:config>

5,如果我们自定义类,里面注解写方法,那么我们的xml配置文件这样写:

<aop:config>
    <aop:aspect ref="diy">
        <aop:pointcut id="pointcutdiy" expression="execution(* User.UserDaoImpl.*(..))"/>
        <aop:before method="before1" pointcut-ref="pointcutdiy"></aop:before>
        <aop:after method="after1" pointcut-ref="pointcutdiy"></aop:after>
    </aop:aspect>
</aop:config>

6,测试

import User.UserDao;
import User.UserDaoImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("aop.xml");
        UserDao impl = (UserDao) applicationContext.getBean("Impl");
      impl.add();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们有一个 UserService 类,其中有一个方法 addUser,我们希望在这个方法执行前后记录一些日志信息。 我们可以使用 AOP 来实现这个功能,具体步骤如下: 1. 定义一个切面类,用于处理日志记录的逻辑。例如,我们可以定义一个 LogAspect 类。 ```java @Component @Aspect public class LogAspect { private static final Logger logger = LoggerFactory.getLogger(LogAspect.class); @Before("execution(* com.example.UserService.addUser(..))") public void logBefore(JoinPoint joinPoint) { // 记录方法执行前的日志信息,例如方法名、参数等 logger.info("Before executing method: {}", joinPoint.getSignature().getName()); } @AfterReturning(value = "execution(* com.example.UserService.addUser(..))", returning = "result") public void logAfter(JoinPoint joinPoint, Object result) { // 记录方法执行后的日志信息,例如方法名、返回值等 logger.info("After executing method: {}, result: {}", joinPoint.getSignature().getName(), result); } } ``` 在这个切面类中,我们使用 @Aspect 注解标记它为一个切面。然后,我们定义了两个方法 logBefore 和 logAfter,它们分别在方法执行前和执行后记录日志信息。使用 @Before 和 @AfterReturning 注解来指定切入点,这里我们指定了 UserService 类中的 addUser 方法。 2. 在 Spring 配置文件中启用 AOP ```xml <aop:aspectj-autoproxy /> ``` 3. 在 UserService 类中调用 addUser 方法 ```java @Service public class UserService { public void addUser(String username) { // 添加用户的逻辑 } } ``` 现在,每次调用 addUser 方法时,LogAspect 类中定义的 logBefore 和 logAfter 方法都会自动执行,记录相关的日志信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值