spring  AOP(Aspect-oriented programming) 是用于切面编程,简单的来说:AOP相当于一个拦截器,去拦截一些处理,例如:当一个方法执行的时候,Spring 能够拦截正在执行的方法,在方法执行的前或者后增加额外的功能和处理。

在Spring AOP中支持4中类型的通知:

1:before advice 在方法执行前执行。

2:after  returning  advice 在方法执行后返回一个结果后执行。

3:after  throwing advice 在方法执行过程中抛出异常的时候执行。

4:Around  advice 在方法执行前后和抛出异常时执行,相当于综合了以上三种通知。

下面是一个简单的AOP  advice 的例子:

首先给出一个简单的Spring 注入的例子,

定义一个Book类:

  1. package com.myapp.core.aop.advice;
  2. public class Book {
  3. private  String  name;
  4. private  String  url;
  5. private   int    pages;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public String getUrl() {
  13. return url;
  14. }
  15. public void setUrl(String url) {
  16. this.url = url;
  17. }
  18. public int getPages() {
  19. return pages;
  20. }
  21. public void setPages(int pages) {
  22. this.pages = pages;
  23. }
  24. public  void  printName(){
  25. System.out.println("Book name "+ this.name);
  26. }
  27. public  void  printUrl(){
  28. System.out.println("Book URL "+this.url);
  29. }
  30. public  void  printThrowException(){
  31. throw  new  IllegalArgumentException();
  32. }
  33. }
  1. package com.myapp.core.aop.advice;
  2.  
  3. public class Book {
  4. private String name;
  5. private String url;
  6. private int pages;
  7.  
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. public String getUrl() {
  15. return url;
  16. }
  17. public void setUrl(String url) {
  18. this.url = url;
  19. }
  20. public int getPages() {
  21. return pages;
  22. }
  23. public void setPages(int pages) {
  24. this.pages = pages;
  25. }
  26.  
  27. public void printName(){
  28. System.out.println("Book name "+ this.name);
  29. }
  30.  
  31. public void printUrl(){
  32. System.out.println("Book URL "+this.url);
  33. }
  34.  
  35. public void printThrowException(){
  36. throw new IllegalArgumentException();
  37. }
  38.  
  39. }

相应的配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <!-- more bean definitions for data access objects go here -->
  7. <bean id="book" class="com.myapp.core.aop.advice.Book">
  8. <property name="name" value="Effective java" />
  9. <property name="url" value="www.google.cn"/>
  10. <property name="pages" value="300" />
  11. </bean>
  12. </beans>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6.  
  7. <!-- more bean definitions for data access objects go here -->
  8.  
  9. <bean id="book" class="com.myapp.core.aop.advice.Book">
  10. <property name="name" value="Effective java" />
  11. <property name="url" value="www.google.cn"/>
  12. <property name="pages" value="300" />
  13. </bean>
  14. </beans>

对应的测试类:

  1. package com.myapp.core.aop.advice;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class MainTest {
  5. public static void main(String[] args) {
  6. ApplicationContext  context  = new  ClassPathXmlApplicationContext("resource/aop.xml");
  7. Book   book  =   (Book) context.getBean("book");
  8. System.out.println("---------------------");
  9. book.printName();
  10. System.out.println("---------------------");
  11. book.printUrl();
  12. System.out.println("----------------------");
  13. try{
  14. book.printThrowException();
  15. }catch(Exception e){
  16. //  e.printStackTrace();
  17. }
  18. }
  19. }
  1. package com.myapp.core.aop.advice;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. public class MainTest {
  7. public static void main(String[] args) {
  8.  
  9. ApplicationContext context = new ClassPathXmlApplicationContext("resource/aop.xml");
  10.  
  11. Book book = (Book) context.getBean("book");
  12.  
  13. System.out.println("---------------------");
  14.  
  15. book.printName();
  16.  
  17. System.out.println("---------------------");
  18.  
  19. book.printUrl();
  20.  
  21. System.out.println("----------------------");
  22.  
  23. try{
  24.  
  25. book.printThrowException();
  26.  
  27. }catch(Exception e){
  28. // e.printStackTrace();
  29. }
  30.  
  31. }
  32. }

输出结果:

  1. 三月 20, 2013 11:01:01 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@11e831: startup date [Wed Mar 20 11:01:01 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 11:01:01 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 11:01:01 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@13b5500: defining beans [book]; root of factory hierarchy
  7. ---------------------
  8. Book name Effective java
  9. ---------------------
  10. Book URL www.google.cn
  11. ----------------------
  1. 三月 20, 2013 11:01:01 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@11e831: startup date [Wed Mar 20 11:01:01 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 11:01:01 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 11:01:01 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@13b5500: defining beans [book]; root of factory hierarchy
  7. ---------------------
  8. Book name Effective java
  9. ---------------------
  10. Book URL www.google.cn
  11. ----------------------

下面对以上的Book加上Spring   AOP   advices

1:before  advice

before advice将在方法执行前执行,创建一个实现MethodBeforeAdvice接口的类能够定义执行方法前的操作。
类如下:
  1. package com.myapp.core.aop.advice;
  2. import java.lang.reflect.Method;
  3. import org.springframework.aop.MethodBeforeAdvice;
  4. public class BeforeMethod  implements MethodBeforeAdvice {
  5. @Override
  6. public void before(Method arg0, Object[] arg1, Object arg2)
  7. throws Throwable {
  8. // TODO Auto-generated method stub
  9. System.out.println("Before  Method");
  10. System.out.println("--------------------");
  11. }
  12. }
  1. package com.myapp.core.aop.advice;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.springframework.aop.MethodBeforeAdvice;
  6.  
  7. public class BeforeMethod implements MethodBeforeAdvice {
  8.  
  9. @Override
  10. public void before(Method arg0, Object[] arg1, Object arg2)
  11. throws Throwable {
  12. // TODO Auto-generated method stub
  13.  
  14. System.out.println("Before Method");
  15. System.out.println("--------------------");
  16.  
  17. }
  18.  
  19. }

配置对应的bean:

在aop.xml中配置,创建一个BeforeMethod类,一个新的代理命名为:bookProxy
1: target 设置你想拦截的bean
2:interceptorNames设置通知,你想作用于proxy/target上的
对应的配置文件如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <!-- more bean definitions for data access objects go here -->
  7. <bean id="book" class="com.myapp.core.aop.advice.Book">
  8. <property name="name" value="Effective java" />
  9. <property name="url" value="www.google.cn"/>
  10. <property name="pages" value="300" />
  11. </bean>
  12. <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />
  13. <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  14. <property name="target" ref="book"/>
  15. <property name="interceptorNames">
  16. <list>
  17. <value>beforeMethodBean</value>
  18. </list>
  19. </property>
  20. </bean>
  21. </beans>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6.  
  7. <!-- more bean definitions for data access objects go here -->
  8.  
  9. <bean id="book" class="com.myapp.core.aop.advice.Book">
  10. <property name="name" value="Effective java" />
  11. <property name="url" value="www.google.cn"/>
  12. <property name="pages" value="300" />
  13. </bean>
  14.  
  15. <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />
  16.  
  17. <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  18.  
  19. <property name="target" ref="book"/>
  20.  
  21. <property name="interceptorNames">
  22. <list>
  23. <value>beforeMethodBean</value>
  24. </list>
  25. </property>
  26.  
  27. </bean>
  28. </beans>

注意:为了使用proxy(代理)我们需要引入 CGLIB2, pom.xml文件中注入如下:

  1. <dependency>
  2. <groupId>cglib</groupId>
  3. <artifactId>cglib</artifactId>
  4. <version>2.2.2</version>
  5. </dependency>
  1. <dependency>
  2. <groupId>cglib</groupId>
  3. <artifactId>cglib</artifactId>
  4. <version>2.2.2</version>
  5. </dependency>

运行测试类:

  1. package com.myapp.core.aop.advice;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class MainTest {
  5. public static void main(String[] args) {
  6. ApplicationContext  context  = new  ClassPathXmlApplicationContext("resource/aop.xml");
  7. Book   book  =   (Book) context.getBean("bookProxy");
  8. System.out.println("---------------------");
  9. book.printName();
  10. System.out.println("---------------------");
  11. book.printUrl();
  12. System.out.println("----------------------");
  13. try{
  14. book.printThrowException();
  15. }catch(Exception e){
  16. //  e.printStackTrace();
  17. }
  18. }
  19. }
  1. package com.myapp.core.aop.advice;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. public class MainTest {
  7. public static void main(String[] args) {
  8.  
  9. ApplicationContext context = new ClassPathXmlApplicationContext("resource/aop.xml");
  10.  
  11. Book book = (Book) context.getBean("bookProxy");
  12.  
  13. System.out.println("---------------------");
  14.  
  15. book.printName();
  16.  
  17. System.out.println("---------------------");
  18.  
  19. book.printUrl();
  20.  
  21. System.out.println("----------------------");
  22.  
  23. try{
  24.  
  25. book.printThrowException();
  26.  
  27. }catch(Exception e){
  28. // e.printStackTrace();
  29. }
  30.  
  31. }
  32. }

注意以上获得的是代理bean;

运行结果如下:
  1. 三月 20, 2013 2:18:56 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:18:55 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 2:18:56 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 2:18:57 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,bookProxy]; root of factory hierarchy
  7. ---------------------
  8. Before  Method
  9. --------------------
  10. Book name Effective java
  11. ---------------------
  12. Before  Method
  13. --------------------
  14. Book URL www.google.cn
  15. ----------------------
  16. Before  Method
  17. --------------------
  1. 三月 20, 2013 2:18:56 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:18:55 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 2:18:56 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 2:18:57 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,bookProxy]; root of factory hierarchy
  7. ---------------------
  8. Before Method
  9. --------------------
  10. Book name Effective java
  11. ---------------------
  12. Before Method
  13. --------------------
  14. Book URL www.google.cn
  15. ----------------------
  16. Before Method
  17. --------------------

2: after  advice

在方法运行返回结果后将执行这个 afterReturning方法,创建的这个类必须实现:AfterReturningAdvice接口
  1. package com.myapp.core.aop.advice;
  2. import java.lang.reflect.Method;
  3. import org.springframework.aop.AfterReturningAdvice;
  4. public class AfterMethod  implements  AfterReturningAdvice {
  5. @Override
  6. public void afterReturning(Object arg0, Method arg1, Object[] arg2,
  7. Object arg3) throws Throwable {
  8. // TODO Auto-generated method stub
  9. System.out.println("-------------------");
  10. System.out.println("After  method ");
  11. }
  12. }
  1. package com.myapp.core.aop.advice;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.springframework.aop.AfterReturningAdvice;
  6.  
  7. public class AfterMethod implements AfterReturningAdvice {
  8.  
  9. @Override
  10. public void afterReturning(Object arg0, Method arg1, Object[] arg2,
  11. Object arg3) throws Throwable {
  12. // TODO Auto-generated method stub
  13.  
  14. System.out.println("-------------------");
  15.  
  16. System.out.println("After method ");
  17.  
  18. }
  19.  
  20. }

xml配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <!-- more bean definitions for data access objects go here -->
  7. <bean id="book" class="com.myapp.core.aop.advice.Book">
  8. <property name="name" value="Effective java" />
  9. <property name="url" value="www.google.cn"/>
  10. <property name="pages" value="300" />
  11. </bean>
  12. <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />
  13. <bean id="afterMethodBean" class="com.myapp.core.aop.advice.AfterMethod" />
  14. <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  15. <property name="target" ref="book"/>
  16. <property name="interceptorNames">
  17. <list>
  18. <value>beforeMethodBean</value>
  19. <value>afterMethodBean</value>
  20. </list>
  21. </property>
  22. </bean>
  23. </beans>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6.  
  7. <!-- more bean definitions for data access objects go here -->
  8.  
  9. <bean id="book" class="com.myapp.core.aop.advice.Book">
  10. <property name="name" value="Effective java" />
  11. <property name="url" value="www.google.cn"/>
  12. <property name="pages" value="300" />
  13. </bean>
  14.  
  15. <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />
  16.  
  17. <bean id="afterMethodBean" class="com.myapp.core.aop.advice.AfterMethod" />
  18.  
  19. <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  20.  
  21. <property name="target" ref="book"/>
  22.  
  23. <property name="interceptorNames">
  24. <list>
  25. <value>beforeMethodBean</value>
  26. <value>afterMethodBean</value>
  27. </list>
  28. </property>
  29.  
  30. </bean>
  31. </beans>

运行结果如下:

  1. 三月 20, 2013 2:22:19 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:22:19 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 2:22:19 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 2:22:20 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,afterMethodBean,bookProxy]; root of factory hierarchy
  7. ---------------------
  8. Before  Method
  9. --------------------
  10. Book name Effective java
  11. -------------------
  12. After  method
  13. ---------------------
  14. Before  Method
  15. --------------------
  16. Book URL www.google.cn
  17. -------------------
  18. After  method
  19. ----------------------
  20. Before  Method
  21. --------------------
  1. 三月 20, 2013 2:22:19 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:22:19 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 2:22:19 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 2:22:20 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,afterMethodBean,bookProxy]; root of factory hierarchy
  7. ---------------------
  8. Before Method
  9. --------------------
  10. Book name Effective java
  11. -------------------
  12. After method
  13. ---------------------
  14. Before Method
  15. --------------------
  16. Book URL www.google.cn
  17. -------------------
  18. After method
  19. ----------------------
  20. Before Method
  21. --------------------

