spring学习(五)—AOP相关术语
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语法,关于其语法可以看这博客:
7.4 测试代码
ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml"); HelloWorld helloworld = ctx.getBean("helloWorldImpl", HelloWorld.class); helloworld.hello();
浙公网安备 33010602011771号