通知的类型
- 前置通知
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结尾的方法。