Spring - xml方式配置AOP解析(13)

通知的类型

  • 前置通知
public class MyAspectJ {
    public void check() {
        System.out.println("check");
    }
}
<bean id="userDao" class="com.spring.secondday.UserDaoImpl">
    <property name="name" value="hello"></property>
</bean>
<bean id="myAspectJ" class="com.spring.secondday.MyAspectJ"></bean>
<aop:config>
    <aop:pointcut expression="execution(* com.spring.secondday.UserDaoImpl.save(..))" id="pointcut1"/>
    <aop:aspect ref="myAspectJ" >
        <aop:before method="check" pointcut-ref="pointcut1"/>
    </aop:aspect>
</aop:config>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
    @Resource(name="userDao")
    private UserDao ud;
    @org.junit.Test
    public void demo() {
        ud.save();
        /*Console:
         *      checkin
                保存...        */
    }
}
  • 后置通知
public class UserDaoImpl implements UserDao{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void save() { System.out.println("保存...");   }
    public String delete() { return "del";  }
    public void talk() {
        System.out.println("接口中没有我");
    }
    public String toString() {
        return "UserDaoImpl [name=" + name + "]";
    }
}
public class MyAspectJ {
    public void check() {
        System.out.println("check");
    }
    public void log(Object ret) {
        System.out.println(ret);
    }
}
<bean id="userDao" class="com.spring.secondday.UserDaoImpl">
    <property name="name" value="hello"></property>
</bean>
<bean id="myAspectJ" class="com.spring.secondday.MyAspectJ"></bean>
<aop:config>
    <aop:pointcut expression="execution(* com.spring.secondday.UserDaoImpl.delete(..))" id="pointcut2"/>

    <aop:aspect ref="myAspectJ" >
        <aop:after-returning method="log" pointcut-ref="pointcut2" returning="ret"/>
    </aop:aspect>
</aop:config>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
    @Resource(name="userDao")
    private UserDao ud;
    @org.junit.Test
    public void demo() {
        ud.delete();
        /*Console:
         *      del              */
    }
}
  • 环绕通知
public class UserDaoImpl implements UserDao{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void update() { System.out.println("更新..."); }
    public String toString() {
        return "UserDaoImpl [name=" + name + "]";
    }
}
public class MyAspectJ {
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("before");
        Object proceed = pjp.proceed();
        System.out.println("after");
        return proceed;
    }
}
<bean id="userDao" class="com.spring.secondday.UserDaoImpl">
    <property name="name" value="hello"></property>
</bean>
<bean id="myAspectJ" class="com.spring.secondday.MyAspectJ"></bean>
<aop:config>
    <aop:pointcut expression="execution(* com.spring.secondday.UserDaoImpl.update(..))" id="pointcut3"/>

    <aop:aspect ref="myAspectJ" >
        <aop:around method="around"  pointcut-ref="pointcut3"/>
    </aop:aspect>
</aop:config>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
    @Resource(name="userDao")
    private UserDao ud;
    @org.junit.Test
    public void demo() {
        ud.update();
        /*Console:
         *      before
                更新...
                after                */
    }
}
  • 异常通知
public class UserDaoImpl implements UserDao{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString() {
        return "UserDaoImpl [name=" + name + "]";
    }
    public void find() {
        System.out.println(1 / 0);
    }
}
import org.aspectj.lang.ProceedingJoinPoint;

public class MyAspectJ {
    public void throwing(Throwable th) {
        System.out.println(th.getMessage());
    }
}
<bean id="userDao" class="com.spring.secondday.UserDaoImpl">
    <property name="name" value="hello"></property>
</bean>
<bean id="myAspectJ" class="com.spring.secondday.MyAspectJ"></bean>
<aop:config>
    <aop:pointcut expression="execution(* com.spring.secondday.UserDaoImpl.find(..))" id="pointcut4"/>
    <aop:aspect ref="myAspectJ" >
        <aop:after-throwing method="throwing" pointcut-ref="pointcut4" throwing="th" />
    </aop:aspect>
</aop:config>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
    @Resource(name="userDao")
    private UserDao ud;
    @org.junit.Test
    public void demo() {
        ud.find();
        /*Console:
         *      / by zero                */
    }
}

表达式语法

表达式语法指的是execution()里面的配置,而execution()是一个方法,语法:[访问修饰符] 返回值 全包名.方法(参数),如:

  • * com.spring.secondday.*.*(..):表示com.spring.secondday包下所有类的所有方法。
  • Double com.first.secondday.*(..)com.spring.secondday类下所有返回值为Double类型的方法。
  • * com.spring.secondday.*Dao(..)com.spring.secondday类下所有以Dao结尾的方法。

猜你喜欢

转载自blog.csdn.net/qq_38206090/article/details/82685887