SpringBoot | Spring AOP学习(一)

一、为什么要使用 AOP

AOP (Aspect-Oriented Programming)面向切片编程

AOP 可作为面向对象编程(OOP)的一种加强

在处理一个业务时,除了核心的业务逻辑,还包括数据存储、日志和调度信息、授权、安全等通用的逻辑。AOP的应用可在日志、数据库事务、授权等方面体现。所以说,AOP的核心思想是:将程序中的核心逻辑与提供支持的通用服务进行分离

使用OOP设计,它会导致了大量代码的重复,不利于模块的复用和拓展。利用AOP后,我们在代码中只体现了 核心业务逻辑,而数据事务连接、提交、释放等操作,以及日志、权限验证都给抽离出来了,使其默认的实现

1.1 使用OOP编程和AOP编程的对比

在Spring使用之前,我们可以引用 JDBC 进行数据库操作

例如, JDBC 实现数据库的插入操作,代码如下

import java.sql.*;

public class UserService {

    public static void insertUser () throws Exception {

         UserDao userDao = new UserDao ();

         UserEntity user= new UserEntity() ;

         user.setUsername( "Ada" );

         user.setAge (18);

         try {

                 Class.forName("com.mysql.jdbc.Driver");//加载驱动

                 String jdbc="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=GBK";

                  Connection conn=DriverManager.getConnection(jdbc, "root", "123456");  //连接到数据库

                  Statement state=conn.createStatement();  //容器

                  userDao.insertUser (conn , user) ;  //插入操作

                  conn.commit ( ) ;        //将sql语句上传至数据库执行

         }catch (Exception e ) {

             try {

                     conn . rollback (); //回滚事务

                    }catch (SQLException ex) {

                            ex . printStackTrace();

                           } e.printStackTrace();

                   } finally {

                    if (conn ! = null ){ // 释放数据连接资源

                           try {  conn . close ( ) ;

                                  } catch (SQLException e ) {

                                      e.printStackTrace() ; }

                    }

    }

AOP编程实现数据库的插入操作,代码如下:

@Transational

public class UserService {

         @Autowired

          private UserEntity  userEntity;

         @Autowired

          private UserDao userDao;

          public void  insertUserEntity()  throws SQLException {

                      userEntity.setName("ada");

                      userEntity.setAge(18);

                      userDao.insertUserInfo(userEntity);

    }

可以看出, JDBC 实现数据库操作涉及到数据库事务连接、执行、回滚和关闭,且用到 try...catch...finally...语句,很繁杂;而 AOP 没有任何数据库打开和关闭的代码,却实现了数据库资源的打开和关闭、事务的回滚和提交,大量减少了代码。

二、AOP 术语

1、连接点( join point ): 对应的是具体被拦截的对象,因为Spring 只能支持方法, 所以被拦截的对象往往就是指特定的方法。

2、切点( point cut ):有时候,我们的切面不单单应用于单个方法,也可能是多个类的不同方法,这时,可以通过正则式和指示器的规则去定义,从而适配连接点。切点就是提供这样一个功能的概念。

3、通知( advice ): 就是按照约定的流程下的方法,分为

      前置通知( before advice )

      后置通知( afteradvice )

      环绕通知( around advice )

      事后返回通知( afterRetuming advice )

      异常通知( after Throwing advice )

它会根据约定织入流程中,需要弄明白它们在流程中的顺序和运行的条件。

4、目标对象( target ):即被代理对象

5、织入( weaving ):它是一个通过动态代理技术,为原有服务对象生成代理对象, 然后将与切点定义匹配的连接点拦截,并按约定将各类通知织入约定流程的过程。

6、切面( aspect ):定义切点、各类通知和引入的内容


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容