Spring中的AOP应用

AOP被称为面向切面编程,AOP中的几个重要概念是:

1。切面。切面就是要实现的功能。切面通常是在多数方法中会用到的相同功能,如写日志。

2。连接点。连接点就是应用程序执行过程中插入切面的地点。如:方法的调用,异常的抛出。

3。通知。通知就是某个切入点要执行的代码,Spring中有四种通知类型:环绕通知(around),前置通知,后置通知和异常通知。

4。切入点。切入点定义了通知应该应用在那些连接点上。

5。引入。引入允许你为已存在的类添加新方法和属性。

6。目标对象。目标对象就是被通知的对象。

7。代理。将通知应用到目标对象后创建的对象。

8。织入。织入就是将切面应用到目标对象从而创建一个新的代理对象的过程。

接下来,我们看看Spring中的四种通知的用法。

1。前置通知。就是在目标对象执行前执行的通知。

实现前置通知只需要实现MethodBeforeAdvice接口,并且实现它的public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable就可以了,在方法中编写需要执行的逻辑,其中arg0表示当前调用的方法,arg1表示的是该方法中传递的参数,arg2表示调用该方法的对象。通知写好后,需要在applicationContext.xml文件中告知应用通知的目标对象是谁。

首先将目标对象和通知都注入到Spring容器中:

<bean id="cat" class="com.lovo.bean.CatBean">
  <property name="msg">
   <value></value>
  </property>
 </bean>

<bean id="myAdvice" class="com.lovo.advise.TestAdvice"></bean> 

然后使用拦截器实现对目标对象的那些行为进行拦截,即定义切入点:

<bean id="myInteceptor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  <property name="advice" ref="myAdvice"></property>
  <property name="pattern" value="com.lovo.bean.(CatBean|DogBean).*"></property>
 </bean> 

上面使用的是正则表达式来验证切入点,即CatBean和DogBean的所有方法在调用时都将被拦截器拦截,并且先执行通知里面的代码,然后再执行我们的调用的方法。

最后还要使用代理来创建代理对象:

<bean id="superBean" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true">
  <property name="interceptorNames">
   <list>
    <value>myInteceptor</value>
   </list>
  </property>
 </bean>
 <bean id="superDog" parent="superBean">
  <property name="target" ref="dog">
  </property>
 </bean>

SuperDog就是由代理创建的代理对象,如果要常见DogBean对象,就不需要new出来了,可以这样做:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

DogBean db = (DogBean)context.getBean("superDog");

实现环绕通知只需实现MethodInterceptor接口,并实现public Object invoke(MethodInvocation arg0) throws Throwable方法即可,不过方法的实地执行就要由arg0.proceed()来执行了。也就是说实地方法的执行是在invoke方法里面执行的。

实现后置通知只需实现AfterReturningAdvice接口,并实现public void afterReturning(Object arg0, Method arg1, Object[] arg2,  Object arg3) throws Throwable方法。后置通知会在方法执行后执行,可以得到方法执行后返回的结果。

异常通知只需实现ThrowsAdvice接口,并实现public void afterThrowing(Exception ex)方法,在方法执行过程中抛出异常时,会调用该方法。

可以根据需要选择一种或几种结合使用。

原文地址:https://www.cnblogs.com/coprince/p/4504805.html