收藏 分享(赏)

动态代理以及spring-aop.ppt

上传人:无敌 文档编号:1111508 上传时间:2018-06-12 格式:PPT 页数:32 大小:1.10MB
下载 相关 举报
动态代理以及spring-aop.ppt_第1页
第1页 / 共32页
动态代理以及spring-aop.ppt_第2页
第2页 / 共32页
动态代理以及spring-aop.ppt_第3页
第3页 / 共32页
动态代理以及spring-aop.ppt_第4页
第4页 / 共32页
动态代理以及spring-aop.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、,Spring-aop,本章目标,AOP编程Ssh整合开发,代理模式,在代理模式里,有一个很重要的东西动态代理自从JDK的版本到1.3以后,java语言通过java.lang.reflect库中,提供了三个类来直接支持代理模式。分别是:Proxy,InvocoationHandler和Method。,java动态代理类,Static Class getProxyClass (ClassLoader loader, Class interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。,java.lang.reflect类库中提供三个

2、类直接支持代理模式:Proxy,InvocationHandler和Method。,Proxy类:该类即为动态代理类。主要有如下主要方法:,Protected Proxy(InvocationHandler h):构造函数,用于给内部的h赋值。,Static Object newProxyInstance(ClassLoader loader, Class interfaces, InvocationHandler h):返回代理类的一个实例。,InvocationHandler接口:该接口中仅定义了一个方法Object invoke(Object obj,Method method, Obj

3、ect args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,,JDK动态代理,public class JDKProxy implements InvocationHandler private Object targetObject;/代理的目标对象public Object createProxyInstance(Object targetObject)this.targetObject = targetObject;/* 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器* 第二个参数设置代理类实现的接口* 第三个参数设置回调对象,当代理对

4、象的方法被调用时,会委派给该参数指定对象的invoke方法*/return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),this.targetObject.getClass().getInterfaces(), this);public Object invoke(Object proxy, Method method, Object args)throws Throwable return method.invoke(this.targetObject, args);/把方法调用委派给目标对象当目标

5、类实现了接口,我们可以使用jdk的Proxy来生成代理对象。,使用CGLIB生成代理,public class CGLIBProxy implements MethodInterceptor private Object targetObject;/代理的目标对象public Object createProxyInstance(Object targetObject)this.targetObject = targetObject;Enhancer enhancer = new Enhancer();/该类用于生成代理对象enhancer.setSuperclass(this.targetO

6、bject.getClass();/设置父类enhancer.setCallback(this);/设置回调用对象为本身return enhancer.create();public Object intercept(Object proxy, Method method, Object args,MethodProxy methodProxy) throws Throwable return methodProxy.invoke(this.targetObject, args);CGLIB可以生成目标类的子类,并重写父类非final修饰符的方法。,AOP中的概念,Aspect(切面):指横切

7、性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面横切性关注点的抽象.joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器)Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义.Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知Target(目标对象):代理的目标对象Weave(织入):指将aspe

8、cts应用到target对象并导致proxy对象创建的过程称为织入.Introduction(引入):在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.,使用Spring进行面向切面(AOP)编程,要进行AOP编程,首先我们要在spring的配置文件中引入aop命名空间:Spring提供了两种切面声明方式,实际工作中我们可以选用其中一种:基于XML配置方式声明切面。基于注解方式声明切面。,基于注解方式声明切面,首先启动对AspectJ注解的支持(蓝色部分): ,基于注解方式声明切面,Aspectpublic class LogPrint Poin

