在AOP之前、我们的程序一般是从上往下的顺序执行的;
横切面的关注点:就是我们按顺序执行程序时、不知道插入新的程序进来;也就是说只有当程序运行时才能表现出来。当我们碰到这个横切关注点后、需要对此问题进行分析;分析以后对问题进行模块化、模块化一般都会形成一个类,这个类一般就叫做切面类;这个切面类中要做的一般就是对横切性问题给出具体的实现也就是关注点的实现方法、这个方法在AOP中叫做通知;通知可以分为三类:前置通知:就是目标方法执行之前
后置通知:目标方法执行之后
环绕通知:目标方法执行前后
程序中、我们要使用通知的话,一般要有条件;满足这个条件才能使用通知、而条件就叫做切入点。当这个切入点满足通知的条件后、程序运行时通知被应用在具体的那个目标方法点上。这个点叫做连接点、作用:它会封装目标方法上所属信息;信息包括参数、属性等等。
下面我们来看总的流程图吧:
基于以上流程、我们在spring中具体实现:
先定义一个横切面类,再写方法:横切性关注点实现方法即通知
public class MyAspect { /** * 横切性关注点问题的实现 (通知) */ public void outputLog(JoinPoint point) { System.out.println("基于Spring AOP的日志处理。。。。"); } 接着我们在配置一个spring文件、将新建的切面类配置进来;让其实例化 <!-- Spring AOP的实现 是基于Spring IOC --> <bean id="myAspectBean" class="hn.spring.aop.MyAspect"/> 再写AOP配置:aspect的配置中不能创建实例,只能从已配置好的bean实例中获取 <aop:config> <!-- 定义应用通知的条件即切入点;expression为拦截条件、其表达式可自己去查看spring官方文档-- > <aop:pointcut expression=””execution(public * hn.spring..*DAO.get*(..)) id=”myAspectBean”/> <!-- 配置AOP的切面类 --> <aop:aspect id="aopAspect" ref="myAspectBean"> <!-- 通知应用匹配的拦截条件 <aop:before method="outputLog" pointcut-ref="myPointcut"/> </aop:aspect> </aop:config> 我现在来测试、先写个测试用例 public class TestAOP extends TestCase { private ApplicationContext context; public void setUp()throws Exception{ //同样对配置文件进行解析 context = new ClassPathXmlApplicationContext( new String[]{"applicationContext.xml","spring-aop.xml"}); }
使用spring AOP后,从IOC容器中获取Bean实例,满足AOP中配置的Pointcut条件后;自动返回bean实例的代理对象
TestHibernateDAO hibernateDAO = (TestHibernateDAO)context.getBean("hibernateDAO");
//获取对象后、在执行要执行的方法;这个方法跟AOP中拦截的表达式相关
hibernateDAO.saveObject(""); 这样便满足了通知的条件 接着、我们在MyAspect类中去拿到连接点的信息;连接点的信息是动态加载的。 public void outputLog(JoinPoint point) { System.out.println("methodName = " + point.getSignature().getName()); System.out.println("target = " + point.getTarget()); System.out.println("基于Spring AOP的日志处理。。。。"); }