《SSM框架技术开发教程》课件 9 Spring的容器机制、10 Spring的依赖注入_第1页
《SSM框架技术开发教程》课件 9 Spring的容器机制、10 Spring的依赖注入_第2页
《SSM框架技术开发教程》课件 9 Spring的容器机制、10 Spring的依赖注入_第3页
《SSM框架技术开发教程》课件 9 Spring的容器机制、10 Spring的依赖注入_第4页
《SSM框架技术开发教程》课件 9 Spring的容器机制、10 Spring的依赖注入_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

第九章Spring的容器机制演讲人2024-XX-XX本章学习目标:理解Spring框架的容器机制掌握BeanFactory的常用接口编程方法掌握ApplicationContext的常用接口编程方法Spring框架最重要的核心功能之一,就是它提供了容器机制。从前面内容可以得知,Spring框架内有很多不同的功能组件,这些功能组件都有各自独立的jar包。有了容器机制后,不同的功能组件在Spring框架内都以Bean的方式进行管理,不同的Bean对应不同的功能组件。Spring框架底层的容器负责创建这些Bean,并管理它们的配置和生命周期。1容器机制的简介1.1容器机制的原理一般来说,软件系统的主要编程思想之一就是OOP面向对象编程。在传统的OOP中,每一个类都有对应的构造函数。如果要用到某个类的对象,就需要调用它的构造函数,来new一个对象。同时,在使用的过程中,还需要关注此对象声明的作用域,它是某个函数内的局部变量,还是更加广泛的全局变量。最后,开发者在使用过程中还需要关注它的生命周期,如果对象被释放,内存回收,那就无法再使用该对象了。在普通情况下,这些对象的创建、配置、和生命周期的管理的相关代码和业务逻辑代码都耦合在一起。当项目体量增大,对象的数量较多、种类繁杂的时候,这些代码就给开发人员带来一定的麻烦。既影响了业务层逻辑代码的阅读和维护,又容易在管理不同对象的时候混肴或引入bug,从而导致程序出错。1容器机制的简介1.1容器机制的原理为了解决这个问题,Spring框架的核心功能之一就是提供了容器机制。一方面Spring框架本身就提供了很多的功能,这些功能的配置开发需要通过一个个独立的对象来实现,这些对象的管理、创建等问题就可以交给容器机制,从而将开发者解放出来,让他们可以更专注的开发业务层的逻辑。另外一方面,开发者也可以利用容器机制来管理自定义的Java类对象,借用容器机制的优势,将对象的创建和生命周期管理代码从业务层剥离,可以有效提升项目的可维护性。1容器机制的简介1.2容器机制的常用接口容器机制需要通过接口来实现,常用的核心接口有两个,BeanFactory和ApplicationContext。其中BeanFactory顾名思义,就是Bean的工厂,也就是对象的创建和管理的容器本身,这是Spring框架最基本的接口。ApplicationContext是BeanFactory的子接口,也可以称之为Spring上下文。在某些特定的使用场景下,BeanFactory和ApplicationContext有所区别,但实际上它们都可以看作是Spring框架的容器机制的体现,开发者需要灵活使用这两个接口,来完成Bean的创建、配置和管理等相关操作。下面是BeanFactory接口的常用方法列表。表9-1BeanFactory接口的方法1容器机制的简介1.2容器机制的常用接口如表所示,主要都是对Bean对象进行管理、获取等操作。其中对Bean的属性设置(也叫依赖注入)、作用域、生命周期管理等操作,后续章节还会再详细讲解,本章主要关注容器的创建和容器中Bean的获取和基本使用。ApplicationContext是BeanFactory的子类,因此上表中的方法,ApplicationContext对象也都可以直接继承使用。对比BeanFactory,ApplicationContext对象的功能更加强大。它为接口提供了国际化访问功能,提供资源文件系统的访问支持,可同时加载多个配置文件,引入事件机制,让容器在上下文中提供对应用事件的支持,以声明式的方式启动并创建Spring容器。此外,ApplicationContext接口可以为单例的Bean实行初始化,并对成员变量执行setter方法完成属性注入,提升了程序获取Bean实例的性能等。1容器机制的简介1.2容器机制的常用接口对于大部分使用Spring框架的Java应用而言,使用它来作为Spring框架的容器都是更加方便的选择。因为ApplicationContext本身就包含了BeanFactory的全部接口,在某些地方还有功能增强,本教材也推荐读者优先使用ApplicationContext。一般来说,可以在程序启动时,通过ApplicationContext的接口来载入配置文件,从而启动Spring框架的容器和容器中的Bean。在实际开发过程中,可以根据具体的应用场景,来选择不同的创建ApplicationContext对象的方法。如下表所示。表9-2ApplicationContext接口的实现类2容器机制的具体使用创建工程打开Eclipse,选择新建项目中的DynamicWebProject也就是动态Web项目。相关选项和配置使用默认的,给项目起一个名称,最后点击Finish完成即完成项目的创建。2容器机制的具体使用项目的准备工作找到项目的lib文件夹,路径为项目根目录下src/main/webapp/WEB-INF/lib,从之前下载Spring框架的文件夹里找到项目所需的jar包,复制到项目lib文件夹下,完成jar包的导入。如下图所示。图9-1项目所需的jar包示意图2容器机制的具体使用编写Java类的代码在项目里新建一个Java包com.pojo,创建自定义Bean的Java类com.pojo.Student.java,代码如下。Student.java01packagecom.pojo;02publicclassStudent{03privateStringname;04publicStudent(){05super();06//TODOAuto-generatedconstructorstub2容器机制的具体使用编写Java类的代码07System.out.println("-----POJO对象初始化-----");08}09publicStringgetName(){10returnname;2容器机制的具体使用}12publicvoidsetName(Stringname){13=name;14System.out.println("-------POJO对象设置参数-------");15}16@Override17publicStringtoString(){18return"Student[name="+name+"]";19}2容器机制的具体使用}20}Java类里有一个成员变量为String类型的name,主要用于后续的演示。类里需要编写构造函数、getter和setter函数、打印函数等,同时可以根据需要在不同函数里加入对应的打印信息,这样程序运行到对应地方就可以打印不同信息,便于后续测试和演示。2容器机制的具体使用编写配置文件的代码在项目代码的根目录也就是src/main/java下,创建配置文件beans.xml。在配置文件中,主要是完成相关的命名空间设置、xml的schema配置,以及项目中需要用到的JavaBean的定义和配置。具体代码如下所示。beans.xml01<?xmlversion="1.0"encoding="UTF-8"?>02<beansxmlns="/schema/beans"03xmlns:xsi="/2001/XMLSchema-instance"2容器机制的具体使用编写配置文件的代码04xsi:schemaLocation="/schema/beans05/schema/beans/spring-beans.xsd">06<beanid="stu01"class="com.pojo.Student">07<propertyname="name"value="Chris"/>08</bean>2容器机制的具体使用编写配置文件的代码第06~13行代码是使用配置文件定义的两个Bean对象,均是com.pojo.Student类的对象。区别在于成员变量或者说属性的配置方式不同,第一个对象是直接使用value属性进行配置,第二个对象使用value子元素进行配置。这里两种方式都可以使用。2容器机制的具体使用编写项目的测试代码在根目录下创建Java包com.test,新建测试文档TestMain.java,内部代码如下所示。TestMain.java01packagecom.test;02importorg.springframework.beans.factory.support.DefaultListableBeanFactory;03importorg.springframework.beans.factory.xml.XmlBeanDefinitionReader;04importorg.springframework.context.ApplicationContext;2容器机制的具体使用编写项目的测试代码05importorg.springframework.context.support.ClassPathXmlApplicationContext;06importorg.springframework.core.io.ClassPathResource;07importcom.pojo.Student;08publicclassTestMain{09publicstaticvoidmain(String[]args){10//TODOAuto-generatedmethodstub2容器机制的具体使用//BeanFactory的初始化17System.out.println(student.toString());18System.out.println("\n");19//ApplicationContext的初始化(BeanFactory的子接口,应用更广泛)20ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml");21System.out.println("-----ApplicationContext初始化-----");2容器机制的具体使用//BeanFactory的初始化22Studentstudent2=context.getBean("stu02",Student.class);23System.out.println(student2.toString());24}25}为了方便读者对BeanFactory和ApplicationContext进行区分,这里对于同一个配置文件beans.xml,采用了两种不同的初始化方式和获取Bean对象的方式。2容器机制的具体使用//BeanFactory的初始化第11~17行代码,是使用BeanFactory的接口来读取配置文件,并完成Spring框架的初始化,然后通过beanFactory的getBean方法获取Bean对象,并打印信息。第19~23行代码,是使用ApplicationContext的接口来读取配置文件,并完成Spring框架的初始化,然后通过context的getBean方法获取Bean对象,并打印信息。2容器机制的具体使用项目测试结果项目代码编写完成后,在TestMain.java文件中点击右键,点击运行RunAs,选择JavaApplication。项目运行结果如下图所示。图9-2Spring框架的简单应用运行示意图2容器机制的具体使用项目测试结果从测试结果可以得出以下结论:一方面,BeanFactory和ApplicationContext都可以顺利完成Spring框架的容器初始化和Bean对象的创建、配置工作,也可以在业务层方便的获取Bean对象。另外一方面,可以看到BeanFactory中是容器先创建和初始化,在调用getBean的时候再完成Bean对象的创建和配置;而ApplicationContext是在容器初始化的同时,就先完成了Bean对象的创建和配置。从这里就可以看出ApplicationContext的设计思路的不同,它将容器和容器内所有对象的创建和初始化放到一起,这样在后续getBean获取对象的时候,可以提升执行效率。对比TestMain.java里的相关代码,也可以发现ApplicationContext的代码更加简介。因此,对于开发者来说,直接使用ApplicationContext来进行容器的相关开发使用,往往是更优的选择。2容器机制的具体使用2.2Spring容器的事件机制的使用案例在Spring框架的容器中,除了创建和管理Bean对象外,还有一些其他的功能,比如说事件机制。ApplicationContext的事件机制是通过观察者设计模式来实现的,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext的事件处理。具体的方式就是,如果容器中有一个ApplicationListenterBean对象,每当ApplicationContext容器发布ApplicationEvent事件时,ApplicationListenterBean将被触发。实际上,Spring框架的事件机制与所有的事件机制的原理都基本相似,它们都需要由事件源、事件和事件监听器来组成。在Spring容器的事件机制中,事件源就是ApplicationContext容器本身,事件由Java程序显式调用或触发。下面通过一个具体案例演示Spring框架容器的事件机制的使用2容器机制的具体使用编写event事件类的代码在com.pojo包下,新建一个事件类TestEvent.java,这个类需要继承自ApplicationEvent.java,在创建的时候可以通过eclipse选择需要继承的类。图9-3选择ApplicationEvent.java作为父类2容器机制的具体使用编写event事件类的代码灵活使用IDE的功能,可以有效辅助开发者提升开发效率。当然不使用辅助工具,直接新建并编写代码也可以,具体代码如例2-1所示。TestEvent.java01packagecom.pojo;02importorg.springframework.context.ApplicationEvent;03publicclassTestEventextendsApplicationEvent{04privateStringmessage;05publicTestEvent(Stringarg0){2容器机制的具体使用编写event事件类的代码06super(arg0);07//TODOAuto-generatedconstructorstub08message=arg0;09}10@Override11publicStringtoString(){12return"TestEvent[message="+message+"]";13}2容器机制的具体使用编写event事件类的代码14}第04行代码,创建了一个String类型的成员变量,用于事件传递消息的演示。第08行代码,在构造事件对象的时候,传入String参数,并将参数赋值给message成员变量。2容器机制的具体使用编写监听器的代码新建一个com.event包,然后新建TestNotifier.java。监听类需要继承ApplicationListener接口,这一步也可以利用eclipse的辅助功能完成。图9-4添加ApplicationListener接口添加接口后,就会自动在类里添加需要实现的接口函数。具体代码如下。applicationContext.xml2容器机制的具体使用编写监听器的代码01packagecom.event;02importorg.springframework.context.ApplicationListener;03importcom.pojo.TestEvent;04publicclassTestNotifierimplementsApplicationListener<TestEvent>{05@Override06publicvoidonApplicationEvent(TestEventevent){07//TODOAuto-generatedmethodstub2容器机制的具体使用编写监听器的代码08System.out.println("====事件接收,处理开始====");09if(event!=null){10System.out.println(event.toString());11}else{12System.out.println("TestNotifieronApplicationEvent():event==null!");2容器机制的具体使用}14System.out.println("====事件接收,处理结束====");15}16}当接收到事件后,会触发onApplicationEvent(TestEventevent)函数的执行。这里主要就是输出相关的代码,用于演示事件的执行。也可以对event事件做判定,如果不为空则打印出message消息。2容器机制的具体使用编写配置文件的代码03xmlns:xsi="/2001/XMLSchema-instance"0501<?xmlversion="1.0"encoding="UTF-8"?>03为了和前一个案例做区分,这里新建一个配置文件appliacionContext.xml。0102<beansxmlns="/schema/beans"04applicationContext.xml022容器机制的具体使用编写配置文件的代码04xsi:schemaLocation="/schema/beans05/schema/beans/spring-beans.xsd">06<beanclass="com.event.TestNotifier"/>07</beans>第01~05行代码是xml文件声明、命名空间和xmlschema的配置。第06行代码声明了一个com.event.TestNotifier的Bean对象,在这里声明以为着对象交给Spring的容器机制来创建和管理。2容器机制的具体使用编写项目的测试代码在com.test测试的包下,新建另外一个测试文件TestMain2.java。代码如下所示。TestMain2.java01packagecom.test;02importorg.springframework.context.ApplicationContext;03importorg.springframework.context.support.ClassPathXmlApplicationContext;04importcom.pojo.TestEvent;05publicclassTestMain2{2容器机制的具体使用编写项目的测试代码06publicstaticvoidmain(String[]args){07//TODOAuto-generatedmethodstub2容器机制的具体使用//ApplicationContext的事件09ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");10TestEventtestEvent=newTestEvent("事件携带的消息示例");11System.out.println("===准备广播事件===");12context.publishEvent(testEvent);13}14}2容器机制的具体使用//ApplicationContext的事件第09行代码,通过读入配置文件,来启动Spring框架的容器。在Spring框架中,容器可以通过上下文对象ApplicationContext来获取,构造函数ClassPathXmlApplicationContext需要传入配置文件的路径和文件名。第10行代码,创建一个TestEvent对象。构造函数里的String变量,会通过参数设置给对象的message成员变量,在接收到事件后,可以打印出来。第12行代码,通过ApplicationContext的publishEvent方法,显式的广播事件,从而触发事件监听器的相关代码。2容器机制的具体使用项目测试结果项目代码编写完成后,在TestMain2.java文件中点击右键,点击运行RunAs,选择JavaApplication。项目运行结果如下图所示。图9-5Spring容器的事件机制示意图可以看到,调用publishEvent方法广播事件后,TestNotifier类中的onApplicationEvent方法被触发。依次打印输出开始接受事件、事件本身的String信息和事件接受结束等预设的信息,程序正常运行。3本章小结本章主要介绍了Spring框架的容器机制的原理,讲解了容器机制里最重要的两个接口的使用方法,BeanFactory和ApplicationContext的区别,最后介绍Spring容器的事件机制的使用等相关知识。通过本章的学习,读者可以理解进一步理解Spring框架的优势,掌握容器机制的相关知识和编程方法,理解BeanFactory和ApplicationContext两者在编程上的区别,最后掌握Spring容器中事件机制的编程方法。4习题1.Spring框架最重要的核心功能之一,就是它提供了()A.Java运行环境B.OOP面向对象编程C.事务管理D.容器机制2.Spring框架的容器机制主要有两个接口,分别是BeanFactory和_________________________。3.请简述Spring框架的容器机制的概念和使用方法。谢谢第十章Spring的依赖注入演讲人2024-XX-XX本章学习目标:理解依赖注入的概念掌握容器机制和依赖注入的关系掌握属性注入和构造器注入的编程方法在编写软件系统的过程中,应用最多最广泛的基本编程思路是OOP面向对象编程。当软件系统的体量增大时,不同的类或对象就存在不同的关系。例如继承关系,就是一个类是另外一个类的子类,子类可以继承父类的成员变量和成员函数,并可以加入新的成员变量和成员函数。有时涉及到对象A需要调用对象B的情形,在Spring框架中这种情形称为依赖关系,即对象A依赖对象B。接下来本章讲解的依赖注入,就是此类应用场景下Spring框架所提供的解决方案。1依赖注入的理论知识1.1依赖注入的简介结合前面的知识内容,Spring框架有两个核心功能:第一就是容器机制,在Spring框架中可以把不同的对象交给Spring容器进行创建和管理;第二就是依赖注入,对于存在依赖关系的不同对象,Spring框架可以在容器中进行解耦管理这种依赖关系。1依赖注入的理论知识1.2依赖注入的内涵依赖注入可以对Bean注入普通的简单数据类型的属性值,也可以将一个Bean注入成其他Bean的引用。依赖注入是一种优秀的解耦方式,它让Spring的Bean以配置文件的方式组织在一起,而不是以硬编码的方式耦合在一起。依赖注入还有另外一种说法,称为IOC控制反转。在Spring框架中,控制反转和依赖注入实际上是同一个概念。在传统的编程方式下,对象A调用对象B的方法,一般需要在对象A的内部显示new一个对象B,然后才能调用。对象的创建、管理和使用都耦合在一起了。使用Spring框架的依赖注入后,可以独立的在容器中创建对象A和对象B,预留出对象A中对于对象B的引用。当需要使用的时候,将对象B注入到这个预留的引用中,即可以完成对象A对对象B方法的调用。这种情况下,对象A和对象B的控制权就由相关的代码移交给了创建它们的容器,也就是控制发生了反转,这就是IOC控制反转这个概念的由来。控制反转提供了依赖注入的实现思路,它们是一个概念的两种说法。1依赖注入的理论知识1.2依赖注入的内涵为了更好的理解控制反转和依赖注入,这里举一个例子进行说明。假如有两个对象,人person和斧子axe。人可以用斧子作为工具,即person可以调用axe的砍伐chop()方法。在原始社会时代,人需要自己造斧子,然后斧子成为这个人的私人工具,他就可以拿着这把斧子进行砍伐工作。这个过程就类似软件编程里的传统思路,一个对象需要创建另外一个对象,才可以调用它的方法。1依赖注入的理论知识1.2依赖注入的内涵图10-1调用对象创建被调用对象后来随着时代进步,一方面有了专门的工厂,可以大批量的制造专业的斧子。另外,个人制造斧子费事费力,也不够锋利耐用,专业性不强,效率也低下。渐渐的,当人需要使用斧子砍伐的时候,不再是自己去造一把斧子,而是改变思路,去买一把斧子。买斧子的时候,工厂早就将斧子已经造好了,只是这个时候斧子的所有人变为了购买者这个人。此时,虽然这个人没有制造这把斧子,但是这把工厂制造的斧子已经属于他了,他就可以拿着斧子进行砍伐了。1依赖注入的理论知识1.2依赖注入的内涵图10-2调用对象不创建被调用对象这种情况下,就对应Spring的依赖注入模式。工厂就相当于Spring框架的容器,它负责创建和管理Person和Axe对象。购买行为相当于是依赖注入,在人购买斧子后,Spring容器将Axe对象注入到Person对象中。然后Person对象就可以直接调用Axe对象的砍伐chop()方法。1依赖注入的理论知识1.2依赖注入的内涵在这种依赖注入的编程方式下,人和斧子都是独立的对象,对象的创建都交给容器进行管理。假如有多个人和多把斧子,此时就可以借助容器机制,灵活的将不同的斧子分给不同的人,或者容器回收斧子然后派发新的斧子。这样整个的代码就都没有耦合在一起,编写业务逻辑的时候,思路就更清晰,代码也就更容易维护和阅读。在Spring框架中,依赖注入的编程实现方法有很多,这里我们着重讲解两个最基本最常用的,分别是属性值注入和构造器注入。属性值注入对应的是对象成员变量的getter和setter方法,通过函数接口完成注入。构造器注入对应的是对象的构造函数的参数,通过参数传递来完成注入。这两种注入的方式在编程上相差不大,可以根据具体的应用场景来灵活选择使用。下面通过两个具体的编程案例来进行详细讲解。2依赖注入的实现2.1属性注入的使用案例属性注入通过Java类成员变量的getter和setter函数来实现,使用起来较为简单方便,是依赖注入最常用的方式之一。在本案例中,为了更好的演示项目开发的流程和规范,使用先设计接口后编码实现的方式来进行项目开发。2依赖注入的实现创建工程打开Eclipse,选择新建项目中的DynamicWebProject也就是动态Web项目。相关选项和配置使用默认的,给项目起一个名称,最后点击Finish完成即完成项目的创建。2依赖注入的实现项目的准备工作找到项目的lib文件夹,路径为项目根目录下src/main/webapp/WEB-INF/lib,从之前下载Spring框架的文件夹里找到项目所需的jar包,复制到项目lib文件夹下,完成jar包的导入。如下图所示。图10-3项目所需的jar包示意图2依赖注入的实现编写接口类的代码在项目的根目录下,新建一个接口类的包com.service,包里新建两个接口类:Computer.java是被调用类的接口,Person.java是调用类的接口。Person.java01packagecom.service;02publicinterfacePerson{03voiduseComputer();04}Computer.java2依赖注入的实现编写接口类的代码01packagecom.service;02publicinterfaceComputer{03voidwork();04}接口定义的都较为简单,Computer接口中有一个work()函数,Person接口中有一个useComputer()函数,用于调用其他对象。2依赖注入的实现编写实现类的代码编写好接口类后,接下来编写针对接口的实现类。在项目根目录下创建实现类的包com.pojo,分别新建两个实现类:Laptop.java是Computer.java的实现类,Student.java是Person.java。读者在开发项目的时候需要注意,当类或接口较多时,尽量规范命名,使得从命名上也可以大致分辨不同类或接口的关系。Student.java01packagecom.pojo;02importcom.service.Computer;03importcom.service.Person;2依赖注入的实现}12publicvoidsetName(Stringname){13=name;14}15publicvoidsetComputer(Computercomputer){16puter=computer;17}18@Override19publicvoiduseComputer(){20//TODOAuto-generatedmethodstub2依赖注入的实现}21System.out.println("Student:"+name+"useComputer()");22computer.work();23}24}第04行代码,implementsPerson声明了该类是继承了Person.java,因此类里面必须含有Person.java的函数,对应第18~23行代码。2依赖注入的实现}第05~06行代码,对应Student类的两个成员变量,一个是普通成员变量name,一个是其他的Java类对象Computer。第12~17行代码分别对应两个成员变量的setter函数,这个在属性注入的时候,会被Spring框架的底层容器机制调用。第18~23行代码是接口的方法,内容是打印出name属性,并调用成员变量computer的work()方法,实现一个对象A调用另外一个对象B的方法。Laptop.java01packagecom.pojo;02importcom.service.Computer;2依赖注入的实现}03publicclassLaptopimplementsComputer{04@Override05publicvoidwork(){06//TODOAuto-generatedmethodstub07System.out.println("Uselaptopasacomputertowork(codingorphotoshop).");08}09}Laptop.java由于是被调用类,它的代码相对较简单,它继承了Computer.java,需要实现接口里定义的work()方法。2依赖注入的实现编写配置文件的代码在项目代码的根目录也就是src/main/java下,创建Spring框架的配置文件applicationContext.xml。在配置文件中,主要是完成相关的命名空间设置、xml的schema配置,以及项目中需要用到的JavaBean的定义和配置。具体代码如下所示。applicationContext.xml01<?xmlversion="1.0"encoding="UTF-8"?>02<beansxmlns="/schema/beans"2依赖注入的实现编写配置文件的代码08<propertyname="computer"ref="surface"/>09</bean>10<beanid="surface"class="com.pojo.Laptop"/>11</beans>第10行代码,定义了一个id为surface的Java对象,对应com.pojo.Laptop类,它就是最终会被调用的Java对象。2依赖注入的实现编写配置文件的代码第06~09行代码,定义了调用者的Java对象。id为stu01,对应com.pojo.Student类。然后通过property子元素,设置name属性取值为Allen,设置computer属性取值为第10行代码定义的id为surface的Java对象。这里的07~08两行代码,就是属性注入的具体实现方法。需要注意的是,对于普通的属性值,直接用value指定对应的取值即可。如果是注入一个Java对象,则需要首先定义一个被注入或者说被调用的Java对象,然后用ref来指定id值,即可完成注入。2依赖注入的实现编写项目的测试代码在根目录下创建Java包com.test,新建测试文档TestMain.java,内部代码如下所示。TestMain.java01packagecom.test;02importorg.springframework.context.ApplicationContext;03importorg.springframework.context.support.ClassPathXmlApplicationContext;04importcom.pojo.Student;05importcom.pojo.Student2;2依赖注入的实现编写项目的测试代码06publicclassTestMain{07publicstaticvoidmain(String[]args){08//TODOAuto-generatedmethodstub09ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");10Studentstudent=context.getBean("stu01",Student.class);11student.useComputer();14}2依赖注入的实现}第09行代码,通过读入配置文件,来启动Spring框架的容器。在Spring框架中,容器可以通过上下文对象ApplicationContext来获取,构造函数ClassPathXmlApplicationContext需要传入配置文件的路径和文件名。第10行代码,由于Spring的容器已经启动,定义好的Bean对象会直接被容器创建。这里只需要使用context.getBean来获取Bean对象即可。第11行代码,通过student.useComputer(),来调用student对象中的成员变量laptop对象。2依赖注入的实现项目测试结果项目代码编写完成后,在TestMain.java文件中点击右键,点击运行RunAs,选择JavaApplication。项目运行结果如下图所示。图10-4Spring框架的属性注入运行示意图2依赖注入的实现项目测试结果从图中可以看到,student对象和laptop对象都正常运行并输出打印相关内容。使用依赖注入最大的优势,就是业务代码中没有两个对象的创建和管理的相关代码,同时被调用对象和调用对象之间也没有硬编码耦合,我们可以随时通过配置文件中的ref来指向另外一个不同的对象id从而完成新的调用关系。这种解耦的编程方式,有助于项目的长期维护。2依赖注入的实现2.2构造器注入的使用案例除了属性注入可以实现依赖注入,还可以使用构造器注入。顾名思义,构造器注入需要在Java类中声明带有参数的构造函数,通过构造函数的参数传递来完成依赖注入操作。除了注入方式的不同,其他方面和属性注入基本一致。下面通过一个具体案例演示构造器注入的使用方法。2依赖注入的实现编写实现类的代码在前面的案例中,由于使用了属性注入,Java类中必须实现成员变量的setter函数。本案例中使用构造器注入,因此Java类中可以不实现setter函数,但是必须有带参数的构造函数。Student2.java01packagecom.pojo;02importcom.service.Computer;03importcom.service.Person;04publicclassStudent2implementsPerson{05privateStringname;2依赖注入的实现编写实现类的代码06privateComputercomputer;07//搭配构造器注入,需

温馨提示

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

评论

0/150

提交评论