AOP ( Aspect  Oriented Programming  面向切面编程)
  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

面向对象编程是从【静态角度】考虑程序的结构,而面向切面编程是从【动态角度】考虑程序运行过程。
  AOP底层,就是采用【动态代理】模式实现的。采用了两种代理:JDK动态代理和CGLIB动态代理。

基本术语(一些名词):
   (1)切面(Aspect)
      切面泛指[*交叉业务逻辑*]。事务处理和日志处理可以理解为切面。常用的切面有通知(Advice)与顾问(Advisor)。实际就是对主业务逻辑的一种增强。

(2)织入(Weaving)
       织入是指将切面代码插入到目标对象的过程。代理的invoke方法完成的工作,可以称为织入。

(3) 连接点(JoinPoint)   
       连接点是指可以被切面织入的方法。通常业务接口的方法均为连接点

(4)切入点(PointCut)
      切入点指切面具体织入的方法
      注意:被标记为final的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。

(5)目标对象(Target)
       目标对象指将要被增强的对象。即包含主业务逻辑的类的对象。
    
     (6)通知(Advice) 
       通知是切面的一种实现,可以完成简单的织入功能。通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是执行之后执行等。切入点定义切入的位置,通知定义切入的时间。

(7)顾问(Advisor)
        顾问是切面的另一种实现,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂切面的装配器。

AOP是一种思想,而非实现
  AOP是基于OOP,而又远远高于OOP,主要是将主要核心业务和交叉业务分离,交叉业务就是切面。例如,记录日志和开启事务。

代码展示:

一。前置增强和后置增强

ISomeService.java

  1. package cn.aop01;
  2. /**
  3. * 接口
  4. * @author Happy
  5. *
  6. */
  7. public interface ISomeService {
  8. //开启事务
  9. public void doTransaction();
  10. //日志
  11. public String doLog();
  12. }

SomeServiceImpl.java

  1. package cn.aop01;
  2.  
  3. public class SomeServiceImpl implements ISomeService {
  4.  
  5. public void doTransaction() {
  6. System.out.println("开启事务");
  7.  
  8. }
  9.  
  10. public String doLog() {
  11. System.out.println("书写日志");
  12. return null;
  13. }
  14.  
  15. }

MyMethodBeforeAdvice.java(前置增强)

  1. package cn.aop01;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.springframework.aop.MethodBeforeAdvice;
  6.  
  7. public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
  8.  
  9. public void before(Method method, Object[] args, Object target)
  10. throws Throwable {
  11. System.out.println("==============before");
  12.  
  13. }
  14.  
  15. }

applicationContext.xml(Spring配置文件 前置增强)

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="
  4. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 01.配置目标对象 -->
  6. <bean id="someService" class="cn.aop01.SomeServiceImpl"></bean>
  7.  
  8. <!-- 02.配置前置增强 -->
  9. <bean id="beforeAdvice" class="cn.aop01.MyMethodBeforeAdvice"></bean>
  10.  
  11. <!-- 03.配置代理工厂bean -->
  12. <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
  13. <!-- 目标对象,对哪个对象的方法做增强 -->
  14. <property name="target" ref="someService"></property>
  15. <property name="interceptorNames" value="beforeAdvice"></property>
  16. </bean>
  17.  
  18. </beans>

MyTest.java

  1. package cn.aop01;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. public class MyTest {
  8.  
  9. @Test
  10. public void myBeforeAdviceTest(){
  11. ApplicationContext ctx=new ClassPathXmlApplicationContext("cn/aop01/applicationContext.xml");
  12. ISomeService service=(ISomeService)ctx.getBean("proxyService");
  13. service.doLog();
  14. service.doTransaction();
  15. }
  16. }

效果展示:


ISomeService.java

  1. package cn.aop01;
  2. /**
  3. * 接口
  4. * @author Happy
  5. *
  6. */
  7. public interface ISomeService {
  8. //开启事务
  9. public void doTransaction();
  10. //日志
  11. public String doLog();
  12. }

SomeServiceImpl.java

  1. package cn.aop01;
  2.  
  3. public class SomeServiceImpl implements ISomeService {
  4.  
  5. public void doTransaction() {
  6. System.out.println("开启事务");
  7.  
  8. }
  9.  
  10. public String doLog() {
  11. System.out.println("书写日志");
  12. return null;
  13. }
  14.  
  15. }

MyAfterReturningAdvice.java(后置增强)

  1. package cn.aop02after;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.springframework.aop.AfterReturningAdvice;
  6. import org.springframework.aop.MethodBeforeAdvice;
  7.  
  8. public class MyAfterReturningAdvice implements AfterReturningAdvice {
  9.  
  10. public void afterReturning(Object returnValue, Method method,
  11. Object[] args, Object target) throws Throwable {
  12. System.out.println("执行后置通知方法");
  13. if (returnValue!=null) {
  14. returnValue=((String)returnValue).toUpperCase();
  15. }
  16. }
  17.  
  18. }

applicationContext.xml(Spring配置文件 后置增强)

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="
  4. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 01.配置目标对象 -->
  6. <bean id="someService" class="cn.aop02after.SomeServiceImpl"></bean>
  7.  
  8. <!-- 02.配置前置增强 -->
  9.  
  10. <bean id="afterAdvice" class="cn.aop02after.MyAfterReturningAdvice"></bean>
  11. <!-- 03.配置代理工厂bean -->
  12. <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
  13. <!-- 目标对象,对哪个对象的方法做增强 -->
  14. <property name="target" ref="someService"></property>
  15. <property name="interceptorNames" value="afterAdvice"></property>
  16. </bean>
  17.  
  18. </beans>

MyTest.java

  1. package cn.aop01;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. public class MyTest {
  8.  
  9. @Test
  10. public void myBeforeAdviceTest(){
  11. ApplicationContext ctx=new ClassPathXmlApplicationContext("cn/aop01/applicationContext.xml");
  12. ISomeService service=(ISomeService)ctx.getBean("proxyService");
  13. service.doLog();
  14. service.doTransaction();
  15. }
  16. }

效果展示:


二:异常抛出增强和环绕增强

ISomeService.java

  1. package cn.aop01;
  2. /**
  3. * 接口
  4. * @author Happy
  5. *
  6. */
  7. public interface ISomeService {
  8. //开启事务
  9. public void doTransaction();
  10. //日志
  11. public String doLog();
  12. }

SomeServiceImpl.java

  1. package cn.aop01;
  2.  
  3. public class SomeServiceImpl implements ISomeService {
  4.  
  5. public void doTransaction() {
  6. System.out.println("开启事务");
  7.  
  8. }
  9.  
  10. public String doLog() {
  11. System.out.println("书写日志");
  12. return null;
  13. }
  14.  
  15. }

MyMethodInterceptor.java(环绕增强)

  1. package cn.aop03Interceptor;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.aopalliance.intercept.MethodInterceptor;
  6. import org.aopalliance.intercept.MethodInvocation;
  7. import org.springframework.aop.MethodBeforeAdvice;
  8.  
  9. public class MyMethodInterceptor implements MethodInterceptor {
  10.  
  11. public Object invoke(MethodInvocation invocation) throws Throwable {
  12. System.out.println("目标方法执行前");
  13. Object result = invocation.proceed();
  14. if (result!=null) {
  15. result=((String)result).toUpperCase();
  16. }
  17. System.out.println("目标方法执行后");
  18. return result;
  19. }
  20.  
  21. }

applicationContext.xml(Spring配置文件 环绕增强)

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="
  4. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 01.配置目标对象 -->
  6. <bean id="someService" class="cn.aop03Interceptor.SomeServiceImpl"></bean>
  7.  
  8. <!-- 02.配置前置增强 -->
  9. <bean id="methodAdvice" class="cn.aop03Interceptor.MyMethodInterceptor"></bean>
  10.  
  11. <!-- 03.配置代理工厂bean -->
  12. <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
  13. <!-- 目标对象,对哪个对象的方法做增强 -->
  14. <property name="target" ref="someService"></property>
  15. <property name="interceptorNames" value="methodAdvice"></property>
  16. </bean>
  17.  
  18. </beans>

MyTest.java

  1. package cn.aop03Interceptor;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. public class MyTest {
  8.  
  9. @Test
  10. public void myBeforeAdviceTest(){
  11. ApplicationContext ctx=new ClassPathXmlApplicationContext("cn/aop03Interceptor/applicationContext.xml");
  12. ISomeService service=(ISomeService)ctx.getBean("proxyService");
  13. service.doLog();
  14. service.doTransaction();
  15. }
  16. }

效果展示:


ISomeService.java

  1. package cn.aop01;
  2. /**
  3. * 接口
  4. * @author Happy
  5. *
  6. */
  7. public interface ISomeService {
  8. //开启事务
  9. public void doTransaction();
  10. //日志
  11. public String doLog();
  12. }

