Spring AOP编程思想(注解开发实现)

概念

AOP(Aspect Oriented Programming)面向切面编程,是一种编程思想。可以在不惊动原始设计的基础上为方法进行功能上的增强。

1、代理:Spring下的AoP中,实现的核心本质是利用代理模式来实现的
2、连接点:在Spring下的AoP中,可以理解为任意方法的执行
3、切入点:匹配连接点的式子,是对具有共性功能的方法的描述(可以是一个方法,也可以是多个方法)
4、通知:若干个方法的共性功能在切入点处执行,最终体现为一个方法
5、切面:描述通知与切入点之间的关系

写一个简单的程序来感受一下。


使用AoP之前
1、入口类

public class ApplicationDemo {

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        bookDao.borrowBook();
        bookDao.returnBook();
    }
}

2、SpringConfig类

@Configuration
@ComponentScan("pers.happyfan")
public class SpringConfig {

}

3、BookDao接口

public interface BookDao {
    void borrowBook();
    void returnBook();
}

4、BookDaoImpl实现类

@Service
public class BookDaoImpl implements BookDao {

    @Override
    public void borrowBook() {
        System.out.println("书籍A被借阅");
    }

    @Override
    public void returnBook() {
        System.out.println("书籍A已归还");
    }
}

执行

使用AoP
1、在POM文件中导入对应的坐标

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

2、创建AopProxy类,在这个类中设立切入点、通知与切面

package pers.happyfan;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AopProxy {
    //定义切入点
    @Pointcut("execution(void pers.happyfan.dao.BookDao.borrowBook())")//匹配切入点的式子
    public void proBorrow(){

    }

    @Pointcut("execution(void pers.happyfan.dao.BookDao.returnBook())")
    public void proReturn(){

    }
    //切面,描述切面于通知之间的对应关系
    @Before("proBorrow()")
    //通知
    public void methodBorrow(){
        System.out.println("happyfan来借阅了");
    }

    @After("proReturn()")
    public void methodReturn(){
        System.out.println("happyfan已归还");
    }
}

其中@Before与@After注解是来告诉Spring通知执行的时机,其中的值表示这个通知与哪一个切入点绑定关系。

@Pointcut注解是用于定义切入点的,使用execution()方法来描述切入到哪一个连接点(一个方法),要携带一个没有参数、没有返回值、没有任何逻辑的方法作为与通知进行绑定。

@Aspect注解是告诉Spring,把这个bean当作AoP来处理

3、在SpringConfig配置类中添加新的注解

@Configuration //将这个类设置为配置类
@ComponentScan("pers.happyfan") //扫描这个路径下的所有的包,找到交给IoC管理的bean
@EnableAspectJAutoProxy //启动了AOP
public class SpringConfig {

}

4、入口类

public class ApplicationDemo {

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        bookDao.borrowBook();
        bookDao.returnBook();
    }

}

可以看到,在没有改变入口类、BookDao接口以及BookDao的实现类BookDaoImpl的情况下,就让borrowBook()、returnBook()两个方法进行了增强。
使用AoP的好处就是,如果原有的代码不能改动或者改动的代价很大,就可以利用这种方式来给原有的方法新增功能。

总结

实现AoP一共做了两件事情:
1、创建了一个类,在这个类中设立切入点、通知以及切面。
2、在配置类中添加启动AoP的注解

7 声望
2 粉丝
0 条评论
推荐阅读
使用Ajax+js实现在指定位置插入html
1、写一个标签,在标签内添加上id属性。 {代码...} 2、使用Ajax向服务器发起请求, {代码...} 3、controller层向数据库发起查询请求,将查询到的记录的集合转化为json格式,响应给浏览器。 {代码...} 4、使用Ajax...

爱摇头的电风扇阅读 413

Java项目是不是分布式,真有那么重要吗?
「微服务」「分布式」在我刚毕业的时候还是比较关注的,那时候还入门了一把SpringCloud,写了一篇很长的文章,还是很顶的,有不少的大号都给我转载了,在知乎又获得了很多的赞。

Java3y2阅读 577评论 1

线上FullGC问题排查实践——手把手教你排查线上问题 | 京东云技术团队
观察该机器日志发现,此时有很多线程在执行跑批任务。正常来说,跑批任务是低CPU高内存型,所以此时考虑是FullGC引起的大量CPU占用(之前有类似情况,告知用户后重启应用后解决问题)。

京东云开发者2阅读 332

封面图
Spring Framework IOC 原理
Spring Framework 提供了除IOC之外的很多有意思的功能,深入研究其技术原理,可在项目技术选型上提供更多的思路和技术把控。Spring Framewrok 代码由大佬精心打磨,可以从功能实现上学习和模仿。另外Spring Frame...

Mario1阅读 697

SpringBoot可以同时处理多少请求?
我们都知道,SpringBoot默认的内嵌容器是Tomcat,也就是我们的程序实际上是运行在Tomcat里的。所以与其说SpringBoot可以处理多少请求,倒不如说Tomcat可以处理多少请求。

码猿技术专栏1阅读 598

Java-微服务架构之认证服务
之前通过阅读《Spring微服务实战》写过关于spring-cloud+spring-security+oauth2的认证服务和资源服务文章,以及写过关于spring-gateway做token校验的文章,但是在实战过程中还是发现一些问题,于是通过跟朋友沟...

Awbeci阅读 1.1k

【奶奶看了都会】GPT3.5接入企业微信,可连续对话
小伙伴们,这周OpenAI放出大招,开放了GPT3.5的API。说简单点,就是提供了和GPT页面对话一样模型的接口。而之前接的GPT接口都是3.0,并不是真正的GPT。废话少说,先来看看效果,这次最大的不同是能连续对话了

卷福同学阅读 1k

封面图
7 声望
2 粉丝
宣传栏