一、为什么要使用 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 ):定义切点、各类通知和引入的内容