面向切面编程AOP ---切面提供了一种取代继承和委托的方式
AOP中的术语:
通知:就是程序的功能,比如 安全、事务、日志等
连接点:和方法有关的前前后后,都是连接点
切入点:说明在哪儿干
切面:通知和切入点相互结合
引入:允许我们向现在的类中添加新的方法和属性,把切面用到目标类中
目标:引入中提到的目标类
织入:吧切面应用到目标对象来创建新的代理对象的过程。
代理:就是向目标对象应用通知后被创建的对象。
spring对AOP的支持局限于方法的注入,spring创建的全部通知都是用标准的java类编写的,,定义通知所应用的切点通常是以XML文件的方式在spring配置文件中配置的。
spring利用代理类来包裹切面,从而把他们织入到spring管理的bean中,在代理借钱方法调用之后,实际调用的目标bean方法之前,代理会执行切面逻辑。
spring生成代理类的方式有两种:
1、如果目标对象实现的是一个接口,spring会使用jdk的proxy类,它允许spring动态生成一个新的类来实现必要的接口,织入任何的通知,并把对这些接口的任何调用都转发给目标类。
2、如果目标类不是一个实现一个接口,spring就会使用CGLIB库生成目标类的一个子类,在创建这个子类时,spring织入通知,并且把这个子类的调用委托到目标类
引入aop 的namespace
<?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-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
基于pojo的aop的xml文件配置
<!-- aop -->
<bean id="inform" class="com.hnie.demo.service.impl.Inform"></bean>
<aop:config>
<aop:aspect ref="inform">
<aop:pointcut expression="execution(* *.sayHello(. .))" id="performance"/>
<aop:before method="before" pointcut-ref="performance"/>
<aop:after-returning method="end" pointcut-ref="performance"/>
<aop:after-throwing method="excepition" pointcut-ref="performance"/>
</aop:aspect>
</aop:config>
定义通知
package com.hnie.demo.service.impl;
public class Inform {
public void before(){
System.out.println("在方法之前执行");
}
public void end(){
System.out.println("在方法之后执行");
}
public void excepition(){
System.out.println("在遇到异常时执行");
}
}