播客javaandroid就业-汤阳光spring2.5课程二_第1页
播客javaandroid就业-汤阳光spring2.5课程二_第2页
播客javaandroid就业-汤阳光spring2.5课程二_第3页
播客javaandroid就业-汤阳光spring2.5课程二_第4页
播客javaandroid就业-汤阳光spring2.5课程二_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

IOC补Bean继applicationContext.xmlbean时,可以指定属性false,如果为true,则容器就不会创建这个类的实例,这时就可以不指定class属性。通常用于抽取公共beanbeanbean定义继承。在bean时可以指定parent属性,其值为另一个bean的id或是name的值,表示把parrent中的定义继承过来,就像自己有这些定义一样。注意:这只是在配置时方便,与实际在父Bean中定义的属性必须要在子Bean中出现。如果子Bean中没有定义相关属性,将外部资源文件(在配置中使用变量方式一PropertyPlaceholderConfigurer类加一、applicationContext.xml中的配置<!--<bean<property 定义一个bean,其属性值中可以使用变量,格式为${变量名}。<beanid="userDao" <propertyname="jdbcUrl"<propertyname="driverClass"<propertyname="username"<propertyname="password"二、perties中的配置jdbcUrl=jdbcUrl=jdbc:mysql:///testdriverClass=com.mysql.jdbc.Driverusername=rootpassword=由于PropertyPlaceholderConfigurer字符过多,Spring给出来另一种外部资源文件的context命名空间:/其他代码是一样的(略使用说1${jdbcUrl}”的值将不会当成变量就是“${jdbcUrl}2${jdbcUrl}”的值将会被当成变propertiessystemproperties中获取,查找顺序如下:如果第一步没找到就从systemproeprties中查(使用System.getProperty(String如果还没找到,就抛异常,说找不到这个变量的值<bean<bean4,同时使用时,试验结果是:定义面的有效,定义在后面的无效模模式说模式:即ProxyPattern,常用的设计模式之一。模式的主要作用是为其他对象publicclassUserServiceProxyimplementsUserServiceInter//静态模privateUserServiceInterpublicUserServiceProxy(UserServiceInteruserService)this.userService=}publicvoiddelete(){System.out.println("....befordelete System.out.println("...afterdelete }}真实角色:定义了角色所代表地真实对自行实示例程序publicinterfaceUserServicevoid}publicclassUserServiceImplimplementsUserService{publicvoiddeleteUser(){System.out.println(删除一个User);}}//实现类 对publicclassUserServiceImplProxyimplementsUserServiceprivateUserServicepublicUserServiceImplProxy(UserServicerealUserService)this.realUserService=}publicvoiddeleteUser(){System.out.println(==");System.out.println(==");}}publicclassMainTest{publicvoidtest()UserServiceuserServiceImpl=newUserServiceuserServiceProxy=newUserServiceImplProxy(userServiceImpl);userServiceProxy.deleteUser();//使用 }}执行结果删除一个User总结1,静态在使用时,需要定义接口或是父类,被对象与对象一起实现相同2,静态存在一个问题:当我们在被的类中增加了一个方法,类中也要增加相应方法。JDK动////做日志的JDK动 对publicclassLogJdkProxyimplementsInvocationHandlerprivateObjecttarget publicLogJdkProxy(Objecttarget)this.target=}/**创 对象publicObjectcreateProxyInstance()//第2个参数设 //第3个参数设置回调对象, returnProxy.newProxyInstance(//getClass().getClassLoader(),//第1个参数target.getClass().getInterfaces()第2个参数this);//第3个参数}@paramproxy目标对象 @parammethod对应于 @paramargs传入 publicObjectinvoke(Objectproxy,MethodmethodObjectargs)throwsThrowabSystem.out.println("==Log:开始执行操作,方法名:"+method.getName()+"==");Objectresult=method.invoke(target,args);执行原方法,把方法调用委派给目标System.out.println("==Log:操作执行完毕==");return}}当目标类实现了接口,我们可以使用jdk的Proxy来生成对象。测试代码如下publicvoidtest()UserServiceImpluserServiceImpl=new//创 对UserServiceuserService=(UserService)new//执行方法(使用的 对象}执行结果Log:开始执行操作,方法名:deleteUser删除一个UserLog:JDK动态总结1,JAVA动态是使用java.lang.reflect包中的Proxy类InvocationHandler接口这两个来完成的2,要使用JDK动态,必须要定义接口3,JDK动态将会所有pubic的方法(因为只能调用接口中定义的方法,这4,如果只想一部分方法,可以在invoke方法中对要执行的方法名进行判断CGLIB生成JDK的动态有一个限制,就是使用动态的对象必须实现一个或多个接口。如果想没有实现接口的类,就可以使用CGLIB实现。CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如SpringAOP和dynaop,为他们提供方法的的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指一、原对象//public//publicclassUserServiceImpl publicfinalvoidfoo1(){System.out.println(final<<");} publicstaticvoidfoo2(){System.out.println(static<<");} privatevoidfoo3()System.out.println(private}CGLIB这个方法,可以是publicprotected,defaultpublicvoiddeleteUser(){System.out.println(删除一个User);}}////类publicclassLogCglibProxyimplementsMethodInterceptorprivateObjecttarget 创 对@param@paramtargetpublic<T>TcreateProxyInstance(Ttarget)this.target=Enhancerenhancer=newEnhancer();//该类用于生成 enhancer.setSuperclass(target.getClass());//设置父类enhancer.setCallback(this);//设置回调对象为自己这个对象return(T)enhancer.create();//创建 }@param@param@param@parampublicObjectintercept(Objectproxy,Methodmethod,Object[]args,MethodProxymethodProxy)throwsThrowable{Objectresult=methodProxy.invoke(target,args);执行原方法System.out.println("==Log:操作执行完毕==");return}}注:MethodInterceptor的全限定为CGLIB总结1,CGLIB可以生成目标类的子类,并重写父类非final修饰符的方法2,要求类不能是final的,要的方法要是非final、非static、非的总spring在运行期创建,不需要特殊的编译器。spring有两种方式1,若目标对象实现了若干接口,spring就会使用JDK动态AOP中的概Aspect(切面joinpoint(连接点支持方法类型的连接点,joinpointfield或类构造器)Pointcut(切入点所谓切入点是指我们要对那些joinpoint进行的定义Advice(通知所谓通知是指到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置Target(目标对象Weave(织入指将aspects应用到target对象并导致proxy对象创建的过程称为织入Introduction(引入在不修改类代码的前提下,IntroductionSpring中进行AOP编程的基JavaClassSpring提供了两种切面使用方式,实际工作中我们可以选用其中一种使用基于XML配置方式进行AOP开发使用基于注解方式进行AOP开发概念:Pointcut(切入点切入点Pointcout,就是指要指定一个规则,以表示要哪些方法。切入点都是Pointcut接口(切点)JDKSpring的配置文件中配置。匹配需要被切入的方法。定义 Spring概念:Advice(通知通知Advice,就是到方法后要增加的功能,可以在原方法执行前、后、出异常等等Advice接口的实现类。概念:Advisor/aspect(切面在Spring当中,通过将“通知”和“切入点”进行关联完整的定义一个切使用编程方式实现一、目标对publicinterfacevoidqueryUsers();voidaddUser();voiddeleteUser();}publicclassUserServiceImplimplementsUserService{publicvoidqueryUsers(){System.out.println(查询User);}publicvoidaddUser(){System.out.println(添加一个User);}publicvoiddeleteUser(){System.out.println(删除一个User);inta10}}二、定义一个“通知”类,作用是指定在到方法后要做什么事publicpublicclassTxAdviceimplementsMethodInterceptor{publicObjectinvoke(MethodInvocationmethodInvocation)ThrowableSystem.out.println(Tx:开始事务,方法名:+methodInvocation.getMethod().getName()+"==");tryObjectresultmethodIceed()执行原方法System.out.println("==Tx:提交事务==");return}catch(Exceptione){System.out.println(Tx:==");thrownewRuntimeException(e);}}}注:MethodInterceptor接口的全限定名为“ercept.MethodInterceptor”三、使用编程的方式实现AOP效果:publicvoidtest()UserServiceuserService=new ethodPointcutpointcut=new //TxAdvicetxAdvice=new3,“切入点通知切面(一个横切关注点AdvisorlogAdvisor=newDefaultPointcutAdvisor(pointcut,//4,生 对ProxyFactoryproxyFactory=newProxyFactory();proxyFactory.addAdvisor(logAdvisor)添加一个横切关注点(切面),可以添加多个。proxyFactory.setTarget(userService);//设置目标对象userService=(UserService)proxyFactory.getProxy();//获取生成 //5,使用 }spring的配置文件中aop命名空要进行AOP编程,首先我们要在spring的配置文件中引入aop命名<<beans"" 切入点表达格式)说明来分析我们用过的*spring2.ch06.simple.TestBean2.*(..)表达式:星号*表示任何类型模式我们在这个类名后又跟另一个星号*(..),这表示一个任意名称任意数(包举例XML的配publicclassMyAdvicepublicvoidbefore(){System.out.println(==");}publicvoidafterReturning(){System.out.println(==");}publicvoidthrowsException(){System.out.println(==");}publicvoidafter(){System.out.println(==");}参数ProceedingJoinPointpublicObjectaround(ProceedingJoinPointpoint)throwsThrowableSystem.out.println("==环绕通知(前)==");Objectresult=ceed();System.out.println(环绕通知(后)==");returnresult;}}配置配置bean<beanid="userService"<beanid="myAdvice"所有的切面和通知都必须定义在aop:config配置切面<aop:aspect <aop:pointcutexpression="execution(public*id="txPointcut" <aop:beforemethod="before"pointcut-ref="txPointcut" <aop:after-returningmethod="afterReturning"pointcut- <aop:after-throwingmethod="throwsException"pointcut="execution(* <aop:aftermethod="after"pointcut- <aop:aroundmethod="around"pointcut-测试代码publicvoidtest()//1,从容器中获取对象ApplicationContextacnewClassPathXmlApplicationContext("applicationContext.xml",getClass());UserServiceuserService=(UserService)//2,使用对象}基于注解方<!--<!--启用Spring对@AspectJpublicclassMyAdvice在@AspectJ注解风格的AOP1//2,一般使用privatevoid修饰,方法体为空@Pointcut("execution(*cn. privatevoidmyPointcut(){}Before"myPointcut()//也可以写为@Before("execution(*cn. publicvoidbefore()System.out.prin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论