9、tcut(execution(* com.zj.spring.aop.service.*.*(.)private void anyMethod() /声明一个切入点Before(anyMethod() ,基于XML配置方式声明切面,public class LogPrint public void doAccessCheck() 定义前置通知public void doReturnCheck() 定义后置通知 public void doExceptionAction() 定义例外通知public void doReleaseAction() 定义最终通知publicObject doBasi

10、cProfiling(ProceedingJoinPoint pjp) throws Throwable return pjp.proceed();环绕通知,基于XML配置方式声明切面, ,在spring配置文件中引入用于声明事务的tx命名空间,配置数据源, 使用属性占位符,使用属性占位符方式配置数据源, ,采用注解方式配置事务,采用注解方式 Service Transactionalpublic class PersonServiceBean implements PersonService ,采用基于XML方式配置事务, ,事务传播属性,REQUIRED:业务方法需要在一个事务中运行。如果

11、方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务。NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。REQUIRESNEW:属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。MANDATORY:该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境

12、下调用,容器就会抛出例外。SUPPORTS:这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。Never:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按REQUIRED属性执行.它使用了一个单独的事务, 这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManag

13、er事务管理器起效,数据库系统提供了四种事务隔离级,数据库系统提供了四种事务隔离级别供用户选择。不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低。大多数据库默认的隔离级别为Read Commited,如SqlServer,当然也有少部分数据库默认的隔离级别为Repeatable Read ,如MysqlRead Uncommited:读未提交数据(会出现脏读,不可重复读和幻读)。Read Commited:读已提交数据(会出现不可重复读和幻读)Repeatable Read:可重复读(会出现幻读)Ser

14、ializable:串行化ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别. 另外四个与JDBC的隔离级别相对应脏读:一个事务读取到另一事务未提交的更新新据。不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。幻读:一个事务读取到另一事务已提交的insert数据。,Spring2.5+Hibernate3.3+Strut

15、s1.3整合开发,hibernate核心安装包下的:hibernate3.jarlibrequired*.jarliboptionalehcache-1.2.3.jarhibernate 注解安装包下的libtestslf4j-log4j12.jarSpring安装包下的distspring.jardistmodulesspring-webmvc-struts.jarlibjakarta-commonscommons-logging.jar、commons-dbcp.jar、commons-pool.jarlibaspectjaspectjweaver.jar、aspectjrt.jarlib

16、cglibcglib-nodep-2.1_3.jarlibj2eecommon-annotations.jarliblog4jlog4j-1.2.15.jarStruts下载struts-1.3.8-lib.zip,需要使用到解压目录下的所有jar,建议把jstl-1.0.2.jar和standard-1.0.2.jar更换为1.1版本。Spring中已经存在一个antlr-2.7.6.jar,所以把struts中的antlr-2.7.2.jar删除,避免jar冲突。数据库驱动jar,Spring2.5+Hibernate3.2+Struts1.3整合开发, . 略 com/zj/pojo/P

17、erson.hbm.xml hibernate.dialect=org.hibernate.dialect.MySQL5Dialect hibernate.hbm2ddl.auto=update hibernate.show_sql=false hibernate.format_sql=false ,Spring2.5+Hibernate3.2+Struts1.3整合开发,实体bean配置模版.hbm.xml ,Spring2.5+Hibernate3.2+Struts1.3整合开发,Hibernate二级缓存的配置 com/zj/pojo/Person.hbm.xml hibernate.d

18、ialect=org.hibernate.dialect.MySQL5Dialect hibernate.hbm2ddl.auto=update hibernate.show_sql=false hibernate.format_sql=false hibernate.cache.use_second_level_cache=true hibernate.cache.use_query_cache=false hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider ,Spring2.5+Hibernate3.2+St

19、ruts1.3整合开发,在需要缓存的实体bean配置文件中加入缓存配置项 usage说明了缓存的策略,region指定缓存的区域名,Spring2.5+Hibernate3.2+Struts1.3整合开发,Ehcache默认的配置文件ehcache.xml(放在类路径下) defaultCache节点为缺省的缓存策略 maxElementsInMemory 内存中最大允许存在的对象数量 eternal 设置缓存中的对象是否永远不过期 overflowToDisk 把溢出的对象存放到硬盘上 timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉 timeToLi

20、veSeconds 指定缓存对象总的存活时间 diskPersistent 当jvm结束是是否持久化对象 diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间,Spring2.5+Hibernate3.2+Struts1.3整合开发,在web容器中实例化spring容器, contextConfigLocation classpath:beans.xml org.springframework.web.context.ContextLoaderListener,Spring2.5+Hibernate3.2+Struts1.3整合开发,在w

21、eb容器中配置struts,strutsorg.apache.struts.action.ActionServletconfig/WEB-INF/struts-config.xml0struts*.do,Spring2.5+Hibernate3.3+Struts1.3整合开发,如果action没有交给spring管理时,我们通过下面语句获取spring容器实例WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext();把

22、action交给spring管理后,我们可以使用依赖注入在action中注入业务层的bean。确保action的path属性值与bean的名称相同。Spring 配置:在struts配置文件中添加进spring的请求控制器,该请法语控制器会先根据action的path属性值到spring容器中寻找跟该属性值同名的bean。如果寻找到即使用该bean处理用户请求 ,Spring2.5+Hibernate3.2+Struts1.3整合开发,org.springframework.web.struts.DelegatingRequestProcessor 的处理过程。假设用户请求的路径为:/pers

23、on/list.do,ActionServlet,DelegatingRequestProcessor请求处理器,Spring容器Action交给了容器管理bean name=“/person/list”class=“com. PersonAction”,获取action对象,Spring2.5+Hibernate3.2+Struts1.3整合开发,使用spring解决struts1.3乱码问题。encodingorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8encoding/*,Spring2.5+Hibernate3.2+Struts1.3整合开发,使用spring解决hibernate因session关闭导致的延迟加载例外问题。 OpenSessionInViewFilter org.springframework.orm.hibernate3.support.OpenSessionInViewFilter OpenSessionInViewFilter /*,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报