SomeServiceImpl.java

  1. package cn.aop04throwsadvice;
  2.  
  3. public class SomeServiceImpl implements ISomeService {
  4.  
  5. //开始事务
  6. public void doTransaction() throws Exception{
  7. int result=5/0;
  8. System.out.println("开启事务");
  9.  
  10. }
  11.  
  12. //日志
  13. public String doLog() {
  14. System.out.println("书写日志");
  15. return null;
  16. }
  17.  
  18. }

MyThrowsAdvice.java(异常抛出增强)

  1. package cn.aop04throwsadvice;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.springframework.aop.ThrowsAdvice;
  6.  
  7. public class MyThrowsAdvice implements ThrowsAdvice {
  8.  
  9. public void afterThrowing(Exception ex){
  10. System.out.println("亲,出错了啊!");
  11. }
  12.  
  13. }

applicationContext.xml(Spring配置文件 异常抛出增强)

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="
  4. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 01.配置目标对象 -->
  6. <bean id="someService" class="cn.aop04throwsadvice.SomeServiceImpl"></bean>
  7.  
  8. <!-- 02.配置前置增强 -->
  9. <bean id="throwsAdvice" class="cn.aop04throwsadvice.MyThrowsAdvice"></bean>
  10.  
  11. <!-- 03.配置代理工厂bean -->
  12. <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
  13. <!-- 目标对象,对哪个对象的方法做增强 -->
  14. <property name="target" ref="someService"></property>
  15. <property name="interceptorNames" value="throwsAdvice"></property>
  16. </bean>
  17.  
  18. </beans>

MyTest.java

  1. package cn.aop04throwsadvice;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. public class MyTest {
  8.  
  9. @Test
  10. public void myBeforeAdviceTest() throws Exception{
  11. ApplicationContext ctx=new ClassPathXmlApplicationContext("cn/aop04throwsadvice/applicationContext.xml");
  12. ISomeService service=(ISomeService)ctx.getBean("proxyService");
  13. service.doLog();
  14. service.doTransaction();
  15. }
  16. }

效果展示:


三。顾问(Advisor)实现前置增强

通知Advice是Spring提供的一种切面(Aspect)。但其功能过于简单,只能
将切面织入到目标类的所有目标方法中,无法完成将切面织入到指定目标方法中。

顾问Advisor是Spring提供的另一种切面。其可以完成更为复杂的切面织入功能。PointcutAdvisor是顾问的一种,可以指定具体
的切入点。顾问将通知进行了包装,会根据不同的通知类型,在不同的时间点,将切面织入到不同的切入点。
PointcutAdvisor接口有两个较为常用的实现类:
*:NameMatchMethodPointcutAdvisor 名称匹配方法切入点顾问
*:RegexpMethodPointcutAdvisor 正则表达式匹配方法切入点顾问
<property name="pattern" value=".*do.*"></property> 表示方法全名(包名,接口名,方法名)
运算符 名称 意义
. 点号 表示任意单个字符
+ 加号 表示前一个字符出现一次或者多次
* 星号 表示前一个字符出现0次或者多次


=====BeanName自动代理生成器
BeanNameAutoProxyCreator

ISomeService.java

  1. package service;
  2. //接口
  3. public interface ISomeService {
  4. //待实现的方法
  5. public void doFirst();
  6. public void doSecond();
  7. }

2.SomeServiceImpl.java

  1. package service;
  2. //接口实现类
  3. public class SomeServiceImpl implements ISomeService {
  4. //实现接口定义的方法
  5. @Override
  6. public void doFirst() {
  7. System.out.println("方法A");
  8. }
  9.  
  10. @Override
  11. public void doSecond() {
  12. System.out.println("方法B");
  13. }
  14.  
  15. }

3.MyMethodBeforeAdvice.java

  1. package cn.aop05aopadvisor;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.springframework.aop.MethodBeforeAdvice;
  6.  
  7. public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
  8.  
  9. public void before(Method method, Object[] args, Object target)
  10. throws Throwable {
  11. System.out.println("呵呵,喝~~~~~喝 呵呵呵");
  12.  
  13. }
  14.  
  15. }

