去北京看天安门
- 起始对象 没有真实存在
- 目标对象 北京
- 代理对象 代驾(spring帮助我们创建,责任链模式)
- 切面对象 中间经过城市(山东、天津)
- 切入点 目标对象中的方法(看天安门 )
- 连接点 切面对象中的方法(山东吃饭、天津睡觉 +加油)
- 建议/通知 连接点中执行的过程(连接点方法中执行的过程,代码)
before 前置建议/通知
after-return后置建议/通知
after-throwing异常建议/通知
after最终建议/通知
around环绕建议/通知(前后建议/通知)
Application.xml配置如下:
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="controller" class="controller.TestController"></bean>
<bean id="aspect1" class="aspect.Aspect1"></bean>
<bean id="aspect2" class="aspect.Aspect2"></bean>
<!-- 给切面对象一个说明-->
<aop:config>
<!-- 需要说明哪一个, 哪一些对象是切面对象-->
<aop:aspect id="a1" ref="aspect1">
<!-- 说明切点 目标对象中的方法-->
<aop:pointcut id="abc" expression="execution(* controller.TestController.test())"/>
<!-- 切面对象做的建议方式(链接点执行)-->
<aop:before method="beforeMethod" pointcut-ref="abc"></aop:before>
<aop:around method="around" pointcut-ref="abc"></aop:around>
<aop:after-returning method="afterMethod" pointcut-ref="abc"></aop:after-returning>
<aop:after method="after" pointcut-ref="abc"></aop:after>
<aop:after-throwing method="afterThrowingMethod" pointcut-ref="abc"></aop:after-throwing>
</aop:aspect>
<aop:aspect id="a2" ref="aspect2">
<aop:pointcut id="abca" expression="execution(* controller.TestController.test())"/>
<aop:before method="beforeMethod" pointcut-ref="abca"></aop:before>
<aop:around method="around" pointcut-ref="abca"></aop:around>
<aop:after-returning method="afterMethod" pointcut-ref="abca"></aop:after-returning>
<aop:after method="after" pointcut-ref="abca"></aop:after>
<aop:after-throwing method="afterThrowingMethod" pointcut-ref="abca"></aop:after-throwing>
</aop:aspect>
</aop:config>
</beans>
代码如下:
切面类Aspect1 :
public class Aspect1 {
public void beforeMethod(){
System.out.println("快说啊 快说啊 快说啊~~~");
}
public void afterMethod(){
System.out.println("已经结束看");
}
public void after(){
System.out.println("最终方法 哈哈哈");
}
public void afterThrowingMethod(){
System.out.println("出现异常了");
}
public void around(ProceedingJoinPoint pjt) throws Throwable {
System.out.println("环绕方法before");
pjt.proceed();
System.out.println("环绕方法after");
}
}
切面类Aspect2 :
public class Aspect2 {
public void beforeMethod(){
System.out.println("2快说啊 快说啊 快说啊~~~2");
}
public void afterMethod(){
System.out.println("2已经结束看2");
}
public void after(){
System.out.println("2最终方法 哈哈哈2");
}
public void afterThrowingMethod(){
System.out.println("2出现异常了2");
}
public void around(ProceedingJoinPoint pjt) throws Throwable {
System.out.println("2环绕方法before2");
pjt.proceed();
System.out.println("2环绕方法after2");
}
}
切点类TestController:
public class TestController {
public void test(){
// System.out.println(1/0);
System.out.println("我最帅!!!");
}
}
写一个测试类:
public class TestMain {
public static void main(String[] args) {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("ApplicationContext.xml");
TestController controller = (TestController) beanFactory.getBean("controller");
controller.test();
}
}
运行程序:
快说啊 快说啊 快说啊~~~
环绕方法before
2快说啊 快说啊 快说啊~~~2
2环绕方法before2
我最帅!!!
2环绕方法after2
2已经结束看2
2最终方法 哈哈哈2
环绕方法after
已经结束看
最终方法 哈哈哈
总结:
<aop:config></aop:config>标签表示对切面对象的说明
<aop:aspect id="a1" ref="aspect1"> id可有可无,ref属性是给下面标签使用
<aop:pointcut>告知切点在哪里,目标对象中的方法
<aop:before>在目标方法执行前执行
<aop:around>在目标方法执行前和后执行,如果有before执行顺序在before之后
<aop:after-returning>在目标方法执行后执行
<aop:after-throwing>在目标方法执行异常时执行
网友评论