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");
相关文章推荐
- Spring入门-学习笔记
- Java Mybatis框架入门基础教程
- java 连接sql server2008数据库配置
- 【MyBatis框架】mybatis和spring整合
- java读写excel之POI篇—001
- java读写excel之POI篇—002
- springMVC-思考篇(一)
- Maven使用(二)
- Java学习笔记_001_基础知识
- JavaWeb ---Filter、Servlet
- Java不同的代码块的区别
- javaWeb发布的时候类都会被加载么
- Java类的实例化过程
- Spring MVC 全局的异常处理
- spring 中实现文件上传
- 在命令行环境Java程序调用导入的jar包中的类
- 绽放你的美丽-java20年
- Spring运行机制
- JavaEE-Hibernate入门笔记
- 初始Java——解释型还是编译型?