3:after  throwing  advice

当方法执行抛出一个异常后,会执行这个方法,创建一个类实现:ThrowsAdvice接口,创建一个afterThrowing拦截:IllegalArgumentException异常。
类如下:
  1. package com.myapp.core.aop.advice;
  2. import org.springframework.aop.ThrowsAdvice;
  3. public class ThrowException  implements ThrowsAdvice{
  4. public  void  afterThrowing(IllegalArgumentException e)  throws  Throwable{
  5. System.out.println("after Throwing  Exception");
  6. }
  7. }
  1. package com.myapp.core.aop.advice;
  2.  
  3. import org.springframework.aop.ThrowsAdvice;
  4.  
  5. public class ThrowException implements ThrowsAdvice{
  6.  
  7. public void afterThrowing(IllegalArgumentException e) throws Throwable{
  8. System.out.println("after Throwing Exception");
  9. }
  10. }

xml中配置文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <!-- more bean definitions for data access objects go here -->
  7. <bean id="book" class="com.myapp.core.aop.advice.Book">
  8. <property name="name" value="Effective java" />
  9. <property name="url" value="www.google.cn"/>
  10. <property name="pages" value="300" />
  11. </bean>
  12. <!-- before  advice -->
  13. <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />
  14. <!-- after  advice -->
  15. <bean id="afterMethodBean" class="com.myapp.core.aop.advice.AfterMethod" />
  16. <!-- throwing  advice -->
  17. <bean id="throwException" class="com.myapp.core.aop.advice.ThrowException" />
  18. <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  19. <property name="target" ref="book"/>
  20. <property name="interceptorNames">
  21. <list>
  22. <value>beforeMethodBean</value>
  23. <value>afterMethodBean</value>
  24. <value>throwException</value>
  25. </list>
  26. </property>
  27. </bean>
  28. </beans>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6.  
  7. <!-- more bean definitions for data access objects go here -->
  8.  
  9. <bean id="book" class="com.myapp.core.aop.advice.Book">
  10. <property name="name" value="Effective java" />
  11. <property name="url" value="www.google.cn"/>
  12. <property name="pages" value="300" />
  13. </bean>
  14.  
  15. <!-- before advice -->
  16. <bean id="beforeMethodBean" class="com.myapp.core.aop.advice.BeforeMethod" />
  17.  
  18. <!-- after advice -->
  19. <bean id="afterMethodBean" class="com.myapp.core.aop.advice.AfterMethod" />
  20.  
  21. <!-- throwing advice -->
  22.  
  23. <bean id="throwException" class="com.myapp.core.aop.advice.ThrowException" />
  24.  
  25. <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  26.  
  27. <property name="target" ref="book"/>
  28.  
  29. <property name="interceptorNames">
  30. <list>
  31. <value>beforeMethodBean</value>
  32. <value>afterMethodBean</value>
  33. <value>throwException</value>
  34. </list>
  35. </property>
  36.  
  37. </bean>
  38. </beans>

执行结果如下:

  1. 三月 20, 2013 2:37:36 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:37:36 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 2:37:36 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 2:37:36 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,afterMethodBean,throwException,bookProxy]; root of factory hierarchy
  7. ---------------------
  8. Before  Method
  9. --------------------
  10. Book name Effective java
  11. -------------------
  12. After  method
  13. ---------------------
  14. Before  Method
  15. --------------------
  16. Book URL www.google.cn
  17. -------------------
  18. After  method
  19. ----------------------
  20. Before  Method
  21. --------------------
  22. after Throwing  Exception
  1. 三月 20, 2013 2:37:36 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 14:37:36 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 2:37:36 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 2:37:36 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,beforeMethodBean,afterMethodBean,throwException,bookProxy]; root of factory hierarchy
  7. ---------------------
  8. Before Method
  9. --------------------
  10. Book name Effective java
  11. -------------------
  12. After method
  13. ---------------------
  14. Before Method
  15. --------------------
  16. Book URL www.google.cn
  17. -------------------
  18. After method
  19. ----------------------
  20. Before Method
  21. --------------------
  22. after Throwing Exception

4:Around  advice