applicationContext.xml(Spring配置文件 )

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="
  4. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 01.配置目标对象 -->
  6. <bean id="someService" class="cn.aop05aopadvisor.SomeServiceImpl"></bean>
  7.  
  8. <!-- 02. 通知 配置前置增强 -->
  9. <bean id="beforeAdvice" class="cn.aop05aopadvisor.MyMethodBeforeAdvice"></bean>
  10.  
  11. <!-- 03.配置顾问 advisor 包装 advice-->
  12. <bean id="beforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
  13. <property name="advice" ref="beforeAdvice"></property>
  14. <property name="mappedNames" value="do*"></property>
  15. </bean>
  16.  
  17. <!-- 04.配置代理工厂bean -->
  18. <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
  19. <!-- 目标对象,对哪个对象的方法做增强 -->
  20. <property name="target" ref="someService"></property>
  21. <property name="interceptorNames" value="beforeAdvice"></property>
  22. </bean>
  23.  
  24. </beans>

Test.java

  1. package cn.aop05aopadvisor;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. public class MyTest {
  8.  
  9. @Test
  10. public void myBeforeAdviceTest() throws Exception{
  11. ApplicationContext ctx=new ClassPathXmlApplicationContext("cn/aop05aopadvisor/applicationContext.xml");
  12. ISomeService service=(ISomeService)ctx.getBean("proxyService");
  13. service.doLog();
  14. service.doTransaction();
  15. }
  16. }

效果展示:


======使用正则自动代理生成器

ISomeService.java

  1. package cn.aop05aopadvisor_regex;
  2. /**
  3. * 接口
  4. * @author Happy
  5. *
  6. */
  7. public interface ISomeService {
  8. //开启事务
  9. public void doTransaction() throws Exception;
  10. //日志
  11. public String doLog();
  12. }

SomeServiceImpl.java

  1. package cn.aop05aopadvisor_regex;
  2.  
  3. public class SomeServiceImpl implements ISomeService {
  4.  
  5. public void doTransaction() throws Exception{
  6. System.out.println("开启事务");
  7.  
  8. }
  9.  
  10. public String doLog() {
  11. System.out.println("书写日志");
  12. return null;
  13. }
  14.  
  15. }

MyMethodBeforeAdvice.java

  1. package cn.aop05aopadvisor_regex;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.springframework.aop.MethodBeforeAdvice;
  6.  
  7. public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
  8.  
  9. public void before(Method method, Object[] args, Object target)
  10. throws Throwable {
  11. System.out.println("呵呵,喝~~~~~喝 呵呵呵");
  12.  
  13. }
  14.  
  15. }

applicationContext.xml(Spring配置文件 )

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="
  4. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 01.配置目标对象 -->
  6. <bean id="someService" class="cn.aop05aopadvisor_regex.SomeServiceImpl"></bean>
  7.  
  8. <!-- 02. 通知 配置前置增强 -->
  9. <bean id="beforeAdvice" class="cn.aop05aopadvisor_regex.MyMethodBeforeAdvice"></bean>
  10.  
  11. <!-- 03.配置顾问 advisor 包装 advice-->
  12. <bean id="beforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  13. <property name="advice" ref="beforeAdvice"></property>
  14. <property name="pattern" value=".*do.*"></property>
  15. </bean>
  16.  
  17. <!-- 04.配置代理工厂bean -->
  18. <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
  19. <!-- 目标对象,对哪个对象的方法做增强 -->
  20. <property name="target" ref="someService"></property>
  21. <property name="interceptorNames" value="beforeAdvice"></property>
  22. </bean>
  23.  
  24. </beans>

Test.java

  1. package cn.aop05aopadvisor_regex;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. public class MyTest {
  8.  
  9. @Test
  10. public void myBeforeAdviceTest() throws Exception{
  11. ApplicationContext ctx=new ClassPathXmlApplicationContext("cn/aop05aopadvisor_regex/applicationContext.xml");
  12. ISomeService service=(ISomeService)ctx.getBean("proxyService");
  13. service.doLog();
  14. service.doTransaction();
  15. }
  16. }

效果展示:


=====默认Advisor自动代理生成器
DefaultAdvisorAutoProxyCreator

ISomeService.java

  1. package cn.aop05aopadvisor_regex;
  2. /**
  3. * 接口
  4. * @author Happy
  5. *
  6. */
  7. public interface ISomeService {
  8. //开启事务
  9. public void doTransaction() throws Exception;
  10. //日志
  11. public String doLog();
  12. }

SomeServiceImpl.java

  1. package cn.aop05aopadvisor_regex;
  2.  
  3. public class SomeServiceImpl implements ISomeService {
  4.  
  5. public void doTransaction() throws Exception{
  6. System.out.println("开启事务");
  7.  
  8. }
  9.  
  10. public String doLog() {
  11. System.out.println("书写日志");
  12. return null;
  13. }
  14.  
  15. }

