1 前置通知:
Application.xml引入aop命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
然后配置个切点和切面
配置切点和切面之前 需要写一个日志类。
既然你要使用aop,就是希望在某个操作之前或者之后做一些操作,那么执行这些操作的类当然是由你自己定义。
这里我希望在操作执行之前打印记录~~~~~~~~~~~~
代码:
publicclass LoggerUtil {
publicvoid log(){
System.out.println("记录~~~~~~~~~~~~");
}
}
非常简单,下面需要做的就是,把这个输出操作配置到xml里面。这个操作就像是一个切面,为这个操作找准一个切点。
为了测试 这里还定义了一个接口还一个类
public interface UserDao {
void insert();
void update();
void delete();
}
public class UserDaoImpl implements UserDao{
public void delete() {
System.out.println("删除~~~~~~~~~~~~");
}
public void insert() {
System.out.println("插入~~~~~~~~~~~~");
}
public void update() {
System.out.println("更新~~~~~~~~~~~~");
}
}
在application.xml配置bean。
<bean id="userDaoImpl" class="com.javalong.spring.day01.UserDaoImpl"></bean>
Test:
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao)context.getBean("userDaoImpl");
userDao.delete();
Out:
记录~~~~~~~~~~~~
删除~~~~~~~~~~~~
在删除前,我做了下记录。
下面看我的xml里面是怎么配置切点和切面的。
<aop:config>
<aop:pointcut expression="execution (* *.*(..))" id="testpointcut"/>
<aop:aspect id="testaspect" ref="loggerUtil">
<aop:before method="log" pointcut-ref="testpointcut"/>
</aop:aspect>
</aop:config>
execution (* *.*(..)) 意思就是,当我执行任何方法时。
<aop:before method="log" pointcut-ref="testpointcut"/>意思是我在执行这个方法之前,我要执行log方法,这个log方法是哪来的呢?<aop:aspect id="testaspect" ref="loggerUtil">
是来自loggerUtil这个bean。 执行这个方法之前,这个方法是代表哪个方法呢?
<aop:pointcut expression="execution (* *.*(..))" id="testpointcut"/>任何方法。
2 后置通知:
<aop:before> 改为 <aop:after-returning>
Out:
删除~~~~~~~~~~~~
记录~~~~~~~~~~~~
3 出错通知
<aop:before> 改为 <aop:after-throwing>
4.最终通知
<aop:before> 改为 <aop:after> 相当于 finally{},不管是否报错 都执行。
5.环绕通知
<aop:before> 改为 <aop:around>
log() 由无参变为有参,参数为ProceedingJoinPoint
代码:
publicvoid log(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("记录前~~~~~~~~~~~~");
pjp.proceed();
System.out.println("记录后~~~~~~~~~~~~");
}
输出:
记录前~~~~~~~~~~~~
删除~~~~~~~~~~~~
记录后~~~~~~~~~~~~