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)方法,在方法执行过程中抛出异常时,会调用该方法。

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

最新文章

  1. fielderror里的fieldName代表的是jsp里的fieldName还是Action类的成员变量?(待解答)
  2. Git tag 给当前分支打标签
  3. Git 使用的配置 常用命令
  4. 省赛13 Alice and Bob(二进制,找规律)
  5. Xcode各版本官方下载及百度云盘下载, Mac和IOS及Xcode版本历史.
  6. 【BZOJ】【2844】albus就是要第一个出场
  7. LeetCode Invert Binary Tree 反转二叉树
  8. 30+最佳Ajax jQuery的自动完成插件的例子
  9. 个推推送 产品SDK常见问题检查
  10. 在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序
  11. cors解决Web跨域访问问题
  12. Codeforces 839A Arya and Bran【暴力】
  13. 小程序for循环中通过index实现单个点击事件
  14. 《程序设计入门——C语言》翁恺老师 第四周编程练习记录
  15. iptables防护CC和DDos和PPTP穿透脚本
  16. Tomcat运行javaweb项目时出现的一个bug
  17. jQuery跳转到页面指定位置
  18. java命令行指定log4j2
  19. ip 命令的使用
  20. Mybatis缓存理解

热门文章

  1. PostgreSQL Hardware Performance Tuning
  2. Python编程规范(PEP8)
  3. HTML和JSON的数据交互-HTML模板
  4. C#中锁定Word内容,样把人家的锁定内容破解了
  5. 使用iBATIS3.0完成增删改查
  6. ws318 配置
  7. HTML5之Canvas绘图实例——饼状图
  8. CentOS6.5系统挂载NTFS分区的移动硬盘 centos安装repoforge源(yum)
  9. eclipse项目里面的类有时候会莫名其妙出现很多错误
  10. [mysql] mysql主从复制(基于日志点)