这个advice 联合了上面的三个advices,在方法执行期间执行,创建一个类实现MethodInterceptor接口,需要在方法中执行Object result = methodInvocation.proceed();方法才能得到执行,否则方法不会执行。
类如下:
  1. package com.myapp.core.aop.advice;
  2. import java.util.Arrays;
  3. import org.aopalliance.intercept.MethodInterceptor;
  4. import org.aopalliance.intercept.MethodInvocation;
  5. public class AroundMethod  implements MethodInterceptor{
  6. @Override
  7. public Object invoke(MethodInvocation methodInvocation) throws Throwable {
  8. // TODO Auto-generated method stub
  9. System.out.println("method  name:" + methodInvocation.getMethod().getName());
  10. System.out.println("method  arguments" + Arrays.toString(methodInvocation.getArguments()));
  11. System.out.println("Around  method : before ");
  12. try{
  13. Object result = methodInvocation.proceed();
  14. System.out.println("Around method : after ");
  15. return  result;
  16. }catch(IllegalArgumentException e){
  17. System.out.println("Around method : throw  an  exception ");
  18. throw  e;
  19. }
  20. }
  21. }
  1. package com.myapp.core.aop.advice;
  2.  
  3. import java.util.Arrays;
  4.  
  5. import org.aopalliance.intercept.MethodInterceptor;
  6. import org.aopalliance.intercept.MethodInvocation;
  7.  
  8. public class AroundMethod implements MethodInterceptor{
  9.  
  10. @Override
  11. public Object invoke(MethodInvocation methodInvocation) throws Throwable {
  12. // TODO Auto-generated method stub
  13.  
  14. System.out.println("method name:" + methodInvocation.getMethod().getName());
  15.  
  16. System.out.println("method arguments" + Arrays.toString(methodInvocation.getArguments()));
  17.  
  18. System.out.println("Around method : before ");
  19.  
  20. try{
  21.  
  22. Object result = methodInvocation.proceed();
  23.  
  24. System.out.println("Around method : after ");
  25. return result;
  26.  
  27. }catch(IllegalArgumentException e){
  28.  
  29. System.out.println("Around method : throw an exception ");
  30. throw e;
  31. }
  32. }
  33.  
  34. }

配置文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <!-- more bean definitions for data access objects go here -->
  7. <bean id="book" class="com.myapp.core.aop.advice.Book">
  8. <property name="name" value="Effective java" />
  9. <property name="url" value="www.google.cn"/>
  10. <property name="pages" value="300" />
  11. </bean>
  12. <bean id="aroundMethod"  class="com.myapp.core.aop.advice.AroundMethod" />
  13. <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean" >
  14. <property name="target" ref="book"/>
  15. <property name="interceptorNames">
  16. <list>
  17. <value>aroundMethod</value>
  18. </list>
  19. </property>
  20. </bean>
  21. </beans>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6.  
  7. <!-- more bean definitions for data access objects go here -->
  8.  
  9. <bean id="book" class="com.myapp.core.aop.advice.Book">
  10. <property name="name" value="Effective java" />
  11. <property name="url" value="www.google.cn"/>
  12. <property name="pages" value="300" />
  13. </bean>
  14.  
  15. <bean id="aroundMethod" class="com.myapp.core.aop.advice.AroundMethod" />
  16.  
  17. <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean" >
  18. <property name="target" ref="book"/>
  19.  
  20. <property name="interceptorNames">
  21. <list>
  22.  
  23. <value>aroundMethod</value>
  24. </list>
  25. </property>
  26.  
  27. </bean>
  28. </beans>

测试结果:

  1. 三月 20, 2013 3:02:19 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 15:02:19 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 3:02:19 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 3:02:19 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@e29127: defining beans [book,aroundMethod,bookProxy]; root of factory hierarchy
  7. ---------------------
  8. method  name:printName
  9. method  arguments[]
  10. Around  method : before
  11. Book name Effective java
  12. Around method : after
  13. ---------------------
  14. method  name:printUrl
  15. method  arguments[]
  16. Around  method : before
  17. Book URL www.google.cn
  18. Around method : after
  19. ----------------------
  20. method  name:printThrowException
  21. method  arguments[]
  22. Around  method : before
  23. Around method : throw  an  exception
  1. 三月 20, 2013 3:02:19 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 15:02:19 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 3:02:19 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 3:02:19 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@e29127: defining beans [book,aroundMethod,bookProxy]; root of factory hierarchy
  7. ---------------------
  8. method name:printName
  9. method arguments[]
  10. Around method : before
  11. Book name Effective java
  12. Around method : after
  13. ---------------------
  14. method name:printUrl
  15. method arguments[]
  16. Around method : before
  17. Book URL www.google.cn
  18. Around method : after
  19. ----------------------
  20. method name:printThrowException
  21. method arguments[]
  22. Around method : before
  23. Around method : throw an exception

