您的位置:首页 > 编程语言 > Java开发

Spring-AOP学习笔记

2015-09-21 00:03 441 查看

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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: