AOP的介绍
什么是AOP?
-
AOP为Aspect Oriented Programming的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
-
AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP的概念
Spring的AOP实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强。
- AOP的一些术语
Target(目标对象)︰代理的目标对象
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
Joinpoint(连接点)︰所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
Pointcut(切入点)︰所谓切入点是指我们要对哪些Joinpoint进行拦截的定义
Advice(通知/增强)︰所谓通知是指拦截到Joinpoint之后所要做的事情就是通知
Aspect(切面)︰是切入点和通知(引介)的结合
Weaving (织入)︰是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而Aspect采用编译期织入和类装载期织入
代码实现及讲解
代码实现
时间工具类
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtils {
public String parseDate() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()));
return sdf.format(new Date());
}
}
接口和实现类
public interface Human {
void doWork();
String doEat();
}
public class People {
public void doWork() {
System.out.println("正在上班.....");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("已经下班.....");
}
public String doEat() {
// TODO Auto-generated method stub
return "正在吃饭";
}
}
配置XML文件
<bean id="date" class="com.demo.aop.DateUtils">
</bean>
<bean id="people" class="com.demo.aop.People">
</bean>
<aop:config proxy-target-class="true">
<aop:pointcut expression="execution(* com.demo.aop.People.*(..))"
id="aop1" />
<aop:aspect id="d" ref="date">
<aop:before method="parseDate" pointcut-ref="aop1" />
<aop:after-returning method="parseDate"
pointcut-ref="aop1" />
</aop:aspect>
</aop:config>
测试
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
String config = "spring/aop.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
People people = ac.getBean("people", People.class);
people.doWork();
}
}
结果
XML文件讲解
这一句是声明切入点,切入点的 id 叫 loggerCutPoint ,用来标记这个切入点
这个expression表示:满足expression中的方法调用之后,就会去进行切面操作,类似于触发了切面
第一个 * 代表返回任意类型
com.demo.aop.People
.*表示com.demo.aop.People
这个类里面的任意一个方法,也就是说任意一个方法都会触发
注意:类的路径和第一个*之间要加上空格
aop:aspect id="d" ref="data">
表示辅助类时date,也就是上面bean的id
<aop:before method="parseDate" pointcut-ref="aop1" />
表示当处罚aop1的条件之前先运行parseDate方法
其他的几种