您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 复件(2)Spring开发培训
-1-开发培训——IoC培训作者:版本:时间:说明:赵睿1.02009-03-23初稿一、IoC的概念在很早的2003-2005年的时候,Java社区掀起了一阵轻量级框架的狂潮,这些轻量级框架能够帮助开发者将来自各种不同项目的组件内聚到一个应用程序中。这些个轻量级框架的背后都有一个重要的模式在支撑它们的工作方式,就是InversionofControl,即是IoC。这些个框架发展到今天已经相当的成熟,并且成为了很多大型成熟项目的支柱。其中最为著名的要数Spring了,它的作者正是当年写出了writej2eewithoutejb的人,他挑战j2ee的ejb就像爱因斯坦挑战天体力学的牛顿一样。IoC除了控制反转这个称呼以外,还有一个大家很熟悉的词语叫依赖注入DependencyInjection,当然这两个名字描述的含义在这里是一样的,即是将组件的配置和使用分离开,以及各个组件之间的松耦合。下面来看一个例子,说明什么是IoC。[code]classPostService…privatePostDaopostDao=newPostDao();publicvoidaddPost(Postpost){postDao.createPost(post);}…publicstaticvoidmain…{PostServiceservice=newPostService();service.addPost(newPost());}[code]从这个例子中我们了解到我们生成了一个新的帖子访问类PostDao,并使用这个PostDao来对帖子进行存储。这个时候PostService掌控了所有的事情,它知道怎么去得到PostDao,现在假设这个PostDao对帖子的存储是存储到一个文件中,这个时候我们如果改变一个需求,把它存储到数据库服务器中,那么我们不得不去修改PostService代码为[code]privatePostDBDaopostDao=newPostDBDao();[code]或者PostDao代码,但如果哪天我们又决定改回成文件的存储方式的时候,麻烦、效率、成本又增加了。这个时候我们需要一种良好的解决方案。IoC的方式正好,这个时候我们将控制反转到外部,而非PostService自己。[code]-2-classPostService…privatePostDaopostDao;publicvoidaddPost(Postpost){postDao.createPost(post);}publicvoidsetPostDao(PostDaopostDao){this.postDao=postDao;}…publicstaticvoidmain…{PostServiceservice=newPostService();service.setPostDao(newPostFileDao());//service.setPostDao(newPostDBDao());service.addPost(newPost());}[code]从上面的代码我们可以看到,如果我们对数据访问存储方式进行了改变,要做的仅仅是写一个新的改变方式的PostXXXDao并且继承PostDao(当它是类时)或者实现PostDao(当它是接口时),当然我推荐的是面向接口的编程,然后将这个新的类在需要时注入进去,这样整个组件变得异常透明和松散。IoC的几种形式。依赖注入有几种形式。Type1:构造方法注入[code]classTest…publicTest(InjectClassclazz){…}[code]Type2:设值注入[code]classTest…publicvoidsetInjectClass(InjectClassclazz){…}[code]Type3:接口注入interfaceInjectInterface{-3-voidinjectClass(InjectClassclass);}classImplimplementsInjectInterface{…publicvoidinjectClass(InjectClassclass){…}}接口注入比较不常用。二、IoC容器介绍IoC容器经过多年的洗礼,现在比较著名的有这么几个,Springframework.PicoContainer,Guice。Spring我们下面会详细讲它的用法。Guice是Google的IoC容器,是一种采用元数据的方式进行装配的过程。PicoContainer则相对用得较少。三、Spring的用法在理解了IoC的概念之后,理解Spring的使用就相对简单了。主要结合Spring讲讲一个简单的虚拟的应用。假设我们的需求是登录用户可以在网站上发贴。除开JSP输入页面不谈,我们对Web层以下的做一个简单的设计。服务层数据访问层实体类数据库PostServicePostDaoPostPost表测试先行,我们先写一个测试。[code]@TestpublicvoidtestAddPostSuccess(){ApplicationContextcontext=newClassPathXmlApplicationContext(spring-beans.xml);PostServicepostService=(PostService)context.getBean(PostService);Postpost=newPost();post.setName(postName);post.setContent(content);postService.addPost(post);assertEquals(postService.getPost(1));}[code]注意这里的ApplicationContext,他是获取装配组件的上下文。通过context.getBean(…)来获得组件服务。-4-然后我们看看PostService类:[code]publicinterfacePostSerivce{voidaddPost(Postpost);}[code]可以看出,这个PostService只是一个接口。具体的实现是:[code]publicclassPostServiceImplimplementsPostSerivce{privatePostDaopostDao;publicvoidaddPost(Postpost){postDao.createPost(post);}publicvoidsetPostDao(PostDaopostDao){this.postDao=postDao;}}[code]当然PostDao也是一个接口,我们要习惯针对接口来编程。PostDao的代码就不列出了。下面我们重点来看看Spring-beans.xml这个配置文件[code]beanid=postDaoclass=com.yiji.dao.impl.PostDaoImpl/beanbeanid=postServiceclass=com.yiji.service.impl.PostServiceImplpropertyname=postDaoref=postDao//bean[code]bean标签定义了一个可以使用的Java类。它的id在文档中必须是唯一的不重复的,class属性是这个bean所指向的具体的类。通常是一个实现了具体业务方法的类。property标签是这个bean所指向的具体的类的一个属性,这里就是体现IoC的地方了。上述的name=”postDao”是对应的在PostService类中的memberfield,postDao,如果这里的名字与bean的class的名字不同,那么在执行程序的时候会抛出异常。这里的postDao由于已经有一个bean是我们想用的,所以我们用了ref=”postDao”这个方式来标识PostService类中的memberfield的postDao到时候设置的是bean的ID为postDao的申明的类。这样我们通过申明bean就做到了依赖注入,而不用我们自己去管理这些类的创建和消亡,一切都交给容器去处理。Spring的基础就是这样了。以后一些和项目有关的用法再专门进行讲述。
本文标题:复件(2)Spring开发培训
链接地址:https://www.777doc.com/doc-973176 .html