第一步 导包
第二步 编写UserDaoIfac接口以及UserDaoImpl实现类
UserDaoIfac接口
package dao;
public interface UserDaoIfac {
public void login(String name);
}
UserDaoImpl类
package dao;
public class UserDaoImpl implements UserDaoIfac {
public void login(String name) {
System.out.println(name+"正在登录。。。。。。");
}
}
第三步 编写ExtendFilter拦截器类,使用注解方式
package test;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
//定义一个切面
@Aspect
public class ExtendFilter {
//定义一个切入点( dao包及子包的所有类调用任何方法,都使用代理)
@Pointcut("execution(* dao..*(..))")
private void test() {}
/**
* 前置通知,在一个方法执行前被调用。
*/
@Before("test()")
public void before() {
System.out.println("前置通知......");
}
/**
* 环绕通知,在方法执行之前和之后调用的通知。
*/
@Around("test()")
public Object around(ProceedingJoinPoint joinpoint) {
System.out.println("环绕通知上......");
Object o=null;
try {
o=joinpoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("环绕通知下......");
return o;
}
/**
* 返回通知,仅当方法成功完成后执行的通知。
*/
@AfterReturning(pointcut="test()",returning="obj")//切入点 , 连接点的返回值
public void afterReturning(JoinPoint joinpoint,Object obj){
System.out.println("返回通知......");
}
/**
* 异常通知,在方法抛出异常退出时执行的通知。
*/
@AfterThrowing(pointcut="test()",throwing="ex")
public void afterThrowing(JoinPoint joinpoint,Exception ex) {
System.out.println("异常通知......");
}
/**
* 后置通知,在方法执行之后调用的通知,无论方法执行是否成功。
*/
@After("test()")
public void after() {
System.out.println("后置通知......");
}
}
第四步 配置beans.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: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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--开始智能代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="userDao" class="dao.UserDaoImpl"></bean>
<bean id="extendFilter" class="test.ExtendFilter"></bean>
</beans>
第五步 Test测试类
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import dao.UserDaoIfac;
public class Test2 {
public static void main(String[] args) {
ApplicationContext act=new ClassPathXmlApplicationContext("beans2.xml");
UserDaoIfac dao=(UserDaoIfac) act.getBean("userDao");
dao.login("Test");
}
}
测试结果
十月 17, 2019 12:45:45 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3f91beef: startup date [Thu Oct 17 00:45:45 CST 2019]; root of context hierarchy
十月 17, 2019 12:45:45 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans2.xml]
环绕通知上......
前置通知......
Test正在登录。。。。。。
环绕通知下......
后置通知......
返回通知......