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("猫");
}
}