通知类型的注解版
操作步骤如下:
(1)在spring配置中设置开启注解配置
(2)在切面上添加@Aspect注解,标识为切面类
(3)定义一个孔方法,在方法上添加@Pointcut注解定义切入点
(4)在对应的通知上面添加对应的通知类型注解:
@Before@After@Around@After-Throwing@After-Returning
以下通过一个例子来接下:
定义一个接口:
package com.it.spring.aop1.dao;
public interface UserDAO {
void addUser();
String addUser(int id);
void delUser();
void updateUser();
void queryAllUser();
void findUser();
}
定义一个实现类:
package com.it.spring.aop1.dao;
import org.springframework.stereotype.Repository;
@Repository("userDAO")
public class UserDAOImpl implements UserDAO {
@Override
public void addUser() {
System.out.println("------addUser()-----");
}
@Override
public String addUser(int id) {
System.out.println("---------addUser(int id)------------");
return "addUser---后置通知";
}
@Override
public void delUser() {
System.out.println("------delUser()-----");
}
@Override
public void updateUser() {
//System.out.println(12/0);
System.out.println("-----updateUser()-----");
}
@Override
public void queryAllUser() {
System.out.println("-----queryAllUser()-----");
}
@Override
public void findUser() {
System.out.println("------findUser()-----");
}
}
增强类(在切面类上使用注解)
方法一:
package com.it.spring.aop1.dao;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class MyAspect {
//<aop:pointcut id="pointcut1" expression="execution(* com.it.spring.aop4.dao.ProductDAOImpl.addProduct(..))"></aop:pointcut>
//<aop:before method="checkPri" pointcut-ref="pointcut1"></aop:before>
@Before(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.addUser())")
public void before(){
System.out.println("---------------前置通知-----------------");
}
@AfterReturning(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.addUser(*))",returning = "rs")
public void afterReturning(Object rs){
System.out.println("---------------后置通知-----------------"+rs);
}
@AfterReturning(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.queryAllUser())")
public void afterReturning(){
System.out.println("---------------后置通知-----------------");
}
//@Around(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.delUser())")
@Around(value = "MyAspect2.pointCut3()")
public Object around(ProceedingJoinPoint joinPoint)throws Throwable{
System.out.println("-------------环绕通知前----------------");
Object object = joinPoint.proceed();
System.out.println("-------------环绕通知后----------------");
return object;
}
@AfterThrowing(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.updateUser(..))",throwing = "throwable")
public void afterThrowing(Throwable throwable){
System.out.println("-------------异常通知-----------------"+throwable.getMessage());
}
@After(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.updateUser(..))")
public void after(){
System.out.println("-------最终通知----------------");
}
}
增强类:
方法二:
这种书写方式,把方法封装了起来,简化了代码。
package com.it.spring.aop1.dao;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class MyAspect2 {
//设置切入点
@Pointcut(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.addUser(*))")
public void pointCut1(){}
@Pointcut(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.delUser())")
private void pointCut2(){}
@Pointcut(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.updateUser())")
public void pointCut3(){}
@Pointcut(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.findUser())")
private void pointCut4(){}
@Pointcut(value = "execution(* com.it.spring.aop1.dao.UserDAOImpl.queryAllUser())")
private void pointCut5(){}
@Before(value = "MyAspect2.pointCut3()")
public void before(){
System.out.println("--------前置通知----------------");
}
@AfterReturning(value = "MyAspect2.pointCut2()")
public void afterReturing(){
System.out.println("-------后置通知----------------");
}
@AfterReturning(value = "MyAspect2.pointCut1()",returning = "rs")
public void afterReturing(Object rs){
System.out.println("-------带返回值后置通知----------------"+rs);
}
@Around(value = "MyAspect2.pointCut5()")
public Object around(ProceedingJoinPoint joinPoint)throws Throwable{
System.out.println("--------------环绕通知前---------------");
Object object = joinPoint.proceed();
System.out.println("--------------环绕通知后---------------");
return object;
}
@AfterReturning(value = "MyAspect2.pointCut2()",returning = "throwable")
public void afterThrowing(Throwable throwable){
System.out.println("-------异常通知----------------"+throwable);
}
@After(value = "MyAspect2.pointCut4()")
public void after(){
System.out.println("--------最终通知----------------");
}
}
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: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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!-- 开启注解-->
<context:component-scan base-package="com.it.spring.aop1.dao"></context:component-scan>
<!-- 在配置文件中打开AOP的注解开发-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- 管理切面类-->
<bean id="myAspect" class="com.it.spring.aop1.dao.MyAspect"></bean>
<!-- <bean id="myAspect2" class="com.it.spring.aop1.dao.MyAspect2"></bean>-->
</beans>