AOP有一个思想就是在原业务功能不改变的前提下,动态的根据需要插入“某方法”运行
最重要的就是切面切点的配置 ,即:aop.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-4.0.xsd">
<!-- 配置 bean -->
<bean id="a" class="com.edu.aop.hello.xml.A"></bean>
<bean id="b" class="com.edu.aop.hello.xml.B"></bean>
<bean id="c" class="com.edu.aop.hello.xml.C"></bean>
<bean id="x" class="com.edu.aop.hello.xml.X"></bean>
<!-- 配置 AOP -->
<aop:config>
<!-- 配置切面及通知 -->
<aop:aspect ref="x">
<aop:before method="mX1" pointcut="execution(* com.edu.aop.hello.xml.B.*())"/>
<aop:after method="mX2" pointcut="execution(* com.edu.aop.hello.xml.B.*())"/>
</aop:aspect>
</aop:config>
</beans>
切面代码如下
package com.edu.aop.hello.xml;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.aspectj.lang.JoinPoint;
public class X {
public void mX1(JoinPoint joinPoint) {
// 连接点对象做参数,利用该参数,获取目标对象的方法
String methodName = joinPoint.getSignature().getName();
System.out.println("我是前置通知,在B类方法:" + methodName + "()运行前被切入!");
// 获取当前系统的时间,并转换为yyyy年MM月dd日 HH:mm:ss格式,并显示
Calendar startTimeNow = Calendar.getInstance();
SimpleDateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String startTime = fmt.format(startTimeNow.getTime());
System.out.println("B类方法:" + methodName + "(),运行开始时间:" + startTime);
}
public void mX2(JoinPoint joinPoint) {
// 连接点对象做参数,利用该参数,获取目标对象的方法
String methodName = joinPoint.getSignature().getName();
System.out.println("我是后置通知,在B类方法:" + methodName + "()运行后被切入!");
// 获取当前系统的时间,并转换为yyyy年MM月dd日 HH:mm:ss格式,并显示
Calendar endTimeNow = Calendar.getInstance();
SimpleDateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String endTime = fmt.format(endTimeNow.getTime());
System.out.println("B类方法:" + methodName + "(),运行结束时间:" + endTime);
}
}
主类:
package com.edu.aop.hello.xml;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//这是主类,直接运行
public class MainXml {
public static void main(String[] args) {
//(1)创建IoC容器
//ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext_dataSource.xml");
ApplicationContext ctx = new ClassPathXmlApplicationContext("aop_hello_xml.xml");
//(2)从容器IoC中获取对象
A a = (A) ctx.getBean("a");
B b = (B) ctx.getBean("b");
C c = (C) ctx.getBean("c");
//(3)使用对象
a.mA1();
b.mB2();
a.mA2();
b.mB1();
c.mC1();
}
}
最后的运行结果: