Spring中配置aop (xml)
只是为了方便翻阅做个一个笔记,有什么错误希望大家可以指出
1、spring中 用xml配置aop
1)目标对象
package cn.itcast.service; public class UserServiceImpl implements UserService { @Override public void save() { // TODO Auto-generated method stub System.out.println("保存用户!!"); } @Override public void update() { // TODO Auto-generated method stub System.out.println("修改用户!!"); } @Override public void delete() { // TODO Auto-generated method stub System.out.println("删除用户!!"); } @Override public void find() { // TODO Auto-generated method stub System.out.println("更新用户!!"); } }
2)通知对象
package cn.itcast.advice; import org.aspectj.lang.ProceedingJoinPoint; public class MyAdvice { //前置通知 public void before(){ System.out.println("这是前置通知!!!"); } // 后置通知 public void afterReturning(){ System.out.println("这是后置通知(出现异常也会调用)!!!"); } //环绕通知 public Object around(ProceedingJoinPoint pjPoint) throws Throwable { System.out.println("这是环绕通知之前的部分!!!"); Object proceed = pjPoint.proceed(); //调用目标方法 System.out.println("这是环绕通知之后的部分!!!"); return proceed; } //异常通知 public void afterException() { System.out.println("出现异常啦(出现异常不会调用)!!!!"); } //后置通知 public void after() { System.out.println("这是后置通知(出现异常不会调用)!!!!"); } }
3)spring中aop的相关配置
<!-- 准备工作 导入aop命名空间 --> <!-- 1、配置目标对象 --> <bean name="userServiceTarget" class="cn.itcast.service.UserServiceImpl"></bean> <!-- 2、配置通知对象 --> <bean name="myAdvice" class="cn.itcast.advice.MyAdvice"></bean> <!-- 3、配置将通知织入目标对象 --> <aop:config> <!-- 配置切入点 expression:切点表达式 * cn.itcast.service..*ServiceImpl.*(..) *(返回值类型) cn.itcast.service.*ServiceImpl(以ServiceImpl结尾的任何类).*(..) (任何方法-任何参数) --> <aop:pointcut expression="execution(* cn..itcast.service.*ServiceImpl.*(..))" id="pc"/> <aop:aspect ref="myAdvice"> <!-- 指定myAdvice中的before方法作为前置通知 pointcut-ref:切点的引用 --> <aop:before method="before" pointcut-ref="pc"/> <aop:after method="afterReturning" pointcut-ref="pc"/> </aop:aspect> </aop:config>
4、测试demo
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/cn/itcast/springaop/applicationContext.xml") //指定spring的配置文件
public class Test {
//将容器中的 userService 注入到test中
@Resource(name="userService")
private UserService us;
@org.junit.Test
public void test1(){
us.save();
}
}
2、spring aop 的注解配置
1)目标对象
同上
2)通知对象
// 通知类
@Aspect
// 表示该类是一个通知类
public class MyAdvice {
//前置通知
//指定该方法是前置通知 , 并指定切入点
@Before("execution(* cn..itcast.service.*ServiceImpl.*(..))")
public void before(){
System.out.println("这是前置通知!!!");
}
// 后置通知
@AfterReturning("execution(* cn..itcast.service.*ServiceImpl.*(..))")
public void afterReturning(){
System.out.println("这是后置通知(出现异常也会调用)!!!");
}
//环绕通知
@Around("execution(* cn..itcast.service.*ServiceImpl.*(..))")
public Object around(ProceedingJoinPoint pjPoint) throws Throwable {
System.out.println("这是环绕通知之前的部分!!!");
Object proceed = pjPoint.proceed(); //调用目标方法
System.out.println("这是环绕通知之后的部分!!!");
return proceed;
}
//异常通知
@AfterThrowing("execution(* cn..itcast.service.*ServiceImpl.*(..))")
public void afterException() {
System.out.println("出现异常啦)!!!!");
}
//后置通知
@After("execution(* cn..itcast.service.*ServiceImpl.*(..))")
public void after() {
System.out.println("这是后置通知(出现异常不会调用)!!!!");
}
}
3)xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd "> <!-- 准备工作 导入aop命名空间 --> <!-- 1、配置目标对象 --> <bean name="userService" class="cn.itcast.service.UserServiceImpl"></bean> <!-- 2、配置通知对象 --> <bean name="myAdvice" class="cn.itcast.annotationaop.MyAdvice"></bean> <!-- 3、开启使用注解完成织入 --> <aop:aspectj-autoproxy> </aop:aspectj-autoproxy> </beans>
4)测试demo
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:/cn/itcast/annotationaop/applicationContext.xml") //指定spring的配置文件 public class test1 { //将容器中的 userService 注入到test中 @Resource(name="userService") private UserService us; @org.junit.Test public void test1(){ us.save(); } }