•7.1Spring概述•7.2依赖注入•7.3接口及基本配置•7.4SpringAOP•7.5Spring的事务支持•7.6Spring与Struts2的整合•7.7Spring与Hibernate的整合7.1Spring概述Spring框架的主要优势之一是其分层架构,分层架构允许选择使用任一个组件,同时为JavaEE应用程序开发提供集成的框架。Spring框架的分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理Bean的方式,如图7.1所示。7.1Spring概述•核心容器(SpringCore):提供Spring框架的基本功能,其主要组件是BeanFactory,是工厂模式的实现,它通过控制反转模式(IoC(InversionofControl)),将应用程序配置和依赖性规范与实际的应用程序代码分开。•Spring的核心机制是依赖注入(DependencyInjection),也称控制反转。7.2依赖注入•依赖注入(DependencyInjection)的具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。7.2依赖注入7.2.1工厂模式创建一个JavaProject,命名为FactoryExample。在src文件夹下建立包“face”,在该包下建立接口“Human.java”,代码如下:packageface;publicinterfaceHuman{voideat();voidwalk();}7.2.1工厂模式Chinese.java代码如下:packageiface;importface.Human;publicclassChineseimplementsHuman{publicvoideat(){System.out.println(中国人很会吃!);}publicvoidwalk(){System.out.println(中国人健步如飞!);}}7.2.1工厂模式American.java代码如下:packageiface;importface.Human;publicclassAmericanimplementsHuman{publicvoideat(){System.out.println(美国人吃西餐!);}publicvoidwalk(){System.out.println(美国人经常坐车!);}}7.2.1工厂模式在src下建包“factory”,在该包内建立工厂类Factory.java,代码如下:packagefactory;importiface.American;importiface.Chinese;importface.Human;publicclassFactory{publicHumangetHuman(Stringname){if(name.equals(Chinese)){returnnewChinese();}elseif(name.equals(American)){returnnewAmerican();}else{thrownewIllegalArgumentException(参数不正确);}}}7.2.1工厂模式在src下建包test,在该包内建立Test测试类,代码如下:packagetest;importface.Human;importfactory.Factory;publicclassTest{publicstaticvoidmain(String[]args){Humanhuman=null;human=newFactory().getHuman(Chinese);human.eat();human.walk();human=newFactory().getHuman(American);human.eat();human.walk();}}7.2.1工厂模式该程序为Java应用程序,直接运行可看出结果,如图7.2所示。7.2.2依赖注入应用1.为项目添加Spring开发能力右击项目名,依次选择【MyEclipse】→【AddSpringCapabilities…】,将出现如图7.3所示的对话框,选中要应用的Spring版本及所需的类库文件。注意,本书用的Spring版本为Spring3.0。7.2.2依赖注入应用选择结束后,单击【Next】按钮,出现如图7.4所示的界面,用于创建Spring的配置文件。7.2.2依赖注入应用2.修改配置文件applicationContext.xml修改后,其代码如下:?xmlversion=1.0encoding=UTF-8?beansxmlns=:xsi=:p=:schemaLocation=://=chineseclass=iface.Chinese/beanbeanid=americanclass=iface.American/bean/beans7.2.2依赖注入应用3.修改测试类配置完成后,就可以修改Test类的代码如下:packagetest;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;importface.Human;publicclassTest{publicstaticvoidmain(String[]args){ApplicationContextctx=newFileSystemXmlApplicationContext(src/applicationContext.xml);Humanhuman=null;human=(Human)ctx.getBean(chinese);human.eat();human.walk();human=(Human)ctx.getBean(american);human.eat();human.walk();}}7.2.2依赖注入应用4.运行运行该测试类,结果如图7.5所示(案例ex7_FactoryExample)。7.2.3注入的两种方式1.设置注入人类的接口Human.java,代码如下:publicinterfaceHuman{voidspeak();}语言接口Language.java,代码如下:publicinterfaceLanguage{publicStringkind();}7.2.3注入的两种方式下面是Human实现类Chinese.java代码:publicclassChineseimplementsHuman{privateLanguagelan;publicvoidspeak(){System.out.println(lan.kind());}publicvoidsetLan(Languagelan){this.lan=lan;}}下面是Language实现类English.java代码:publicclassEnglishimplementsLanguage{publicStringkind(){return中国人也会说英语!;}}7.2.3注入的两种方式下面通过Spring的配置文件来完成其对象的注入。看其代码:?xmlversion=1.0encoding=UTF-8?beansxmlns=:xsi=:p=:schemaLocation=://!--定义第一个Bean,注入Chinese类对象--beanid=chineseclass=Chinese!--property元素用来注定需要容器注入的属性,lan属性需要容器注入ref就指向lan注入的id--propertyname=lanref=english/property/bean!--注入english--beanid=englishclass=English/bean/beans7.2.3注入的两种方式每个Bean的id属性是该Bean的唯一标识,程序通过id属性访问Bean。而且Bean与Bean的依赖关系也通过id属性关联。测试代码如下:importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassTest{publicstaticvoidmain(String[]args){ApplicationContextctx=newFileSystemXmlApplicationContext(src/applicationContext.xml);Humanhuman=null;human=(Human)ctx.getBean(chinese);human.speak();}}7.2.3注入的两种方式程序执行结果如图7.6所示(ex7_FactoryExample1)。7.2.3注入的两种方式2.构造注入例如,只要对前面的代码Chinese类进行简单的修改:publicclassChineseimplementsHuman{privateLanguagelan;publicChinese(){};//构造注入所需要的带参数的构造函数publicChinese(Languagelan){this.lan=lan;}publicvoidspeak(){System.out.println(lan.kind());}}7.2.3注入的两种方式配置文件也需要作简单的修改:?xmlversion=1.0encoding=UTF-8?beans……!--定义第一个Bean,注入Chinese类对象--beanid=chineseclass=Chinese!--使用构造注入,为Chinese实例注入Language实例--constructor-argref=english/constructor-arg/bean!--注入english--beanid=englishclass=English/bean/beans7.3接口及基本配置7.3.1Spring核心接口1.BeanFactoryBeanFactory采用了工厂设计模式。这个