Spring高级程序设计.pdf

xyh73572 17 0 PDF 2019-05-02 04:05:41

Spring高级程序设计.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!httpshowmecode.cnffinks/bookPro Spring2.5 Spring高级程序设计David wang录制105删除数据5110.6插入数据51107BATS缺少的特性….5210.8整体性能…第11章对 Hibernate的支持52113 Hibernate支持的介绍521131仗用 Hibernate Session..541132使用 Hibernate Dao Support类1133 Hibernate Template和 Session之间的选择58114在企业级应用中使用 Hibernate114.1阳止更新脏数据1143对象等价性65114.3事务支持.68144延迟加载115处理大数据集.…89116处理大对象………95第16章事务管161 Spring事务抽象层简介162分析事务属性…1011621探索 Transaction Definition接11622使用 Transaction status接口1623 PlatformTransaction Manager的实现103163对一个事务管理小例的探索.a.a.:.:.:a::::::.a:.:::a.aaa::::a..::::a11031) Obj Instanceof Some Type只要 Some type是obj的类、直接或间接父类或者接口的话都是为TRUE2)实例内部类内部类必须在外部类实例化后才能实例化即 new Outer() new Inner()实例内部类中不能定义静态成员,只能定义实例成员。3)静态内部类(成员内部类的一种用到的SQL语句create table t customerid number(19,C) not nullfirst name varchar2(50) nct nulllast name varchar2(50) not nullrlast login timestamp nullcomments clob nullconstraint p< customer primary key(id)QQ:3599580httpshowmecode.cnffinks/bookPro Spring2.5 Spring高级程序设计DavidWang录制create sequence s c:stomer id start with 1000create or replace procedure p actstartled(n numberbeginabms output put line(n |I ?! Really?')iendcreate or replace finction f calculatereturn numberasbeginreturn 42ena,create or replace package sirmplejdbc astype rc customer type is ref cursor return t customerrowtypeiprocedure p find customer(rc customer type out rc customer type)endcreate or replace package body simplejdbc asprocedure p find customer(rc customer type out rc customer type)isopen rc customer type for select from t customerend;endinsert into t customer(id, first name, Last name, last login, comments)values (l' jan''Machacke' null null)iselect table name from user tablesselect from t customer order by id;delete from t customer where id >3i1og4jc。 fig fi1e牛######非###########非#非######杆芈###############工 OGGING LEVELS十######杆芈########################杆###########杆####QQ:3599580httpshowmecode.cnffinks/bookPro Spring2.5 Spring高级程序设计David wang录制Tc turn more verbose logging on change "Warn" tO "DEBUG10943. rootlogger=INEO, console计#############井###################################LOG FILE LOCATIONS井計#####扦芈#####艹#######非###########非###############log4j. appender console=org. apachelog4j. ConsoleAppenderlog4j. appender console. Threshcld-DEBUGlog4j. appender console. layout=org. apache. lcg43 PatternLayout10g4j appender console. layout. ConversionPattern= op [9c[6] omnso Spring aop1,概念口连接点( joinpoint):一个连接点本身是一个程序执行过程中的特定点。典型的连接点包括对一个方法的调用、一个方法执行的过程本身、类的初始化、对象的实例化等。连接点是AOP的核心概念之一,它用来定义在程序的什么地方能通过AOP加入额外的逻辑。口通知( advice):在某一特定的连接点处运行的代码称为”通知”。通知有很多种,比如在连接点之前执行的前置通知( before advice和在连接点之后执行的后置通知( after advice)。口切入点( pointcut):切入点是用来定义某一个通知该何时执行的一组连接点。通过创建切入点我们可以精确地控制程序中什么组件接到什么通知。之前我们提到过,一个典型的连接点是方法的调用,而一个典型的切入点就是对某一类的所有方法调用的集合。通常我们会通过复杂的切入点来控制通知什么时候被执行。口方面 aspect:通知和切入点的集合叫做方面。这个组合定义了段程序中应该包括的逻辑以及何时应该执行该逻辑。口织入 (weaving):织入是将方面真正加入程序代码的过程。对于编译AOP方案而言,织入自然是在编译时完成的,它通常是作为编译过程的一个额外步骤。类似地,对」运行时AOP方案,织入过程是在程序运行时动态执行的口目标( target):如果一个对象的执行过程受到某个AOP操作的修改,那么它就叫做一个目标对象,日标对象通常也称为被通知对象。口引入( (introduction):通过引入,我们可以在一个对象中加入新的方法或者字段,以改变它的结构,你可以使用引入来让任何对象实现个特定的接∏,而不需要这个对象的类显式的实现这个接口。2AOP的类型t静态AOP用Java术语来说,我们在一个静态AOP实现通过修改应用程序实际字节码来完成织入过程,从而根据需求修改和扩展程序代码。显然,这是·个达到织入过程的高性能的方式,因为最终结果就是普通的」ava字节码。这种方式的缺点是,如果我们想对方面做任何修改,即使只是加入一个新的连接点,都QQ:3599580httpshowmecode.cnffinks/bookPro Spring2.5 Spring高级程序设计David wang录制必须重新编译整个应用稈序Aspect.便是静态AOP实现的·个绝好示例。中动态AOP动态AOP实现比如 Spring AOP)区别于静态AOP实现的地方在于织入过程是在运行时动态进行的。只体如何做到这一点是跟具体实现相关的,但你会看到, Spring的方法是为所有被通知对象创建代理,以便通知可以按需被调用。动态AOP一点小小的不足是,通常亡的性能比不上静态静态AoP,但也在持续地改善中,动态AOP实现的主要好处在于,你能轻易地修改一个应用的整个方面的集合而无需重新编泽主程序的代码。sQ) Spring aoP架构Spring aop架构的核心是建立在代理上的。当我们建立被通知类的实例时,我们必须使用 Proxy Factory类加入我们需要织入该类的所有通知。然后为该类的一个对象创建代理A Spring内部有一种实现代理的方法:JDK动态代理和CGB代理。通常CGLB的性能会明显好过JK动态代理。Spring AOP中最明显的简化之一就是它只支持一种类型的连接点:方法调用。乍看一下与 Aspect比这是个很大的限制,但在所有的连接点中,方法调用无疑是最有用的种,我们可以用它来完成人多数用到AOP的地方,如果你需要方法调用之外别的连接点,你总可以同时使用 Spring和 Aspect口 Spring aop中,一个方面是由一个实现 Advisor(知者)接口的类表示的。 Spring中提供了一些方便的 Advisor接口的实现类。 Advisor有2个子接口: Introduction advisor和Pointcutadvisor。所有用切入点控制该在哪些连接点运行通知的 Advisor,都应该实现Pointcutadvisor接口。A Proxy Factory类控制着 Spring aop中的织入和创建代理的过程。在真正创建代理之前我们必须指定被通知对象或者说目标对象。我们可以通过 setTarget()方法来完成这个步骤。 Proxy Factory内部将牛成代理的过稈转交给一个 Default Aop Proxy Factory对象来完戌,后者又根据程序中的设置将其转交给个Cgib2 AopProxy或者 JdkDynamicAopProxy来完成。口 Spring中通知类型前置通知org. springframework aop Method Before Advice后置通知 org. springframework aop AfterReturning Advice包围通知org. springframework. aop. Methodinterceptor抛出通知 org.springframework aop. hrowsAdvice引入org. springframework aop IntrocutionInterceptor这些通知类型,结合方法调用连接点一起可以完成90%的AOP工作,对于剩下的不常用的10%,我们可以依赖 Aspect.QQ:3599580httpshowmecode.cnffinks/bookPro Spring2.5 Spring高级程序设计David wang录制想实现哪种的活,先定义本来的类 Somec|ass而后实现 SomeAdvice imp| ementsMethod BeforeAdvice(或其它而后 Proxy Factory pf= new Proxy Factory()bf. setTarget(new Some Class()bf. addAdvice new Some AdviceO)SomeC| ass proxy=( Some class)bf: getProxy();现在就是代理类了◇抛出通知此招聘通知类实现 Throws Advice接口,而此接口中并不包含仼何方法。但是在此通知类中需要编写以 after Throwing()为名字的方法,参数不定,有二种1) public void after Throwing(Exception ex)throws Throwable)publicdafter Throwing(Method method, Objectl args, Objecttarget, llegalArgument Exception ex) throws throwable{相信你也可以猜出它们的含义。其中Ⅲ egalArgument Exception只是另一个异常,通过程序可以看到,简单地抛出Exception会运行第—个 after Throwing0方法,而抛出的一个Ⅲ legalArgument Exception时会运行第二个 after Throwing方法。对于抛出的每一个异常, Spring只会运行一个afterThrowing()方法, Spring会选择签名与抛岀的异常最匹配的一个方法。如果抛出通知定义了两个 after Throwing0方法,他们的异常类型一样,但是一个只有一个参数而另一个有4个参数,那么 Spring会运行那个有4个参数的 after Throwing(方法。抛出通知在很多情况下都很有用:我们可以用它重新定义整个异常继承结构或者构建焦的异常日志。我们发现在调试运行中的程序时异常通知格外有用,因为我们无需修改程序代码就可以添加新的日志代码OSpring里的通知者和切入点到目前为止,以前的示例都用 ProxyFactory. addAdvice(方法为代理设定通知。实际上,该方法会在后台委派给 addAdvisor(方法,而后者会创建一个 Default pointcutadvisor实例并将切入点设为对所有方法的调用。这样,目标的所有方法就都能被通知到了。在某些情况下,比如用AoP做口志时,这样做可能正是我们需要的,可能在别的情况下,我们希望只通知相关的而不是所有的方法。虽然我们可以简单地在通知内检查被通知的方法是不是正确的方法,但将接受的方法名称列表直接写进代码中会降低通知的通用性。使用切入点可以控制哪些方法被通知而无需将该列表写入通知里,显然这样做可重用性比较好。为了确定被调用的方法是否应该被通知每次目标上的任何一个方法被调用时都需要做一个检査,这显然会影响程序的性能。当使用切入点时,每个方法会被检查一遍,其结果会被缓冲起来供日后使用1)切入点接口public interface PointcutClassFilter getClass Filter (;MethodMatcher getMethod Matcherpublic interface ClassFilterBoolean matcher( class clazz);public interface MethodMatchertBoolean matche(method m, Class targetclassQQ:3599580httpshowmecode.cnffinks/bookPro Spring2.5 Spring高级程序设计DavidWang录制Boolean isruntimeoBoolean matches(Method m, Class targetClass, object[ aSpring支持2种不同的 Method Matcher:静态的和动态的。一个 Method matcher具体是哪一种取决于 ruNtime方法的返回值。在使用一个 Method Matcher之前, Spring会调用ruNtime()如果返回 FALSE,那么该 Methodmatcher就是静态的否则就是动态的。如果切入点是静态的,那么 Spring会针对目标上的每一个方法调用一次 Method matcher的 matches( Method class)方法,其返回值被缓存起来以便日后调用该方法时使用。这样,对每一个方法的适用性测试只会进行一次,之后调用该方法时不会再调用 matches()方法了。如果切入点是动态的, Spring仍然会在目标方法第一次调用时用 matches( Method,Cass进行一个静态的测试来检查其总的适用性。不过,如果该测试返回TRUE,那么在此基础上每次该方法被调用时 Spring会再次调用 matches( Method, Class, Object[)方汯。这样一个动态的 Method matcher可以根据一次只体的方法调用,而不仅仅是方法本身,来决定切入点是否适用。显然,静态切入点(即 Method matcher为静态的切入点)的性能比动态切入点要好得多,因为它们不需要在每次调用时重新检查,不过话说回来,使用动态切入点来决定是否执行通知要比使用静态切入点更加灵活。总的来说,我们建议尽量使用静态切入点。不过,如果执行通知的开销非常大的话,最好使用动态切入点来规避对不必要的调用通知。通常很少有人自己编写 Pointcut的实现,因为 Spring提供了静态切入点和动态切入点的抽黎基类。org.springframework aop. support下的Composable pointcutControl flow PointcutJdkRegexpMethdPointcutNameMatch Method Pointcutorg.springframework aop下的StaticMethod MatcherPointcutDynamicMethodMatcher PointcutAnnnotaion Matching PointcutAspectJ Expression Pointcut2)使用 Default Pointcutadvisor在使用任何 Pointcut实现之前,必须先生成一个 Advisor,更准确地说是一个PointcutAdvisorc Spring用 Advisor来表示方面,即通知和切入点的结合,其中切入点定义了哪些地方可以被通知以及如何通知。3)用 StaticMethod Matcher pointcut创建静态切入点以此为基类创建一个简单的静态切入点,只需要实现 matches( Method,dasS4)使用 DynamicMethod Matcher Pointcut创建动态切入点,它只有一个抽象方法matches( Method, lass, object我们必须实现这个方法,不过我们会看到明智的做法是同时也实现 matches( Method, Class)方法以控制静态检查)使用简单的名称匹配 NameMatchMethod pointcut通常创建一个切入点时,我们想要基于方法名称来做匹配,而忽略方法的签名和返回类型。在这利情况下,我们可以用此类来匹配·组方法名称,而不需要创建 StaticMethod Matcher Pointcut的了类。6)用正则表达式创建切入点我们需要一个正则表达式切入点( dkRegxpMethod Pointcut或QQ:3599580httpshowmecode.cnffinks/bookPro Spring2.5 Spring高级程序设计David wang录制者 Perls RegexMethodPointcut)来用正则表达式匹配方法名。7)通知者的便利实现对于很多的 Pointcut, Spring也提供相对的 Advisor的便利实现,这些实现也可以当作 Pointcut使用。比如说,在之前的例子中(com. apressprospeRing2.ch05 namepc Name pointcutExample)我们同时使用了NameMatch Method Pointcut和 Defaultpointcutadvisor也可以直接使用NameMatch Method Pointcutadvisor,这样公更加简沽。8)使用 AspectJExpression Pointcut此类让你能够编写 Aspect表达式米定义一个切入点。(参UL com. apress. prospring 2 ch05. aspectj. AspectJExpression PointcutDemo9)使用 Annotation Matching Pointcut考虑这样一种情况:在测试时对于性能监控的目的,我们想对若干方法进行通知。但是这些方法都来自于不同的包和类中。另外,我们还希望通过尽可以少的配置来对要监控的方法或类进行修改。一种解决方案就是实现注解,并在所有希望通知的类或方法上使用该注解。这便是此类的用武之地。这个类的构造函数有二个参数,均是传送注解类( SomeAnnotation.cass),第一个参数为类级别第二个参数为方法级别,如果第一个设置而第个为Nu的话,则被注解的类的所有方法均被通知,如果第一个为Nu第二个设置的话,则被注解的方法被通知,如果二个都设置的话类级别参数相当于无效,即仍是只有有注解的方法才会被通知10)使用控制流切入点 Control Flow Pointcut Spring的控制流切入点匹配一个类中对某一个方法或所有方法的调用。可参照 com. apress prospering2cho5 cflow Control flow Dem11)使用 Composable Pointcut此类可以将多个切入点组合在一起,取它们的并集或者交集它有2个方法umon和 intersection(其传入的参数可以是 Method Matcher也可以是ClassFilter。参考示例 com. apress prospeRing2ch05 cflow Composable PointcutDemo切入点总结如果你没有找到一个切入点实现满足你的需要,仍可以在 Pointcut、 Method Matcher和Class Filter基础上创建自u的实现。使用组合切入点和通知者有两种办法。一种是分开创建切入点实现和通知者实现。如前面例了中我们都创建了 Pointcut的实现,然后用 Defaultpointcutadvisor把通知和切入点加到代理中去。另一种办法在 Spring文档的很多例子中用到,它将 Pointcut封装到我们自己的Advisor实现中,这样,我们创建的类既实现 Pointcut又实现 PointcutAdvisor,而Pointcutadvisor. getPointcut()方法简单地返回this. Spring中的很多类,如StaticMethod Match pointcutadvisor都采用这种方法。CGLIB代理与JDK动态代理的性能比较参照 com. apress prospeRing2ch05 proxies. Proxy PerfTest类。在上述类代码中,可以看到测试了3和不冋的代理类型:标准CGB代理、固定通知链的CGLB代理以及」DK代理。对于每一种代理我们运行以下5种测试。◇被通知方法:即接受通知的方法,此例中public class TestPointcut extends staticMethodMatcherPointcut iepublic boolean matches(Method method, class targetclass)t/ TODO Auto-generated method stubQQ:3599580httpshowmecode.cnffinks/bookPro Spring2.5 Spring高级程序设计DavidWang录制return advised"equals(me thod getName())overrideublic ClassFilter getClassFilter()TODO Auto-generated method stubreturn new Classfilter()i@Overridepublic boolean matches (Class clazz)fTODO Auto-generated method stubreturn clazz = simpleBean, class;此接点标明了只在 Simplebean类上的 advised方法可以被通知到。我们在这个测试中使用的是一个空的前置通知以减小通知本身对性能测试的影响◇未被通知的方法:代理上的一个不接受通知的方法。通常代理上会有很多未被通知的方法。这个测试反映不同的代理处理未被通知方法的性能。此例中为 unadvised(equals50)方法:这个测试反映执行 equals()方法的额外开销。这当你的代理在 HashMap或类似集合中作为键值时尤为重要。◇ hash Code()方法:和 equals(方法一样, hashCode)方法在代理作为 Hash Map或类似的集合的键值时十分重要。◇执行 Advised接口上的方法:之前所说,默认状态下代理会实现 Advised接口,这样就可以在代理生成后修改它,也可以查询有关该代理的信息。这个测试检查各个代理类型处理 Advised接口上方法的速度。从测试结果可以看出,CGLB代理的性能要远远超过JDκ代理。执行被通知方法时,标准cGLB代理的性能略好过」DK代理,不过当我们使用固定通知链CGLB代理时,性能差异就十分明显了。对于未被执行的通知,CGLB代理比」DK代理快8倍以上。至于Advised接口上的方法,我们注意到CGLB也会快一些,但不会快太多。这是因为 Advised方法在 intercept.)的较前韶分中执行,所以很多别的方法需要的逻辑都被跳过了。当我们代理类时,cGLB代理是默认选项,因为只有它能生成类的代理。如果要在代理接口时使用cGuB,我们就必须用 setoptimize(设定优化方法将 ProxyFactory类的优化标志设为TRUE第6章AOP进阶探讨 Spring中的框架服务如何让我们能透明地使用AOP,讨论如何使用 Spring和 Aspect的集成来克服 Spring aop的限制QQ:3599580

用户评论
请输入评论内容
评分:
Generic placeholder image 卡了网匿名网友 2019-05-02 04:05:41

不建议下载,最好下载新版本的。

Generic placeholder image 卡了网匿名网友 2019-05-02 04:05:41

差评,糊弄人的东西

Generic placeholder image 卡了网匿名网友 2019-05-02 04:05:41

版本比较老了