1.通知(Advice)
通知定义了切面是什么以及何时使用。如想给程序加上日志,通知就是定义了日志“是什么”并且“在什么时候用”。通知的类型有
前置通知:在目标方法被调用之前调用的通知。
后置通知:在目标方法完成之后调用,不关心方法的返回。
返回通知:在目标方法返回成功执行之后调用的通知。
异常通知:在目标方法抛出异常后调用的通知。
环绕通知:在被通知的方法调用之前和调用之后执行自定义的行为。类似前置+后置通知。
2.连接点(Join point)
就是应用能使用这些通知的地方,这些地方就叫连接点。
3.切点(Poincut)
相当于连接点的集合。切点的定义会匹配通知所要织入的一个或多个连接点。
4.切面(Aspect)
切面是通知和切点的结合,通知和切点共同定义了切面的全部内容——它是什么,在什么时候,在何处完成其功能。
5.引入(Introduction)
引入允许我们向现有的类添加新方法或属性。比如需要添加一个记录对象最后一次修改时的状态的功能,可以不需要修改现有的类完成此功能。可以先创建一个通知类,里面只需一个方法如setLastModified(date)和一个实例变量来保存这个状态。然后这个新方法和变量就可以被引入现有的类中。在AOP可以表示“引入了什么”。
6.织入(weaving)
织入是把切面应用到目标对象并创建新的代理对象的过程,重点在于过程!在目标对象的生命周期里有多个点可以进行织入:编译期,类加载期,运行期。
7.AOP的helloworld
7.1 创建一个目标类:
//目标类接口
public interface HelloWorld{
public void hello();
}
//其实现类
public class HelloWorldImpl
implements HelloWorld{
@Override
public void hello(){
System.out.println("hello world"
);
}
}
7.2 定义一个切面类
public class HelloWordAspect{
//前置通知
public void beforeAdvice(){
System.out.println("before hello"
);
}
}
7.3 配置切面
<?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">
<!--目标类bean-->
<bean id="helloWorldImpl" class="com.liyuxin.impl.HelloWorldImpl">
<!--配置切面-->
<bean id="helloWordAspect" class="com.liyuxin.aspect.HelloWordAspect">
<!--配置切点-->
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.liyuxin..*.*(..))"/>
<aop:aspect ref="aspect">
<aop:before pointcut-ref="pointcut" method="beforeAdvice"/>
</aop:aspect>
</aop:config>
</beans>
expression默认是AspectJ语法,关于其语法可以看这博客:
AspectJ语法详解
7.4 测试代码
ApplicationContext ctx =
new ClassPathXmlApplicationContext("application.xml"
);
HelloWorld helloworld =
ctx.getBean("helloWorldImpl", HelloWorld.
class);
helloworld.hello();
转载于:https://www.cnblogs.com/liyuxinBlog/p/8391578.html