Spring学习4-面向切面(AOP)之schema配置方式

时间:2022-03-04 02:57:57
一、通过Scheme配置实现AOP步骤(Spring AOP环境的环境与上篇博文

Spring接口方式相同)


  
步骤一、编写业务类:

public class AspectBusiness {
   //切入点
   
public String delete(String obj) {
       
System.out.println("==========调用切入点:" + obj +
"说:你敢删除我!===========\n");
       
return obj + ":瞄~";
    }

public
String add(String obj) {
       
System.out.println("================这个方法不能被切。。。==============
\n");
       
return obj + ":瞄~ 嘿嘿!";
    }

public
String modify(String obj) {
       
System.out.println("=================这个也设置加入切吧====================\n");

return obj + ":瞄改瞄啊!";
    }

}

步骤二、编写切面类:切面类中,包含了所有的通知

public class AspectAdvice {

//前置通知
  
public void doBefore(JoinPoint jp) {
       
System.out.println("===========进入before advice============
\n");

System.out.print("准备在" + jp.getTarget().getClass() + "对象上用");
       
System.out.print(jp.getSignature().getName() + "方法进行对 '");
       
System.out.print(jp.getArgs()[0] + "'进行删除!\n\n");

System.out.println("要进入切入点方法了 \n");
    }

// 后置通知
    
// @param jp
    
//
          
连接点
    
// @param result
    
//
        
返回值

public void
doAfter(JoinPoint jp, String result) {
       
System.out.println("==========进入after advice=========== \n");
       
System.out.println("切入点方法执行完了 \n");

System.out.print(jp.getArgs()[0] + "在");
       
System.out.print(jp.getTarget().getClass() + "对象上被");
       
System.out.print(jp.getSignature().getName() + "方法删除了");
       
System.out.print("只留下:" + result + "\n\n");
    }

// 环绕通知
    // @param
pjp
    
//
         
连接点
   
    public
object
doAround(ProceedingJoinPoint pjp) throws Throwable {
       
System.out.println("===========进入around环绕方法!=========== \n");

// 调用目标方法之前执行的动作
       
System.out.println("调用方法之前: 执行!\n");

// 调用方法的参数
       
Object[] args = pjp.getArgs();
       
// 调用的方法名
       
String method = pjp.getSignature().getName();
       
// 获取目标对象
       
Object target = pjp.getTarget();
       
// 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
       
Object result = pjp.proceed();

System.out.println("输出:" + args[0] + ";" + method + ";" + target +
";" + result + "\n");
       
System.out.println("调用方法结束:之后执行!\n");
    
return 
result;

    }

//异常通知
  
    public void
doThrow(JoinPoint jp, Throwable e) {
       
System.out.println("删除出错啦");
    }

}

步骤四、配置文件的编写:

<?xml version="1.0"
encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
   
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
   
xmlns:context="http://www.springframework.org/schema/context"
   
xmlns:aop="http://www.springframework.org/schema/aop"
   
xsi:schemaLocation="  
 
         
http://www.springframework.org/schema/beans  
 
         
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
 
         
http://www.springframework.org/schema/context  
 
         
http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/aop  
 
         
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
   
default->

<!-- ==============================利用spring
利用aspectj来配置AOP================================
-->

<!-- 声明一个业务类 -->
   
<bean id="aspectBusiness"
class="aop.schema.AspectBusiness" />

<!-- 声明通知类 -->
   
<bean id="aspectAdvice"
class="aop.schema.advice.AspectAdvice"
/>

<aop:config>
       
<aop:aspect id="businessAspect"
ref="aspectAdvice">
           
<!-- 配置指定切入的对象 -->
           
<aop:pointcut id="point_cut" expression="execution(*
aop.schema.*.*(..))" />
           
<!-- 只匹配add方法作为切入点
           
<aop:pointcut id="except_add"
expression="execution(* aop.schema.*.add(..))"
/>
            
-->

<!-- 前置通知 -->
           
<aop:before method="doBefore"
pointcut-ref="point_cut" />
           
<!-- 后置通知 returning指定返回参数 -->
           
<aop:after-returning method="doAfter"
               
pointcut-ref="point_cut" returning="result" />
           
<aop:around method="doAround"
pointcut-ref="point_cut"/>
           
<aop:after-throwing method="doThrow"
pointcut-ref="point_cut" throwing="e"/>
       
</aop:aspect>
   
</aop:config>
</beans>

步骤五、测试类:

public class Debug {

public
static void main(String[] args) {
       
ApplicationContext context = new
ClassPathXmlApplicationContext("aop/schema_aop.xml");
       
AspectBusiness business = (AspectBusiness)
context.getBean("aspectBusiness");
       
business.delete("猫");
    }

}