已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
初识Spring 现在开始写写Spring,Spring它是一个非常优秀的 框架,在之前我已经写过Struts和Hibernate,大家知道现在流行的框架体系结构就是Struts + Spring + Hibernate,现在也有的公司用jsf+ajax代替struts,就是用来做用户界面层UI。一般是Struts导过来,它有一个表单 Bean,以前表单的action就用Struts来做,但现在有了Spring,就由Spring来接手,以后就是由Spring的反转控制以及它的面 向切面性,来接手Struts里面的一些东西,也包括日志服务!Spring 是一种多层的JAVAEE应用程序框架,其核心就是提供一种新的机制管理业务对象及其依赖关系。例如IOC(反转控制)也称为依赖注入,AOP(面向切面编程)!我们先来看一张图片:上图显示出Spring的七个模块,第一个AOP主要是面向切面性部分,先简单的介绍下什么是面向切面性,其实面向切面性是面向对象性中的一种特 殊情况,它其实也是面向对象性中的一种概念,只是它不是一种面向对象的一种方式了,它把其中的一些方法以及服务呢做成一种切面!它“你”去通过!在后面再 详说Spring,它也提供了ORM,学到现在已经对ORM不陌生了,关系对象模型,大家可能会首先想到Hibernate.,其实在Spring中它 已经集成了Hibernate,因此我们需要将 Hibernate加入到Spring中来是非常方便的!我们可以将 其数据源直接配在我们的applicationcontext.xml中, 另外它也提供一个Spring Web服务,以及DAO,所谓的数据访问对象,还有就是Spring context对象,所谓的上下文对象,它里面提供了一个ApplicationContext,当然它自身也提供了MVC,而最终它底层依赖一个核心的 库,是这样一种结构!上 图是它的整体结构,这里的容器使用的是Tomcat,它的UI层用的是Struts,它通过Spring的AOP以及ORM技术与后台进行交互!该图交互 的可能是Hibernate!这样就体现出Stuts做UI层,而Spring做控制层,Hibernate做模型层。MVC!Spring 中有一些术语,介绍如下:轻量级:它的大小是比较小的,它的核心库才一百多K,它的整个框架体系加起来也才一MB左右,不是很大!非 入侵式:假如说一种框架你在应用的时候很依赖于这种框架,就是说你在开发的时候很多地方都依赖这种框架,很多地方你离开了这种框架就运行不了,像 Struts,Struts有点像是入侵式的,像我们的JSP页,里面有很多这样的一些标记!这些标记一旦离开了 Struts框架体系运行 就不行了,那么什么是非入侵式的呢,就是一种组件,或框架,我们离开了它也能活!在这个框架里面也行,这种就叫做非入侵式的,也就是我们的程序与框架关联 不是太紧密的!容器:容器就相当于水缸,篮子,它可以存入组件!可以给主键提供一个运行环境!它可以帮助管理我们以前需要手工编写程序去管理对象关系的工作IOC/DI:IOC 就是我们上面提到的反转控制,或者称为DI依赖注入!它是Spring最核心的概念,使用Spring我们不必在程序中维护对象的依赖关系,只要在XML 设定,Spring容器会自己根据相关配置去产生他们之间的关系,就相当于所有的关系都是在容器运行的时候注入的,而本身他们的关系是没有的! (Hibernate)也是这样的!好比有二个人上学,在他们上学前这二个人之间是没有任何关系的,而当他们被学校分配到一个班级的时候,它们就有了关系 ,同学!这个就相当于是反转控制,在由容器运行的时候通过XML来确定类与类之间的关系!AOP:也是Spring被人重视的另一方面!其实AOP只是Spring支持的一个子容器,AOP(Aspect oriented programming)我们可以在玩游戏的时候经常有这样情景,假如存在一个通道,其中有二个门,假设当我们的角色通过第一道门的时候,我们的红会加100,而再通过第二 道门的时候我们的蓝会加100,现在提出一个问题,就是假如我们这个游戏里面该通道上没有这二个门,是正常的吗?当然是,也行!只不过人物角色不能在通过 该通道的时候加红和蓝,并不影响游戏的整体!就是说有一些服务在我们的WEB应用程序中不是一些必须的服务,就像是Log4J,日志服务!假如说没有它, 我们的程序也行,就是像这样的一些服务,它与我们的应用程序需求无关,但我们又提供了,那么程序中其实有时候有许多这样的情景,就是程序并不是必须,好比 上面的门,我们看整个通道,那么这二个门是不是好比是二个切面呢?我们穿过一个门的时候是不是穿过一个空间的切面了!这种就叫做面向切面性,把一种技术做 成一种切面的形式,你只要通过这个切面的形式,你就获得了这个服务,它其实是面向对象的一种补长,因为面向对象性它只能做为一个对象,我们就必须把一个对 象完整的做出来,那么好比上面的游戏,有这样一个战士,我们做一个战士类,那么当它经过那二门的时候,我们如果以面向对象来考虑,那么 我们要在战士这个类中定义二扇门,一扇加红一扇加蓝,那么这样这二扇门就变成战士的二属性了,那如果这二扇门不存在了,那战士岂不这应该是不行的!这 样我们以切面性来做的话,就可以将战士二扇门属性去掉,然后做二个祝福门,只要战士经过这二门,就会得到红蓝!这其实就是一种AOP概念!持久层:Spring它提供了对持久层的整合!WEB 框架整合:Spring也提供了WEB的MVC解决方案,可以很好的善用IOC和AOP的功能,我们可以轻松的替换掉VIEW层,如使用JSP,结合 Tiles,使用PDF作为用户的使用界面,也可以使用熟悉的WEB容器如JSF和Struts技术与Spring整合!好了,我们来写一种程序来看一下什么叫做依赖注入:我们建立一个JAVA Project(Spring不一定仅仅用在J2EE中,也一样可以应用在J2SE)我们仅仅加载一个核心包就可以了,暂时没有用到AOP以及ORM,这是产生一个配置文件,我们在J2EE中主要放在WEB-INF下。这里我们放在fengyan包下,单击完成,我们先建立一个简单的Bean,User.java.packagefengyan;/*author:fengyan*date:2006-12-3102:37*/publicclassUserprivateStringuserName;publicStringgetUserName()returnuserName;publicvoidsetUserName(StringuserName)this.userName=userName;我们再写一个主函数:TestMain.javapackagefengyan;/*author:fengyan*date:2006-12-3102:39*/publicclassTestMainpublicstaticvoidmain(Stringargs)/依赖注入Useruser=newUser();user.setUserName(fengyan);System.out.println(user.getUserName();这样在运行的时候会输出:fengyan但这种看一下,我们的User与TestMain 之间就有关系了,也就是如果我们要将fengyan改为efly那么我们就需要在TestMain类中修改,这样就形成了一种紧藕合,它们二个类边在一块 了,那么 我们能不能有一种方法可以在二个类内部都不改动的情况下可以输出efly呢,肯定是可以的,那么我们现在在Myeclipse给我们生成的spring配 置文件 applicationContext.xml中修改,我们先打开该文件,然后鼠标移至其内部空白地,右键,如下:看到上图,就想到在Struts中,与我们在Struts的配置文件中操作相似,那个里面是也有new action form,等等!我们设置bean ID为user 存放于我们建立的fengyan包下,然后选择properties属性,添加一个value属性userNane,变量名一定要对应类中,值就改为我们需要的efly,单击完成后看该文件代码如下:efly看起来有点像我们的jsp中的。那么产生后我们如何去调用呢,回头改改TestMainpackagefengyan;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;/*author:fengyan*date:2006-12-3102:39*/publicclassTestMainpublicstaticvoidmain(Stringargs)/*/依赖注入Useruser=newUser();user.setUserName(fengyan);System.out.println(user.getUserName();*/ICO反转控制ApplicationContextcontext=newFileSystemXmlApplicationContext(fengyan/applicationContext.xml);/这样我们获取了一个全局的应用程序上下文对象/下面我们创建实例就不是先前的直接new了Useruser=(User)context.getBean(user);/是对象类型,需转换System.out.println(user.getUserName();这样efly就输出了,那么现在我们要再换为xuanfly就不需要动该二个类文件了,直接改配置文件,这就是IOC技术。 Spring 中的 Bean 上一篇主要讲了IOC反转控制,也就是程序中有些东西用XML文档配置去关联,而不是在类本身里面写明!这篇接着写注入的形式!我们先在上次的项目中修改!继续在fengyan包下添加一个Home.java类: packagefengyan;/*authorfengyan*date:2006-12-3114:50*/publicclassHomeprivateStringaddress;publicStringgetAddress()returnaddress;publicvoidsetAddress(Stringaddress)this.address=address;然后在User.java中添加一Home属性 packagefengyan;/*author:fengyan*date:2006-12-3102:37*/publicclassUserprivateStringuserName;/添加Home属性privateHomemyhome;publicHomegetMyhome()returnmyhome;publicvoidsetMyhome(Homemyhome)this.myhome=myhome;publicStringgetUserName()returnuserName;publicvoidsetUserName(StringuserName)this.userName=userName;将 Home Bean的信息添加到applicationContext.xml中 湖北武汉自然的,User Bean的配置 信息中就少了一个myhome属性: efly我们应该添加myhome,但此时myhome为一对象应该用ref引用,如下 efly最后完整的applicationContext.xml文件如下: 湖北武汉efly而运行的测试文件仅仅加入System.out.println(user.getMyhome().getAddress();即可得到注入的地址packagefengyan;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;/*author:fengyan*date:2006-12-3102:39*/publicclassTestMainpublicstaticvoidmain(Stringargs)/*/依赖注入Useruser=newUser();user.setUserName(fengyan);System.out.println(user.getUserName();*/ICO反转控制ApplicationContextcontext=newFileSystemXmlApplicationContext(fengyan/applicationContext.xml);/这样我们获取了一个全局的应用程序上下文对象/下面我们创建实例就不是先前的直接new了Useruser=(User)context.getBean(user);/是对象类型,需转换System.out.println(user.getUserName();System.out.println(user.getMyhome().getAddress();另外还有构造函数的注入,如何通过一构造函数的注入呢?假设现在我将 上在applicationContext.xml文件中user属性myhome去掉,然后在User.java中写一构造函数, /构造函数的注入publicUser(Homemyhome)this.myhome=myhome;那么这个时候该User实例化时需要一个参数,那么如何做呢?我们将applicationContext.xml文件中user bean的属性autowire由默认的default改为consctructor也就是构造, 湖北武汉efly!-添加一个属性home为上面注入的beanid-此时我们直接运行,发现依然成功!得到了“湖北 武汉”,为什么它能自动输出呢,也就是我们的User.java中本身有二个属性 userName 和myhome,其中有一个属性我们设定了,另外一个没有设定,这时它就会去找,那么找的时候有下面几种方式,这里我说说bean中的autowire属 性,它有以下几种取值:autowire=byType,可以使bean在运行的时候根据需要去寻找同类型的已经在applicationContext.xml中定义了的属性,如果找不到,则处于未绑定状态。autowire=byName,可以使bean在运行时根据需要去寻找同名的已在applicationContext.xml中定义的属性,如果找不到处于未绑定状态。autowire=autodetect:这个是一个个式,直到找到合适的!autowire=constractor,可以使bean在运行的时候根据已在applicationContext.xml中定义的的属性去寻找相关的构造方法属性,如果找不到则牌未绑定状态,它使用的是byType,我 们如果将autowire=constractor改为byType,如果我们定义了多个Home类型的bean则运行的时候会出错,因为有多个类型 满足条件!这时可以换为byName,aotuwrie=byName这里的name是哪里的呢?这里的名字应该是User.java类中定义的属性 private Home myhome;的 myhome同名即可!这时要注意一下,在User.java中加入一个无参数的构造函数!这时如果我们将注入的user bean复制一份 user2,那么在程序中就可以输出user和user2的内容完全一样,但它们的getMyhome()的Home对象是不是同一个注入的myhome 对象呢,我们可以用user.getMyhome().hashcode();发现是完全一样的,由此可知它们所使用的是同一个Home对象!这 样我们明白一件事情,就是上面我们注入的myhome Bean只创建了一次,那么什么时候会创建一次,什么时候会创建多次呢,我们可以看到在bean 中有一属性singleton,在设计模式中也有这样一种模式,单例模式!由此可知如果我们将 真值改为false,则就会在程序运行中创建多个myhome Bean这时我们再改改,将User.java中的Home属性 ,改为Home myhome,以为一集合!或者说是一列,集合,MAP怎么办,packagefengyan;importjava.util.List;importjava.util.Map;importjava.util.Set;/*author:fengyan*date:2006-12-3102:37*/publicclassUserpublicUser()privateStringuserName;/添加Home属性privateHomemyhome;privateListmyhomeList;privateSetmyhomeSet;privateMapmyhomeMap;publicHomegetMyhome()returnmyhome;publicvoidsetMyhome(Homemyhome)this.myhome=myhome;publicStringgetUserName()returnuserName;publicvoidsetUserName(StringuserName)this.userName=userName;publicListgetMyhomeList()returnmyhomeList;publicvoidsetMyhomeList(ListmyhomeList)this.myhomeList=myhomeList;publicMapgetMyhomeMap()returnmyhomeMap;publicvoidsetMyhomeMap(MapmyhomeMap)this.myhomeMap=myhomeMap;publicSetgetMyhomeSet()returnmyhomeSet;publicvoidsetMyhomeSet(SetmyhomeSet)this.myhomeSet=myhomeSet;在applicationContext.xml中添加Home信息,如下: TestMain.java运行 文件中如下读取: /对象集合演示Homehomes=(Home)(user.getMyhome();for(inti=0;ihomes.length;i+)System.out.println(homesi.getAddress();这时我们得到正确输出!这时说明数组成功了! 这是对象集合,那么List呢,我们再在配置文件中将user Bean添加一属性:HAHAXIXItest可知该List中有对象也有普通值!在TestMain中我们这样使用: /List集体演示ListmyList=(List)user.getMyhomeList();Iteratorit=myList.iterator();/跌代器while(it.hasNext()System.out.println(it.next().toString();接下来中SET,如何做,其实和List差不多。在配置文件中user Bean添加一属性 setvalue在运行类中使用如下代码测试: /Set演示Setmyset=(Set)user.getMyhomeSet();Iteratorit1=myset.iterator();while(it1.hasNext()System.out.println(it1.next().toString();最后一个也是相对比较麻烦的一个!我们使用OutLine可视化做,如图,它是键值对的形式,我们添加一个KEY:t1值为对象类型,。我们引用的上面注入的myhome Bean!配置文件user Bean添加的属性代码如下 而测试运行代码如下: /Map演示Mapmymap=(Map)user.getMyhomeMap();System.out.println(Home)(mymap.get(t1).getAddress();/通过主键找这样也就运行到了结果!最后将完整的代码贴出:packagefengyan;importjava.util.List;importjava.util.Map;importjava.util.Set;/*author:fengyan*date:2006-12-3102:37*/publicclassUserpublicUser()privateStringuserName;/添加Home属性privateHomemyhome;privateListmyhomeList;privateSetmyhomeSet;privateMapmyhomeMap;publicHomegetMyhome()returnmyhome;publicvoidsetMyhome(Homemyhome)this.myhome=myhome;publicStringgetUserName()returnuserName;publicvoidsetUserName(StringuserName)this.userName=userName;publicListgetMyhomeList()returnmyhomeList;publicvoidsetMyhomeList(ListmyhomeList)this.myhomeList=myhomeList;publicMapgetMyhomeMap()returnmyhomeMap;publicvoidsetMyhomeMap(MapmyhomeMap)this.myhomeMap=myhomeMap;publicSetgetMyhomeSet()returnmyhomeSet;publicvoidsetMyhomeSet(SetmyhomeSet)this.myhomeSet=myhomeSet;packagefengyan;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Set;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;/*author:fengyan*date:2006-12-3102:39*/publicclassTestMainpublicstaticvoidmain(Stringargs)/*/依赖注入Useruser=newUser();user.setUserName(fengyan);System.out.println(user.getUserName();*/ICO反转控制ApplicationContextcontext=newFileSystemXmlApplicationContext(fengyan/applicationContext.xml);/这样我们获取了一个全局的应用程序上下文对象/下面我们创建实例就不是先前的直接new了Useruser=(User)context.getBean(user);/是对象类型,需转换System.out.println(user.getUserName();/对象集合演示Homehomes=(Home)(user.getMyhome();for(inti=0;ihomes.length;i+)System.out.println(homesi.getAddress();/List集体演示ListmyLis
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026营销策划总监面试题及答案
- 2026幼儿园待聘面试题及答案
- 2026区块链数据交易行业市场供需对比分析及投资实体方案
- (2026年)学校电路电器安全管理制度
- 个人引文报告模版(3篇)
- 2026青岛啤酒生产线节能环保的技术改造的实施效果及经济效益研究方案
- 2026中国药品市场传播咨询服务行业市场供需分析及投资评估规划分析研究报告
- 2026中国物流设备行业市场全面考察及发展趋势与投资前景研判研究报告
- 2026中国体育场馆租赁市场供需管理创新及投资未来发展布局报告
- 安康市宁陕县2027届数学四上期末综合测试试题含解析
- DB32∕T 2060-2024 单位能耗限额
- 企业易制毒化学品管理(企业)
- JG/T 574-2019纤维增强覆面木基复合板
- 租船意向协议书
- 肺癌伴心衰的护理
- 回扣承诺协议书范本
- JJF 2189-2025铂电阻温度计用精密测温仪校准规范
- 《团队合作》课件
- JC∕T 2558-2020 透水混凝土标准规范
- DL∕T 5161.9-2018 电气装置安装工程质量检验及评定规程 第9部分:蓄电池施工质量检验
- QCT1170-2022汽车玻璃用功能膜
评论
0/150
提交评论