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)方法,在方法执行过程中抛出异常时,会调用该方法。
可以根据需要选择一种或几种结合使用。