您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Spring2.0学习笔记
Spring2.0学习笔记1、名词解释1.控制反转(inversionofControl,ioC)与依赖注入(DependencyInjection)由容器来管理对象之间的依赖关系(而不是对象本身来管理),就叫做“控制反转”或“依赖注入”。IOC与DI说的是一回事,但DI这个名词更能表达这种设计模式的思想。2、ICO环境的搭建1、spring依赖库*SPRING_HOME/dist/spring.jar*SPRING_HOME/lib/jakarta-commons/commons-logging.jar*SPRING_HOME/lib/log4j/log4j-1.2.14.jar2、拷贝spring配置文件到src下(applicationContext.xml)3、拷贝log4j配置文件到src下4、在UserManagerImpl中提供构造函数或setter方法,spring将实例化好的UserDao实现注入给我们5、让spring管理我们的对象创建和依赖,必须在spring配置中进行定义6、编写客户端springIoc容器的关键点:*必须将被管理的对象定义到spring配置文件中*必须定义构造函数或setter方法,让spring将对象注入过来三、属性注入普通属性注入:略自定义属性编辑器:什么是属性编辑器,作用?*自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器*如何定义属性编辑器?*继承PropertyEditorSupport类,覆写setAsText()方法*将属性编辑器注册到spring中,参见下图依赖对象的注入方式,可以采用:*ref属性*ref标签*内部bean来定义如何将公共的注入定义描述出来?*通过bean标签定义公共的属性,指定abstract=true*具有相同属性的类在bean标签中指定其parent属性如何使用spring的作用域:beanid=roleclass=spring.chapter2.maryGame.Rolescope=singleton/这里的scope就是用来配置springbean的作用域,它标识bean的作用域。在spring2.0之前bean只有2种作用域即:singleton(单例)、non-singleton(也称prototype),Spring2.0以后,增加了session、request、globalsession三种专用于Web应用程序上下文的Bean。因此,默认情况下Spring2.0现在有五种类型的Bean。当然,Spring2.0对Bean的类型的设计进行了重构,并设计出灵活的Bean类型支持,理论上可以有无数多种类型的Bean,用户可以根据自己的需要,增加新的Bean类型,满足实际应用需求。(下载源码就到源码网:)1、singleton作用域当一个bean的作用域设置为singleton,那么SpringIOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,SpringIOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singletoncache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。配置实例:beanid=roleclass=spring.chapter2.maryGame.Rolescope=singleton/或者beanid=roleclass=spring.chapter2.maryGame.Rolesingleton=true/2、prototypeprototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototypebean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototypebean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)配置实例:beanid=roleclass=spring.chapter2.maryGame.Rolescope=prototype/或者beanid=roleclass=spring.chapter2.maryGame.Rolesingleton=false/3、requestrequest表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTPrequest内有效,配置实例:request、session、globalsession使用的时候首先要在初始化web的web.xml中做如下配置:如果你使用的是Servlet2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可:web-app...listenerlistener-classorg.springframework.web.context.request.RequestContextListener/listener-class/listener.../web-app,如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现:web-app..filterfilter-namerequestContextFilter/filter-namefilter-classorg.springframework.web.filter.RequestContextFilter/filter-class/filterfilter-mappingfilter-namerequestContextFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping.../web-app接着既可以配置bean的作用域了:beanid=roleclass=spring.chapter2.maryGame.Rolescope=request/4、sessionsession作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTPsession内有效,配置实例:配置实例:和request配置实例的前提一样,配置好web启动文件就可以如下配置:beanid=roleclass=spring.chapter2.maryGame.Rolescope=session/5、globalsessionglobalsession作用域类似于标准的HTTPSession作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portletweb应用的各种不同的portlet所共享。在globalsession作用域中定义的bean被限定于全局portletSession的生命周期范围内。如果你在web中使用globalsession作用域来标识bean,那么web会自动当成session类型来使用。配置实例:和request配置实例的前提一样,配置好web启动文件就可以如下配置:beanid=roleclass=spring.chapter2.maryGame.Rolescope=globalsession/6、自定义bean装配作用域在spring2.0中作用域是可以任意扩展的,你可以自定义作用域,甚至你也可以重新定义已有的作用域(但是你不能覆盖singleton和prototype),spring的作用域由接口org.springframework.beans.factory.config.Scope来定义,自定义自己的作用域只要实现该接口即可,下面给个实例:我们建立一个线程的scope,该scope在表示一个线程中有效,代码如下:publicclassMyScopeimplementsScope...{privatefinalThreadLocalthreadScope=newThreadLocal()...{protectedObjectinitialValue()...{returnnewHashMap();}};publicObjectget(Stringname,ObjectFactoryobjectFactory)...{Mapscope=(Map)threadScope.get();Objectobject=scope.get(name);if(object==null)...{object=objectFactory.getObject();scope.put(name,object);}returnobject;}publicObjectremove(Stringname)...{Mapscope=(Map)threadScope.get();returnscope.remove(name);}publicvoidregisterDestructionCallback(Stringname,Runnablecallback)...{}publicStringgetConversationId()...{//TODOAuto-generatedmethodstubreturnnull;}}自动装配:byName、byTypedefault-autowire=byName略四、AOP实现(1)采用Annocation的方式加入aspect下的jar包Aspect(横切性关注点的模块化)组成部分:Advice:横切性关注点的代码实现PointCut:标识性的方法,不被执行,支持表达式。Advice的切入点Spring默认支持的是reflect的动态代理,所以target类必须实现了接口,否则IOC容器无法注入。(下载源码就到源码网:)Spring2.0支持JDK最高版本为1.5,1.6以上会出问题。(2)采用静态配置文件的方式aop:configaop:aspectref=aspectaop:pointcutid=allMethodexpression=execution(**(..))/aop:beforemethod=checkpointcut-ref=allMethod//aop:aspect/aop:configspring对AOP的支持Aspect默认情况下不用实现接口,但对于目标对象,在默认情况下必须实现接口如果没有实现接口必须引入CGLIB库我们可以通过Advice中添加一个JoinPoint参数,这个值会由s
本文标题:Spring2.0学习笔记
链接地址:https://www.777doc.com/doc-3661601 .html