around  advice得到实现。 over

Spring AOP 中 advice 的四种类型 before after throwing advice around的更多相关文章

  1. Spring AOP中定义切点(PointCut)和通知(Advice)

    如果你还不熟悉AOP,请先看AOP基本原理,本文的例子也沿用了AOP基本原理中的例子.切点表达式 切点的功能是指出切面的通知应该从哪里织入应用的执行流.切面只能织入公共方法.在Spring AOP中, ...

  2. 读书笔记——spring cloud 中 HystrixCommand的四种执行方式简述

    读了<Spring Cloud 微服务实战>第151-154页, 总结如下: Hystrix存在两种Command,一种是HystrixCommand,另一种是HystrixObserva ...

  3. Spring AOP中的动态代理

    0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1  ...

  4. 转:Spring AOP中的动态代理

    原文链接:Spring AOP中的动态代理 0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  S ...

  5. 正确理解Spring AOP中的Around advice

    Spring AOP中,有Before advice和After advice,这两个advice从字面上就可以很容易理解,但是Around advice就有点麻烦了. 乍一看好像是Before ad ...

  6. Spring中bean的四种注入方式

    一.前言   最近在复习Spring的相关内容,这篇博客就来记录一下Spring为bean的属性注入值的四种方式.这篇博客主要讲解在xml文件中,如何为bean的属性注入值,最后也会简单提一下使用注解 ...

  7. C#中方法的参数的四种类型

    C#中方法的参数有四种类型:       1. 值参数类型  (不加任何修饰符,是默认的类型)       2. 引用型参数  (以ref 修饰符声明)       3. 输出型参数  (以out 修 ...

  8. 领域模型中的实体类分为四种类型:VO、DTO、DO、PO

    http://kb.cnblogs.com/page/522348/ 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: V ...

  9. 域模型中的实体类分为四种类型:VO、DTO、DO、PO

    经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析. 得出的主要结论是:在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应 ...

随机推荐

  1. eclipse中spring配置文件的自动提示和namespace的添加

    在用spring或者springmvc框架进行开发时,编辑applicationcontext.xml等配置文件是必不可少的,在eclipse中打开applicationcontext.xml通常是这 ...

  2. (转载)Docker的boot2docker.iso镜像使用

    原文路径:https://blog.csdn.net/jiangjingxuan/article/details/54908272#commentsedit 在Docker首次启动时需要下载的一个bo ...

  3. 计算几何-UVa10652

    This article is made by Jason-Cow.Welcome to reprint.But please post the article's address. 题意见白书,P2 ...

  4. HDU 2586(LCA欧拉序和st表)

    什么是欧拉序,可以去这个大佬的博客(https://www.cnblogs.com/stxy-ferryman/p/7741970.html)巨详细 因为欧拉序中的两点之间,就是两点遍历的过程,所以只 ...

  5. python浅析对return的理解

    函数外部的代码要想获取函数的执行结果,就可以在函数里面用return语句,把结果返回. return 代表一个函数的终止,如果return 后面带一个print 或者return  ,则后面的不执行 ...

  6. LinuxC下argv,argc[]的意义

    MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  7. Codeforces Round #579 (Div. 3) 题解

    比赛链接:https://codeforc.es/contest/1203/ A. Circle of Students 题意:\(T\)组询问,每组询问给出\(n\)个数字,问这\(n\)个数字能否 ...

  8. opencv:图像的算术操作

    前提:输入图像的大小和类型必须一致 越界处理: 大于255,则会减去255 小于0,则等于0 基本计算,加减乘除 #include <opencv2/opencv.hpp> #includ ...

  9. Java进阶学习(3)之对象容器(下)

    对象数组 对象数组中的每个元素都是对象的管理者而非对象本身 对象数组的for—each循环 集合容器(HashSet) HashSet 数学中的集合,元素间满足互异性.确定性.无序性 HashSet& ...

  10. turtle库常用命令

    一, 海龟动作: 移动和绘制 forward()| fd() 前进多少 backward()|bk()|back()后退 right()|rt() 右转多少度 left() 左转多少度 goto()| ...