【Spring】—— 如何使用AOP(面向切面编程)?

发布时间:2024年01月15日

目录

引言

AOP使用

1)导入坐标(pom.xml)

2)制作连接点方法(原始操作、接口与实现类)

3)制作共性功能(通知类与通知)

4)定义切入点

5)绑定切入点与通知关系

6)定义通知类受Spring容器管理,并定义当前类为切面类

7)配置类


引言

AOP(面向切面编程):一种编程范式,指导开发者如何组织程序结构。

作用:在不改变原始设计的基础上进行功能增强。

如以下代码:如何再不改变此类的基础上,使后三个方法达到与save方法同样的效果?

public class BookDaoImpl implements BookDao {
    public void save(){
        Long startTime = System.currentTimeMillis();
        for(int i = 0;i < 10000;i++)
            System.out.println("book dao save...");
        Long endTime = System.currentTimeMillis();
        Long totalTime = endTime-startTime;
        System.out.println(totalTime + "ms");
    }

    public void update(){
        System.out.println("book dao update...");
    }
    public void delete(){
        System.out.println("book dao delete...");
    }
    public void select(){
        System.out.println("book dao select...");
    }

}

AOP使用

1)导入坐标(pom.xml)

pom.xml文件加入以下坐标,注意加入后刷新maven。

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.9</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
    </dependencies>

2)制作连接点方法(原始操作、接口与实现类)

@Repository
public class BookDaoImpl implements BookDao {
    public void save(){
        System.out.println(System.currentTimeMillis());
        System.out.println("book dao save...");
    }

    public void update(){
        System.out.println("book dao update...");
    }

}

3)制作共性功能(通知类与通知)

public class MyAdvice {
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

4)定义切入点

切入点是匹配连接点的式子

public class MyAdvice {
    @Pointcut("execution(void com.spring.dao.BookDao.update())")
    private void pt(){}

}

5)绑定切入点与通知关系

public class MyAdvice {
    @Pointcut("execution(void com.spring.dao.BookDao.update())")
    private void pt(){}

    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

6)定义通知类受Spring容器管理,并定义当前类为切面类

加入@Component和@Aspect

切面是描述通知与切入点的对应关系

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.spring.dao.BookDao.update())")
    private void pt(){}

    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

7)配置类

@EnableAspectJAutoProxy开启Spring对AOP注解驱动支持

@Configuration
@ComponentScan("com.spring")
@EnableAspectJAutoProxy
public class SpringConfig {
}
文章来源:https://blog.csdn.net/Tir_zhang/article/details/135598524
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。