传统Spring AOP通知类型(Spring版本1.2 开始)
首先: AOP联盟定义 Advice 通知接口,
然后: Spring AOP 在Advice 接口基础上,扩充为五种通知类型。
通知类型:
前置通知:在目标方法执行前实施增强。
后置通知:在目标方法执行后实施增强。
环绕通知:在目标方法执行前后实施增强。
异常通知:在方法抛出异常后实施增强。
引介通知:在目标类中添加一些新的方法和属性。
________________________________________________________________________________________
新建applicationContext.xml文件,添加新的xsd约束。
<?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">
接口类OrderService:
public interface OrderService {
public void add();
public void update();
public void delete();
public void search();
}
实现类OrderServiceImpl:
public class OrderServiceImpl implements OrderService{
@Override
public void add() {
System.out.println("添加...");
}
@Override
public void update() {
System.out.println("修改...");
}
@Override
public void delete() {
System.out.println("删除...");
}
@Override
public void search() {
System.out.println("搜索...");
}
}
通知Advice:
public class MyMehtodInterceptor implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
System.out.println("环绕前增强...");
Object result = arg0.proceed();
System.out.println("环绕后增强...");
return result;
}
}
applicationContext.xml:
<bean id="orderService" class="cn.itcast.spring.c_aop.OrderServiceImpl"></bean>
<!-- 通知 -->
<bean id="mymethodadvice" class="cn.itcast.spring.c_aop.MyMehtodInterceptor"></bean>
<!-- 切面配置 -->
<aop:config>
<aop:pointcut expression="execution(* cn.itcast.spring.c_aop.OrderServiceImpl.*(..))" id="mypointcut"/>
<aop:advisor advice-ref="mymethodadvice" pointcut-ref="mypointcut"/>
</aop:config>
测试类AOPTest:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class AOPTest {
@Autowired
private OrderService orderService;
@Test
public void testOrderService(){
orderService.search();
orderService.add();
orderService.update();
orderService.delete();
}
}
输出结果:
AOP配置说明:
aop:advisor: 定义spring传统AOP的切面的,只支持一个PointCut和一个Advice
aop:aspect : 定义AspectJ框架切面的,可以包含多个PointCut 和多个Advice
aop:pointcut : 切点定义
补充切点表达式的定义:
通过execution函数,可以定义切点的方法切入
语法:
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
例如
匹配所有类public方法
execution(public * *(..))
匹配指定包下所有类方法 execution(* cn.itcast.dao.*(..)) 不包含子包
execution(* cn.itcast.dao..*(..)) ..*表示包、子孙包下所有类
匹配指定类所有方法 execution(* cn.itcast.service.UserService.*(..))
匹配实现特定接口所有类方法
execution(* cn.itcast.dao.GenericDAO+.*(..))
匹配所有save开头的方法
execution(* save*(..))