Spring AOP【面向切面编程 】
将分散的功能块集中放到一个地方-切面
声明式的定义在何时何地使用这些功能
- ==切面(Aspect)==:要实现的交叉的非核心业务功能
连接点(Joinpoint):应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出
==通知(Advice)==:通知切面的实际实现代码(抽出来的切面代码)
切入点(Pointcut):定义通知应用在哪些连接点,就是一组连接点的集合;(控制哪些方法需要被通知,默认情况是每个方法都切入)
==目标对象(Target)==:被通知的对象,代理模式中的真实对象;
==代理(Proxy)==:将通知应用到目标对象之后,创建的对象
织入(Weaving):将切面应用到目标对象,从而创建一个新的代理对象的过程
业务实现类也是对象
在使用时创建业务对象,通过getBean即可
采用切面,拦截业务核心,采用代理模式
代理模式;
代理对象帮真实对象做事,一般代理对象比真实对象专业,但是代理对象没有真实对象所拥有的某种实体(例如租房业务,中介没有房子,只有房东才有房子,但是中介可以找到更多的租客来租房)
代理对象帮真实对象调用方法,然后加上包装上自己的特长来更好的使用,辅助,加工这个方法;
真实的对象方法一般业务逻辑更少,所以交给更专业的代理来做更多的业务
代理对象和真实对象都实现同一个接口
Spring通知(advice)
- 方法包围拦截(在方法执行前后分别拦截):该拦截器实现了MethodInterceptor接口;注意:==只要有该拦截器存在,此包围器连其他通知的 方法执行前后的拦截器也一起包围了,意思说,先执行该拦截器的前置拦截,再执行单纯的前置拦截, 方法执行后,先执行单纯的后置拦截,再执行本拦截==
- 方法执行前拦截:实现了MethodBeforeAdvice接口,直接写要做的方法即可:
- 方法执行后拦截:实现了AfterReturningAdvice,在方法执行完毕并且返回之后 调用本方法
配置如下:
<!-- 目标对象 -->
<bean id="petService" class="com.wang.service.PetServiceImpl">
</bean>
<!-- 方法包围拦截器,实现了 MethodInterceptor 接口 -->
<bean id="exeTimeAdvice" class="com.wang.service.advice.ServiceExecuteTime">
</bean>
<!-- 方法前置拦截器 实现了 MethodBeforeAdvice 接口-->
<bean id="beforeExecute" class="com.wang.service.advice.ExecuteBeforeAdvice">
</bean>
<!-- 方法后置拦截器 实现了 AfterReturningAdvice 接口-->
<bean id="afterExecute" class="com.wang.service.advice.AfterMethodAdvice">
</bean>
<!-- 静态切入点 -->
<bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="mappedNames">
<list>
<value>切入的方法名,可以使用*来通配,例如get*,所有get方法都执行要切入的通知</value>
</list>
</property>
<!--该参数的名 advice是固定的,该参数用于切入时需要运行的通知(拦截器) -->
<property name="advice" ref="要执行的通知的id">
</property>
</bean>
<!-- 代理对象 -->
<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 目标对象,需要拦截包装的目标对象,一般为普通业务实现类?-->
<property name="target" ref="petService"></property>
<!--interceptorNames参数名固定的,是ProxyFactoryBean类固定调用 -->
<property name="interceptorNames">
<list><!--列表里面value代表要使用并且已经配置的的拦截器的id (这个其实是一个Object[],list也代表数组)-->
<value>exeTimeAdvice</value>
<value>beforeExecute</value>
<value>afterExecute</value>
<value>假如要使用切入点,在此添加切入点id即可,但假如切入点有绑定以上通知,那么以上通知就不用再在这里设置,直接设置一个切入点即可</value>
</list>
</property>
</bean>
自动创建代理
<!-- 目标对象 -->
<bean id="userDao" class="com.wang.dao.impl.UserDaoHibernateImpl">
</bean>
<!-- 事务通知 -->
<bean id="txAdvice" class="com.wang.dao.TransactionAdvice">
</bean>
<!-- 自动创建proxy -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Dao</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>txAdvice</value>
</list>
</property>
</bean>
在取的时候
BeanFactory bf = new ClassPathXmlApplicationContext("springAopCfg.xml");
IUserDao dao = (IUserDao) bf.getBean("userDao");
本文介绍Spring AOP(面向切面编程)的基本概念,包括切面、连接点、通知、切入点、目标对象及代理等,并展示了如何通过配置文件实现方法的前置、后置拦截以及围绕方法的拦截。
267

被折叠的 条评论
为什么被折叠?