MyMethodBeforeAdvice.java

  1. package cn.aop05aopadvisor_regex;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.springframework.aop.MethodBeforeAdvice;
  6.  
  7. public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
  8.  
  9. public void before(Method method, Object[] args, Object target)
  10. throws Throwable {
  11. System.out.println("呵呵,喝~~~~~喝 呵呵呵");
  12.  
  13. }
  14.  
  15. }

applicationContext.xml(Spring配置文件 )

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="
  4. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 01.配置目标对象 -->
  6. <bean id="someService" class="cn.aop06aopauto_advisor.SomeServiceImpl"></bean>
  7.  
  8. <!-- 02. 通知 配置前置增强 -->
  9. <bean id="beforeAdvice" class="cn.aop06aopauto_advisor.MyMethodBeforeAdvice"></bean>
  10.  
  11. <!-- 03.配置顾问 advisor 包装 advice-->
  12. <bean id="beforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  13. <property name="advice" ref="beforeAdvice"></property>
  14. <property name="pattern" value=".*do.*"></property>
  15. </bean>
  16.  
  17. <!-- 04.默认advisor 自动代理 切面只能是顾问 -->
  18. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
  19.  
  20. </beans>

MyTest.java

  1. package cn.aop06aopauto_advisor;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. public class MyTest {
  8.  
  9. @Test
  10. public void myBeforeAdviceTest() throws Exception{
  11. ApplicationContext ctx=new ClassPathXmlApplicationContext("cn/aop06aopauto_advisor/applicationContext.xml");
  12. ISomeService service=(ISomeService)ctx.getBean("someService");
  13. service.doLog();
  14. service.doTransaction();
  15. }
  16. }

效果展示:


=====BeanName自动代理生成器
 BeanNameAutoProxyCreator

ISomeService.java

  1. package cn.aop06aopauto_beannameautoproxy;
  2. /**
  3. * 接口
  4. * @author Happy
  5. *
  6. */
  7. public interface ISomeService {
  8. //开启事务
  9. public void doTransaction() throws Exception;
  10. //日志
  11. public String doLog();
  12.  
  13. //相信我,合乎
  14. public void believeMePleaseOK$$$$$$();
  15. }

SomeServiceImpl.java

  1. package cn.aop06aopauto_beannameautoproxy;
  2.  
  3. public class SomeServiceImpl implements ISomeService {
  4.  
  5. public void doTransaction() throws Exception{
  6. System.out.println("开启事务");
  7.  
  8. }
  9.  
  10. public String doLog() {
  11. System.out.println("书写日志");
  12. return null;
  13. }
  14.  
  15. public void believeMePleaseOK$$$$$$() {
  16. System.out.println("you nx");
  17.  
  18. }
  19. }

MyMethodBeforeAdvice.java

  1. package cn.aop06aopauto_beannameautoproxy;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.springframework.aop.MethodBeforeAdvice;
  6.  
  7. public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
  8.  
  9. public void before(Method method, Object[] args, Object target)
  10. throws Throwable {
  11. System.out.println("呵呵,喝~~~~~喝 呵呵呵");
  12.  
  13. }
  14.  
  15. }

applicationContext.xml(Spring配置文件 )

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="
  4. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 01.配置目标对象 -->
  6. <bean id="someService" class="cn.aop06aopauto_beannameautoproxy.SomeServiceImpl"></bean>
  7.  
  8. <!-- 02. 通知 配置前置增强 -->
  9. <bean id="beforeAdvice" class="cn.aop06aopauto_beannameautoproxy.MyMethodBeforeAdvice"></bean>
  10.  
  11. <!-- 03.配置顾问 advisor 包装 advice-->
  12. <bean id="beforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  13. <property name="advice" ref="beforeAdvice"></property>
  14. <property name="pattern" value=".*do.*"></property>
  15. </bean>
  16.  
  17. <!-- 04.BeanNameAutoProxyCreator方式,切面 既可以 通知,也可以是顾问-->
  18. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  19. <!-- 目标对象 -->
  20. <property name="beanNames" value="someService"></property>
  21. <property name="interceptorNames" value="beforeAdvisor"></property>
  22. </bean>
  23.  
  24. </beans>

MyTest.java

  1. package cn.aop06aopauto_beannameautoproxy;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. public class MyTest {
  8.  
  9. @Test
  10. public void myBeforeAdviceTest() throws Exception{
  11. ApplicationContext ctx=new ClassPathXmlApplicationContext("cn/aop06aopauto_beannameautoproxy/applicationContext.xml");
  12. ISomeService service=(ISomeService)ctx.getBean("someService");
  13. service.doLog();
  14. service.doTransaction();
  15. service.believeMePleaseOK$$$$$$();
  16. }
  17. }

效果展示:

Spring 通知(Advice)和顾问(Advisor)的更多相关文章

  1. Spring笔记07(Spring AOP的通知advice和顾问advisor)

    1.Spring AOP的通知advice 01.接口代码: package cn.pb.dao; public interface UserDao { //主业务 String add(); //主 ...

  2. 011-Spring aop 002-核心说明-切点PointCut、通知Advice、切面Advisor

    一.概述 切点Pointcut,切点代表了一个关于目标函数的过滤规则,后续的通知是基于切点来跟目标函数关联起来的. 然后要围绕该切点定义一系列的通知Advice,如@Before.@After.@Af ...

  3. Spring通知,顾问,增强

    1.AOP  (Aspect  Oriented Programming  面向切面编程) 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编 ...

  4. Spring 通知和顾问进行增强

    使用顾问增加前置增强和后置增强 <bean id="1" class="目标对象"></bean> <bean id=" ...

  5. Spring横切面(advice),增强(advisor),切入点(PointCut)(转)

    Spring横切面(advice),增强(advisor),切入点(PointCut)的一点理解: 1.Spring管理事务有2种,其中一种是HibernateTransactionManager管理 ...

  6. 顾问Advisor Aspectj注解

    顾问Advisor  通知 advice PointcutAdvisor  一个接口  是顾问的一种. . 任意单个字符 + 重复1到多次 * 重复0到多次 NameMetchMethodPointc ...

  7. spring AOP advice 类型 和 通用的切点的配置方式

    spring aop advice的类型: 1.前置通知(before advice) 2.返回后通知(after returning advice) 3.抛出异常后通知(after throwing ...

  8. SpringAOP 通知(advice)

      @Aspect @Order(1) public class AopOne { /** * 目标方法执行之前 * @param joinPoint */ @Before("executi ...

  9. Spring Aop(八)——advisor标签

    转发地址:https://www.iteye.com/blog/elim-2396274 8 advisor标签 advisor标签是需要定义在aspect标签里面的,其作用与aspect类似,可以简 ...

随机推荐

  1. xdebug断点调试原理

    通过Xdebug进行远程调试时,PHPSTORM等IDE会监听Xdebug设置的调试ip和端口(php.ini中配置) [xdebug] ; Xdebug zend_extension=php_xde ...

  2. SQL Server-聚焦聚集索引对非聚集索引的影响(四)

    前言 在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没有任 ...

  3. Webpack从入门到上线

    webpack是目前一个很热门的前端打包工具,官网说得很清楚,webpack的出现就是要把requirejs干掉.同时它还提供了十分便利的本地开发的环境.网上并不容易找到一个讲解得比较详细完整的教程, ...

  4. UploadFile控件,提交图片后,页面预览显示刚刚提交的图片

    最近在用asp.net来写一个新闻系统后台,然后由于不用用网上的flash插件来上传图片什么的,我就用asp.net的控件来写,但是控件总归有一些用的不够灵活的地方.这次测试提出,文章在修改的时候,需 ...

  5. 【分布式】Zookeeper使用--命令行

    一.前言 在学习了Zookeeper相关的理论知识后,下面接着学习对Zookeeper的相关操作. 二.Zookeeper部署 Zookeeper的部署相对来说还是比较简单,读者可以在网上找到相应的教 ...

  6. 【知识积累】try-catch-finally+return总结

    一.前言 对于找Java相关工作的读者而言,在笔试中肯定免不了遇到try-catch-finally + return的题型,需要面试这清楚返回值,这也是这篇博文产生的由来.本文将从字节码层面来解释为 ...

  7. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  8. Asp.Net Core 项目实战之权限管理系统(7) 组织机构、角色、用户权限

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  9. PHP数组详解

    作为一名C++程序员,在转做PHP开发的过程中,对PHP数组产生了一些混淆,与C++数组有相似的地方,也有一些不同,下面就全面地分析一下PHP的数组及其与C++中相应数据类型的区别和联系. 数组的分类 ...

  10. android

    配置Activity 的启动模式: 在 AndroidManifest.xml 中配置: <activity android:name=".MainActivity" and ...