spring基础功能分享课件_第1页
spring基础功能分享课件_第2页
spring基础功能分享课件_第3页
spring基础功能分享课件_第4页
spring基础功能分享课件_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

《spring基础功能分享》

(HDC)2011-12-151精选2021版课件

Spring是一个非常优秀的开源产品,我记得在04年的时候,在国内突然冒出很多可供JAVA开发者使用的优秀开源产品,比如webwork,struts,spring,ibatis,hibernate等等,到现在为止,这些开源产品的版本都算比较稳定了。很多现有的开源产品,或则刚诞生和发展起来的开源产品,几乎每一款都能兼容Spring,或则和Spring搭档.

2精选2021版课件Spring提供的内容很广,某些章节的内容也很深,一般来讲,它包括有如下的这些模块构成:1、核心容器:Spring核心容器为Spring框架提供了基础功能,在这里,查看源码,你会发现有一个特别的类:BeanFactory,它是最基本的Spring容器和DI所依赖的基础。2、ApplicationContext(应用上下文)模块:他是建立在核心容器之上。这个应用上下文扩展了BeanFactory类,添加了一些别的应用支持,比如I18N(国际化)、应用生命周期事件(比如BeanPostPorcessor接口)等。3、AOP模块:与DI一样,它支持应用对象之间的松耦合,也是我们开发程序时一直追求的方式。4、JDBC抽象及DAO模块:jdbcTemplete模板5、ORM映射集成模块:支持hibernate,jpa,ibatis等框架的持久化模板6、SpringMVC框架:类似于STRUTS\WEBWORK框架,拥有(model/view/controller)7、SpringPortletMVC8、SpringWeb模块9、远程调用,包括RMI,Hessian,Webservice等10、JAVA消息服务,支持很多开源消息产品,比如apacheactiveMQ,MuleESB,JbossMQ等。11、。。。。。。今天,我们就挑选Spring在我们的应用开发中最常被使用的模块来讲解一下:DI和AOP,数据持久化。3精选2021版课件DI介绍

我们首先来看一个截图,搞JAVA开发的,都非常清楚如下的这个代码,这是非常典型的数据源配置:这个代码其实包含了2个概念:1、参数的注入:比如字符串:java:comp/env/jdbc/sample2、bean之间的依赖注入:<reflocal="dataSource"/>4精选2021版课件

其中SampleDAO中的dataSource将由容器在运行期动态注入,而DataSource的具体配置和初始化工作也将由容器在运行期完成。对比传统的实现方式(如通过编码初始化DataSource实例),我们可以看到,基于依赖注入的系统实现相当灵活简洁。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定SampleDAO中所需的DataSource实例。上面的实例中,我们假设SampleDAO是一个运行在J2EE容器中的组件(如Weblogic)。在运行期,通过JNDI从容器中获取DataSource实例。现在假设我们的部署环境发生了变化,系统需要脱离应用服务器独立运行,这样,由于失去了容器的支持,原本通过JNDI获取DataSource的方式不再有效。我们需要如何修改以适应新的系统环境?很简单,我们只需要修改dataSource的配置:5精选2021版课件

