Spring AOP编程
- 什么是 AOP 编程?
AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种编程思想。
从OOP角度分析,我们关注业务的处理逻辑,是属于纵向的行为,从AOP角度分析,我们关注对象行为发生时的问题,是属于横向的行为。
- AOP 包括什么?
切面
切入点
通知定义了切面的什么和何时,切点定义了何处,切点的定义会匹配通知所要织入的一个或多个连接点,我们通常使用明确的类的方法名称来指定这些切点,或是利用正则表达式定义匹配的类和方法名称来指定这些切点。
通知
前置通知
后置通知
异常通知
环绕通知
- AOP 开发步骤
新建一个切面类,实现通知接口
修改spring 配置文件或使用注解,把切面类交给 spring 进行管理
修改 spring 配置文件,引入 aop 名称空间配置
配置 aop:config
执行包含切入点的代码,切面自动执行
1. 新建一个工程,工程结构如下所示:
项目工程结构图部分代码展示(Getting Setting 方法已省略):
Category.java :
package com.neuedu.springaop.bean
public class Category {
private int id;
private String name;
public Category() {
super();
}
public Category(int id) {
super();
this.id = id;
public Category(int id, String name) {
super();
this.id = id;
this.name = name;
}
}
ICategoryDao.java (模拟数据库操作)
package com.neuedu.springaop.dao;
import java.util.List;
import com.neuedu.springaop.bean.Category;
public interface ICategoryDao {
public boolean saveCategory(Category category);
public boolean deleteCategory(Category category);
public boolean editCategory(Category category);
public Category findById(int id);
public List<Category> searchByExample(Category category);
}
ICategoryService.java
package com.neuedu.springaop.service;
import java.util.List;
import com.neuedu.springaop.bean.Category;
public interface ICategoryService {
public boolean saveCategory(Category category);
public boolean deleteCategory(Category category);
public boolean editCategory(Category category);
public Category findById(int id);
public List<Category> searchByExample(Category category);
}
新建一个切面类 : Thranslation.java
package com.neuedu.springaop.aop;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;
/*
* 模拟事务的类
*
* 1.前置通知接口:MethodBeforeAdvice,对应切入点-表示在方法调用前切入
* 2.后置通知接口:AfterReturningAdvice,对应切入点-表示在方法返回后执行
*/
public class Thranslation implements MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice{
@Override
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
System.out.println("模拟事务开启......");
}
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
System.out.println("模拟事务提交......");
}
public void afterThrowing(Exception e) {
System.out.println("模拟事务回滚......");
}
}
2-4. 修改后的applicationContext.xml 文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置aop切面 -->
<!-- 把切面类交给spring进行管理 -->
<bean id="Thranslation" class="com.neuedu.springaop.aop.Thranslation"></bean>
<!-- 配置切面 -->
<aop:config>
<!-- 配置切入点 -->
<!-- 切入点表达式说明:execution表示执行,第一个*号表示修饰符号,接着配置package包名.接口名或类名.方法名(参数列表)
*号表示多种情况,参数的两点表示不定参数(0-n个参数)
-->
<aop:pointcut expression="execution(* com.neuedu.springaop.service.ICategoryService.*(..))
" id="txPointcut"/>
<!-- 配置aop通知 -->
<aop:advisor advice-ref="Thranslation" pointcut-ref="txPointcut"/>
</aop:config>
<!-- 表示层 -->
<!-- 业务逻辑层 -->
<bean id="CategoryServiceImpl" class="com.neuedu.springaop.service.impl.CategoryServiceImpl">
<property name="categoryDao" ref="CategoryDaoImpl"></property>
</bean>
<!-- 数据访问层 -->
<bean id="CategoryDaoImpl" class="com.neuedu.springaop.dao.impl.CategoryDaoImpl"></bean>
</beans>
5. 执行包含切入点的代码,切面自动执行
编写一个测试类 TestCategoryService.java
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.neuedu.springaop.bean.Category;
import com.neuedu.springaop.service.ICategoryService;
public class TestCategoryService {
public static void main(String[] args) {
//1.配置spring环境
String configLocation = "config/applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
//2.获取业务对象
ICategoryService service = context.getBean(ICategoryService.class);
//3.进行业务测试
Category category = new Category();
boolean res = service.saveCategory(category);
if(res) {
System.out.println("新增成功");
}else {
System.out.println("新增失败");
}
}
}
执行测试程序,获得执行结果 :
模拟事务开启......
执行新增功能...
模拟事务提交......
新增成功
网友评论