对于DI,常见的有如下几种:1、基本数据类型的set方法注入:publicclassUser{ privateintuserid; privateStringusername; privateStringpassword;

//为这些属性添加相应的getter和setter}配置文件:<beanid="user"class="com.wadata.inject.User"> <propertyname="userid"value="1"></property> <propertyname="password"value="pass_word"></property> <propertyname="username"value="tom"></property></bean>测试类:Useruser=(User)context.getBean("user");(注意,spring不一定要让你拥有跟配置文件对应的属性,但一定要拥有配置文件属性所对应的set方法)6精选2021版课件2、基本数据类型的构造器注入(构造方法):为刚才的User添加一个构造方法 publicUser(Stringusername,Stringpassword){ this.username=username; this.password=password; }配置文件:<beanid=“user”class=“com.wadata.inject.User”> <constructor-argvalue="tom"></constructor-arg> <constructor-argvalue="pass_word"></constructor-arg></bean>当然,你也可以如下严格定义参数类型:<constructor-argvalue="tom"type="String"index=“0"></constructor-arg>这个意思就是构造函数中,第一个参数值类型是String,值为tom,并且是构造函数第一个参数设值注入7精选2021版课件3、特殊类型的注入,比如Set,List,Map等数组的值注入:publicclassUser{ privateSetset; privateListlist; privateMapmap; privateUseruser; //添加相应的set,get方法}配置文件如下所示:Set的注入:<propertyname="set"> <set> <value>setvalue1</value> </set></property>List的注入:<propertyname="list"> <list> <value>listvalue1</value> </list></property>Map的注入:<propertyname="map"> <map> <entrykey="key2"value="value2"></entry> </map></property>8精选2021版课件对于属性user的对象注入,可以通过如下的配置文件来描述:<propertyname=“user”ref=“user”/><!--也可以使用local=“user”不过这样的话,只能引用本配置文件中的Bean-->测试代码: publicstaticvoidmain(String[]args){

ApplicationContextcontext=newClassPathXmlApplicationContext("com/wadata/conf/spring.xml");---1

Useruser=(Student)context.getBean(“user”);---2

System.out.println(user.getList()); System.out.println(user.getSet()); System.out.println(user.getMap()); System.out.println(user.getUser()); }第一行代码是将配置文件加载。第二行代码是通过beanID获得一个bean实例。在这里,我介绍一下应用程序获取bean实例的2种方式:9精选2021版课件1、单实例的BEAN延迟加载方式:ApplicationContextcontext=newClassPathXmlApplicationContext("

com/wadata/conf/spring.xml"); Useruser=(User)context.getBean(“user”); Bean配置信息通过ClassPathXmlApplicationContext(“com/wadata/conf/spring.xml”)加载进来,然后通过getBean(“user”)获取相应的bean实例。注意,单实例的bean,通过getBean()方式是延迟加载的。2、通过容器管理了的应用上下文:对于单实例Bean,应用上下文启动后会预载入所有的单实例bean。当应用程序需要这些单实例bean的时候,直接获取了,不需要等待他们被创建。 由于极大多数应用用到的bean都是单实例的,因此,spring也建议使用applicationContext来获取bean实例,而不是通过getBean()的方式获取。另外一点,通过getBean()的方式,无形中增加了系统之间的耦合性,万一beanID发生了改变呢?这样你就需要修改你的应用代码。10精选2021版课件下面稍微介绍一下关于bean的范围化: 注意到了scope=“singleton”,这是Spring2.0新增的功能,也就是spring范围化。在Spring2.0+中,默认所有的Bean都是单一的,也就是scope=‘singleton’方式。如果是单实例bean,这里的scope=‘singleton’可以省略不写。

在2.0之前的版本,只能设置<bean>的singleton属性为true或false,不能进行更多的扩展。以下是Spring2.0+范围化规则列表,在开发时,可供参考:Singleton:定义Bean的范围为每个Spring容器一个实例,默认是这种情况。Prototype:允许Bean可以被多次实例化(相当于new的作用)。Request:定义Bean的范围是HTTP请求。只有在使用有WEB能力的SPRING上下文(SPRINGMVC)时才有效。Session:定义Bean的范围是HTTP请求。只有在使用有WEB能力的SPRING上下文(SPRINGMVC)时才有效。Global-session:定义Bean的范围是全局HTTP会话。只有在portlet上下文中才有效。 总之,对singleton和prototype的通俗理解可以如下描述: 如果一个bean是prototype的,并且这个bean要被注入到其它bean或者你通过getBean这样的方式获得这个bean的时候,spring容器会创建一个新的实例给你。singleton模式指的是对某个对象的完全共享,包括代码空间和数据空间,也就是说,singleton会让所有线程共享他的成员变量。prototype则不会这样。此外singleton的生命周期由容器来管理,但是prototype的生命周期得你自己管理。11精选2021版课件

AspectOrientedProgramming(AOP)是近来非常热门的一个话题。AOP,很多都译作“面向方面编程”。其实,译成“面向切面编程”更来得合适,AOP的本意,是在针对业务处理过程中的切面进行切入、提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果,使之真正意义上做到对象或对象之间的耦合。 在我们开发基于WEB的JAVA应用中,AOP随处可见,比如我们常用的权限管理,登录用户的session是否超时判断,还有大家时常会碰到的数据库事务管理,都会涉及到AOP的概念和行为。如下就是我们常用的数据库事务管理的一个典型AOP配置。

【题外话:Spring提供的事务AOP,是从服务层织入控制的,而不是在DAO层,这个需要注意。】

AOP介绍12精选2021版课件在AOP中,有如下几个核心的概念:切面(Aspect):用程序简单的语言描述,即是需要被管理的类。切面的隔离,降低了耦合性,我们就可以在不同的应用中将各个切面组合使用,从而使得代码可重用性大大增强。连接点(JoinPoint):程序运行过程中的某个阶段点。如某个方法调用,或者某个异常被抛出。处理逻辑(Advice):在某个连接点所采用的处理逻辑。处理逻辑的调用模式通常有以下几种:前三种是我们最常用的调用模式。Before(之前):仅在连接点之前插入预处理过程After-returning(返回后)After-throwing(抛出后):在连接点抛出异常时进行异常处理Around(周围):在连接点前后插入预处理过程和后处理过程,其相当于是前面三种的结合。在Spring里,周围通知是由开源项目AOPAlliance提供的MethodInterceptor接口实现.Introduction(引入)切点(PointCut):一系列连接点的集合,它指明处理方式(Advice)将在何时被触发。 在Spring中,对AOP的支持都是基于代理的。代理类封装了目标BEAN,截取被通知的方法调用,再把这些调用转发到真正的目标BEAN。如何来理解这句话呢?Spring生成代理类的方式有2种,如果目标BEAN实现的是一个接口,SPRING会使用JDK的java.lang.reflect.Proxy类,它允许Spring动态生成一个新类来实现必要的接口、织入任何通知、并且把对这些接口的任何调用都转发到目标类。如果目标类不是实现一个接口,Spring就使用CGLIB库生成目标类的一个子类。在创建这个子类时,Spring织入通知,并且把对子类的调用委托到目标类。

这里需要注意,被标识为final的方法是不能被通知的。因为Spring为目标类创建一个子类,需要被通知的任何方法都会被覆盖并被织入通知,这对final类型的方法是不可能的。 以上这些纯粹的语言描述,很难让人理解和信服。接下来,我们通过一个实际的例子,来说明AOP强大的功能。

【刚好在设计RHM3的功能:表单操作日志功能设计方案,里面恰巧要用AOP】13精选2021版课件14精选2021版课件

我们现在就来看看AopImpl这个类,这是个纯POJO,可以发现,这个类并没有和任何的业务对象进行绑定,最多也只是通过DI的形式,注入了一些所需要的bean。但通过以上的配置,这个类却可以在正确的时间,做正确的事情。

【这里也可以发现,我并没有通过Context.getBean(“beanID”)来获取相应的bean实例。】15精选2021版课件16精选2021版课件 众所周知,在接大多数应用开发中,都脱离不了数据库概念。数据库持久化技术,是一个非常常见且常用的一个技术话题,在早期开发的代码中【没有spring框架提供】,如下的代码片段是我们非常熟悉的:数据库持久化介绍17精选2021版课件 上面的代码,大致实现了数据库一条实体记录的修改。通过对如上代码的分析,发现一个现象:为了执行一个SQL语句【stmt.executeUpdate(“UPDATEuserSETage=18WHEREid=‘erica’”);】,我们必须编写其余可以重复、且和业务无关的代码,并且,这样的代码还会在系统其他地方(也许是每个需要数据库访问的地方)重复出现。于是,大家开始寻找一些设计模式以改进如此的设计,Template模式的应用是其中一种典型的改进方案:让公用代码尽可能抽取,开发者只关心自己业务有关的SQL编写。比如,可以将如上的代码精简到如下这2行: 这就是spring带给我们的好处。 Spring提供了一组数据访问框架,集成了多种数据访问技术,用户可以灵活选择JDBC、Hibernate、JPA、iBatis等任意一个持久化框架,实现数据库的访问。选择Spring提供的模板技术,可以让开发者消除数据持久化代码中的麻烦,特别是在事物控制时,使用这样的模板,会带给开发者事半功倍的效果。首先,我们就来看看Spring给我们提供的多个数据库访问模板,分别适用于不同的持久化机制。

注意:绿色背景是我们开发中常用的一些模板类。18精选2021版课件19精选2021版课件 使用如上的模板,我们只需要在Spring上下文里配置相应的dataSource的Bean,然后把它织入到程序的DAO层即可。【回顾DI介绍章节中的例子】

20精选2021版课件这样,以JDBC模板为例,在我们的DAO实现类中:SampleDAO,核心的代码如下:publicclassSampleDAOimplementSampleDaoService{ ……privateDataSourcedataSource;publicvoidset

温馨提示

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

评论

0/150

提交评论