Spring的核心机制及容器.ppt_第1页
Spring的核心机制及容器.ppt_第2页
Spring的核心机制及容器.ppt_第3页
Spring的核心机制及容器.ppt_第4页
Spring的核心机制及容器.ppt_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

第14章Spring的核心机制及容器,14.1Spring的核心机制,14.2Spring容器,14.3Bean中对集合的注入,14.4两种后处理器,14.1Spring的核心机制,14.1.1依赖注入的概念新建一个WebProject,名称为Spring_DI,为其添加Spring核心类库,步骤见13.2节的第2步。创建包“erfaces”,在该包中新建Person接口,代码如下:erfaces;/*定义Person接口*/publicinterfacePerson/接口中定义一个吃食物方法publicvoideatFood();继续在该包中定义Food接口,代码如下:erfaces;/*定义Food接口*/publicinterfaceFood/在接口中定义一个吃的方法,返回吃的东西publicStringeat();,14.1.1依赖注入的概念,创建包“erfaces.impl”,在该包中定义Person的实现类Man,代码如下:erfaces.impl;erfaces.Food;erfaces.Person;/*Person接口的具体实现类*/publicclassManimplementsPerson/定义Food接口私有属性,面向Food接口编程,而不是具体的实现类privateFoodfood;/构建setter方法,必须要有,后面会讲解为什么publicvoidsetFood(Foodfood)this.food=food;/实现Person接口eatFood方法publicvoideatFood()System.out.println(food.eat();,14.1.1依赖注入的概念,定义Food的一个实现类Apple,代码如下:erfaces.impl;erfaces.Food;publicclassAppleimplementsFoodpublicStringeat()return正在吃苹果.;在src下编写Spring的配置文件config.xml,使用Spring的配置文件将Person实例和Food实例组织在一起,配置内容。,14.1.1依赖注入的概念,下面就可以编写测试类了,代码如下:packageorg.test;erfaces.Person;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassTestpublicstaticvoidmain(Stringargs)/创建ApplicationContext对象,参数为配置文件放置的位置ApplicationContextcontext=newFileSystemXmlApplicationContext(/WebRoot/WEB-INF/classes/config.xml);/通过Personbean的id来获取bean实例,面向接口编程,因此此处强制类型转换为接口类型Personp=(Person)context.getBean(man);/直接执行Person的eatFood()方法p.eatFood();,14.1.1依赖注入的概念,运行主程序,输出结果,代码如下:正在吃苹果.在主程序中,调用了Person的eatFood()方法,该方法的方法体内需要使用Food的实例,按照通常的方式,在Person实例的eatFood()方法中,应该这样实现:/创建Food实例food=newApple();/获得Food实例的eat方法返回值System.out.println(food.eat();,14.1.1依赖注入的概念,如果需要改写Food的实现类,或者提供另一个实现类给Person实例使用,Person接口和Man实现类都无须改变,只需提供另一个Food的实现,然后对配置文件进行简单的修改即可。例如,我们现在新建另一个Food的实现类Orange,代码如下:erfaces.impl;erfaces.Food;/*定义Orange类,实现Food接口*/publicclassOrangeimplementsFood/*实现接口吃的方法*/publicStringeat()return正在吃橘子.;,14.1.1依赖注入的概念,修改配置文件config.xml,增加orange的Bean,代码如下:该行重新定义了一个Food的实现:orange,然后修改man的bean配置,将原来传入apple的地方改为传入orange。也就是将:改成:再次运行主程序,输出结果如下:正在吃橘子.,14.1.2依赖注入的两种方式,前面讲解了依赖注入的概念,本节将介绍依赖注入的两种方式:set注入及构造注入。其中,set注入已经在HelloWorld程序中及上面的程序中应用过了,使用方法非常简单,需要为被注入的属性或类构建setter方法,例如在HelloWorld.java中:packageorg.model;publicclassHelloWorldprivateStringmessage;publicStringgetMessage()returnmessage;publicvoidsetMessage(Stringmessage)this.message=message;,14.1.2依赖注入的两种方式,然后通过配置文件的Bean来为其注入值:HelloWorld!,14.1.2依赖注入的两种方式,这样设置后就可以调用HelloWorld的对象来调用getter方法,获取为message设置的值了。同样地,在Man.java中:erfaces.impl;erfaces.Food;erfaces.Person;/*Person接口的具体实现类*/publicclassManimplementsPerson/定义Food接口私有属性,面向Food接口编程,而不是具体的实现类privateFoodfood;/设置依赖注入所需的setter方法,这就解释了为什么必须有setter方法publicvoidsetFood(Foodfood)this.food=food;/实现Person接口eatFood方法publicvoideatFood()System.out.println(food.eat();,14.1.2依赖注入的两种方式,通过配置文件对food进行依赖注入:构造注入,是指在接受注入的类中定义一个构造方法,并在构造方法的参数中定义需要注入的元素。下面就把HelloWorld实例修改为应用构造注入来为元素设值。具体步骤是:首先,修改HelloWorld.java类,在该类中增加一个构造方法,然后再修改配置文件config.xml,最后测试程序。HelloWorld.java类修改为:packageorg.model;publicclassHelloWorldprivateStringmessage;publicHelloWorld(Stringmessage)this.message=message;publicStringgetMessage()returnmessage;,14.1.2依赖注入的两种方式,config.xml修改为:HelloWorld,14.1.2依赖注入的两种方式,其中,“constructor-arg”用来表示通过构造方式来进行依赖注入,“index=0”表示构造方法中的第一个参数,如果只有一个参数,可以省略不写,如果有多个参数,就直接重复配置“constructor-arg”即可,不过要改变“index”的值,例如,如果在“HelloWorld”类中还有一个参数“mess”,并且通过构造方法为其注入值:publicHelloWorld(Stringmessage,Stringmess)this.message=message;this.mess=mess;那么,只需在配置文件config.xml中加上一个“constructor-arg”:HelloYabber,14.1.3两种注入方式的比较,在开发过程中,set注入和构造注入都是会经常用到的,这两种依赖注入的方式并没有绝对的好坏,只是使用的场合有所不同而已。使用构造注入可以在构建对象的同时一并完成依赖关系的建立,所以,如果要建立的对象的关系很多,使用构造注入就会在构造方法上留下很多的参数,是非常不易阅读的,这时建议使用set注入。然而,用set注入由于提供了setXx()方法,所以不能保证相关的数据在执行时不被更改设定,因此,如果想要让一些数据变为只读或私有,使用构造注入会是个很好的选择。,14.2Spring容器,14.2.1Bean的定义Bean是描述Java的软件组件模型,其定义在Spring配置文件的根元素下,元素是元素的子元素,在根元素下可以包含多个子元素。每个可以完成一个简单的功能,也可以完成一个复杂的功能,之间可以互相协同工作,完成复杂的关系。,14.2.2Bean的基本属性,在HelloWorld实例中,config.xml中的Bean的配置如下:HelloYabber!在Bean中有一个id属性及class属性,这个id唯一标识了该Bean。在配置文件中,不能有重复的Bean的id,因为在代码中通过BeanFactory或ApplicationContext来获取Bean的实例时,都要用它来作为唯一索引:HelloWorldhelloWorld=(HelloWorld)ac.getBean(HelloWorld);,14.2.2Bean的基本属性,1Bean的id属性为Bean指定别名可以用name属性来完成,如果需要为Bean指定多个别名,可以在name属性中使用逗号(,)、分号(;)或空格来分隔多个别名,在程序中可以通过任意一个别名访问该Bean实例。例如,id为“HelloWorld”的Bean,其别名为:HelloYabber!则在程序中可以利用“a”、“b”、“c”任意一个来获取Bean的实例:HelloWorldhelloWorld=(HelloWorld)ac.getBean(a);或HelloWorldhelloWorld=(HelloWorld)ac.getBean(b);或HelloWorldhelloWorld=(HelloWorld)ac.getBean(c);以上三种方法均可完成Bean实例的获取。,14.2.2Bean的基本属性,2Bean的class属性可以看出,每个Bean都会指定class属性,class属性指明了Bean的来源,即Bean的实际路径,注意,这里要写出完整的包名+类名。例如:class属性非常简单,这里就不过多介绍了。3Bean的scope属性scope属性用于指定Bean的作用域,Spring支持5种作用域,这5种作用域如下:singleton:单例模式,当定义该模式时,在容器分配Bean的时候,它总是返回同一个实例。该模式是默认的,即不定义scope时的模式。prototype:原型模式,即每次通过容器的getBean方法获取Bean的实例时,都将产生信息的Bean实例。,14.2.2Bean的基本属性,request:对于每次HTTP请求中,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域有效。session:对于每次HTTPSession请求中,使用session定义的Bean都将产生一个新实例,即每次HTTPSession请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域有效。globalsession:每个全局的HttpSession对应一个Bean实例。典型情况下,仅在使用portletcontext的时候有效。只有在Web应用中使用Spring时,该作用域才有效。,14.2.2Bean的基本属性,比较常用的是前两种作用域,即singleton及prototype。下面举例说明这两种作用域的差别。仍然是对HelloWorld程序进行修改,在配置文件config.xml中这样配置:在“HelloWorld1”Bean中没有定义“scope”属性,即默认的“singleton”单例模式。“HelloWorld2”Bean中指定作用域为“prototype”,即原型模式。HelloWorld.java类不变,编写测试类代码。,14.2.2Bean的基本属性,运行该应用程序,控制台输出如图14.1所示。从输出内容可以发现,应用单例模式得到的Bean实例永远是同一实例,而原型模式则是不同的实例。,图14.1控制台输出,14.2.2Bean的基本属性,4Bean的property在Spring的依赖注入中,是应用Bean的子元素来为属性进行设值的:HelloWorld!如果要为属性设置“null”,有两种方法。第一种直接用value元素指定:null,14.2.2Bean的基本属性,第二种方法直接用:,14.2.3Bean的生命周期,1Bean的定义Bean的定义在前面的实例中已经应用很多了,从基本的HelloWorld程序中就可以基本看出Bean的定义,这里就不再列举其定义形式,但值得一提的是,在一个大的应用中,会有很多的Bean需要在配置文件中定义,这样配置文件就会很大,变得不易阅读及维护,这时可以把相关的Bean放置在一个配置文件中,创建多个配置文件。2Bean的初始化在Spring中,Bean完成全部属性的设置后,Spring中的bean的初始化回调有两种方法,一种是在配置文件中声明“init-method=init”,然后在HelloWorld类中写一个init()方法来初始化;另一种是实现InitializingBean接口,然后覆盖其afterPropertiesSet()方法。知道了初始化过程中会应用这两种方法,就可以在Bean的初始化过程中让其执行特定行为。,14.2.3Bean的生命周期,下面介绍这两种方法的使用方式。第一种方式如下:(1)在HelloWorld类中增加一个init()方法。代码如下:packageorg.model;publicclassHelloWorldprivateStringmessage;publicStringgetMessage()returnmessage;publicvoidsetMessage(Stringmessage)this.message=message;publicvoidinit()/利用该方法修改message的值this.setMessage(HelloYabber);,14.2.3Bean的生命周期,(2)修改配置文件config.xml,指定Bean中要初始化的方法为init(),代码如下:HelloWorld,14.2.3Bean的生命周期,(3)编写测试类,输出HelloWorld中message的值,代码如下:packageorg.test;importorg.model.HelloWorld;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassTestpublicstaticvoidmain(Stringargs)ApplicationContextac=newFileSystemXmlApplicationContext(/WebRoot/WEB-INF/classes/config.xml);HelloWorldhelloWorld=(HelloWorld)ac.getBean(HelloWorld);System.out.println(helloWorld.getMessage();,14.2.3Bean的生命周期,运行该程序,控制台输出如图14.2所示。可以发现,初始化方法的调用是在Bean初始化的后期执行的,改变了message的赋值,故输出为“HelloYabber”。,图14.2控制台输出,14.2.3Bean的生命周期,第二种方式,实现InitializingBean接口,并覆盖其“afterPropertiesSet()”方法。(1)修改HelloWorld.java,让其实现InitializingBean接口,并覆盖其“afterPropertiesSet()”方法。代码实现为:packageorg.model;importorg.springframework.beans.factory.InitializingBean;publicclassHelloWorldimplementsInitializingBeanprivateStringmessage;publicStringgetMessage()returnmessage;publicvoidsetMessage(Stringmessage)this.message=message;publicvoidafterPropertiesSet()throwsExceptionthis.setMessage(HelloYabber);,14.2.3Bean的生命周期,(2)修改config.xml配置文件,代码如下:HelloWorld,14.2.3Bean的生命周期,3Bean的应用Bean的应用非常简单,在Spring中有两种使用Bean的方式。第一种,使用BeanFactory:/在ClassPath下寻找,由于配置文件就是放在ClassPath下,故可以直接找到ClassPathResourceres=newClassPathResource(config.xml);XmlBeanFactoryfactory=newXmlBeanFactory(res);HelloWorldhelloWorld=(HelloWorld)factory.getBean(HelloWorld);System.out.println(helloWorld.getMessage();第二种,使用ApplicationContext:ApplicationContextac=newFileSystemXmlApplicationContext(/WebRoot/WEB-INF/classes/config.xml);HelloWorldhelloWorld=(HelloWorld)ac.getBean(HelloWorld);System.out.println(helloWorld.getMessage();,14.2.3Bean的生命周期,4Bean的销毁首先介绍第一种方式。(1)在HelloWorld类中增加一个cleanup()方法。代码如下:packageorg.model;publicclassHelloWorldDestroyprivateStringmessage;publicStringgetMessage()returnmessage;publicvoidsetMessage(Stringmessage)this.message=message;publicvoidcleanup()this.setMessage(HelloWorld!);System.out.println(销毁之前要调用!);,14.2.3Bean的生命周期,(2)修改config.xml配置文件,代码如下:HelloWorld,14.2.3Bean的生命周期,(3)编写测试类,输出message的值,代码如下:packageorg.test;importorg.model.HelloWorldDestroy;importorg.springframework.context.support.AbstractApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassTestpublicstaticvoidmain(Stringargs)AbstractApplicationContextac=newFileSystemXmlApplicationContext(/WebRoot/WEB-INF/classes/config.xml);HelloWorldDestroyhelloWorld=(HelloWorldDestroy)ac.getBean(HelloWorld);System.out.println(helloWorld.getMessage();/为Spring容器注册关闭钩子,程序将会在推出JVM之前关闭Spring容器ac.registerShutdownHook();,14.2.3Bean的生命周期,运行程序,控制台输出结果如图14.3所示。,图14.3控制台输出结果,14.2.3Bean的生命周期,第二种方式,实现DisposableBean接口,并覆盖其destroy()方法。(1)修改HelloWorldDestroy.java,让其实现DisposableBean接口,并覆盖其“destroy()”方法。代码实现为:packageorg.model;importorg.springframework.beans.factory.DisposableBean;publicclassHelloWorldDestroyimplementsDisposableBeanprivateStringmessage;publicStringgetMessage()returnmessage;publicvoidsetMessage(Stringmessage)this.message=message;publicvoiddestroy()throwsExceptionSystem.out.println(该句在销毁之前要显示!);,14.2.3Bean的生命周期,(2)配置文件config.xml修改为:HelloWorld,14.2.4Bean的管理,1BeanFactory在Spring中有几种BeanFactory的实现,其中最常用的是org.springframework.bean.factory.xml.XmlBeanFactory。它根据XML文件中的定义装载Bean。要创建XmlBeanFactory,需要传递一个ClassPathResource对象给构造方法。例如,下面的代码片段获取一个BeanFactory对象:/在ClassPath下寻找,由于配置文件就是放在ClassPath下,故可以直接找到ClassPathResourceres=newClassPathResource(config.xml);BeanFactoryfactory=newXmlBeanFactory(res);为了从BeanFactory得到Bean,只要简单地调用getBean()方法,把需要的Bean的名字当做参数传递进去就行了。由于得到的是Object类型,所以要进行强制类型转化:HelloWorldhelloWorld=(HelloWorld)factory.getBean(HelloWorld);,14.2.4Bean的管理,2ApplicationContextBeanFactory对简单应用来说已经很好了,但是为了获得Spring框架的强大功能,需要使用Spring更加高级的容器ApplicationContext(应用上下文)。表面上看,ApplicationContext和BeanFactory差不多,两者都是载入Bean的定义信息,装配Bean,根据需要分发Bean,但是ApplicationContext提供了更多的功能:应用上下文提供了文本信息解析工具,包括对国际化的支持。应用上下文提供了载入文本资源的通用方法,如载入图片。应用上下文可以向注册为监听器的Bean发送事件。,14.2.4Bean的管理,在ApplicationContext的诸多实现中,有三个常用的实现:ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息,把上下文定义文件当成类路径资源。FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文定义信息。XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息。例如:ApplicationContextcontext=newFileSystemXmlApplicationContext(c:/server.xml);ApplicationContextcontext=newClassPathApplicationContext(server.xml);ApplicationContextcontext=WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext();FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的区别是:FileSystemXmlApplicationContext只能在指定的路径中寻找server.xml文件,而ClassPathXmlApplicationContext可以在整个类路径中寻找foo.xml。,14.2.5Bean的依赖关系,Bean的依赖关系是指当为一个Bean的属性赋值时要应用到另外的Bean,这种情况也称Bean的引用。例如,有这样的一个类DateClass.java:packageorg.model;importjava.util.Date;publicclassDateClassprivateDatedate;publicDategetDate()returndate;publicvoidsetDate(Datedate)this.date=date;,14.2.5Bean的依赖关系,在配置文件中为其注入“date”值时,引用了其他Bean,代码为:,14.2.5Bean的依赖关系,编辑测试程序Test.java:packageorg.test;importorg.model.DateClass;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassTestpublicstaticvoidmain(Stringargs)ApplicationContextac=newFileSystemXmlApplicationContext(/WebRoot/WEB-INF/classes/config.xml);DateClassdc=(DateClass)ac.getBean(getDate);System.out.println(dc.getDate();,14.2.5Bean的依赖关系,运行程序,控制台输出如图14.4所示。控制台打印出了本机的当前时间,在“getDate”的Bean中引用了“d”Bean,也就为DateClass类中的属性“date”赋值为“d”Bean,即该Bean的对象,故打印出了当前时间。,图14.4控制台输出结果,14.2.5Bean的依赖关系,从上例可以看出,Spring中是用“ref”来指定依赖关系的,用“ref”指定依赖关系有3中方法:local、bean和parent。前面的例子中应用了“local”方法指定,其实也可以应用其他两种方法,例如上例的配置文件若应用“bean”可以修改为:,14.2.5Bean的依赖关系,还可以直接应用property中的ref属性,例如上例可以修改为:,14.2.6Bean的自动装配,1byName模式使用byName模式在Bean的初始化时会通过Bean的属性名字进行自动装配,在Spring的配置文件中,查找一个与将要装配的属性同样名字的Bean。例如,DateClass.java为:packageorg.model;importjava.util.Date;publicclassDateClassprivateDatedate;publicDategetDate()returndate;publicvoidsetDate(Datedate)this.date=date;,14.2.6Bean的自动装配,配置文件config.xml中可以用“byName”自动装配模式来为属性“date”自动装配值,配置文件可以配置为:,14.2.6Bean的自动装配,可以发现,在“getDate”Bean中没有为属性指定值,但指定了“autowire=byName”。编辑测试类Test.java:packageorg.test;importorg.model.DateClass;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassTestpublicstaticvoidmain(Stringargs)ApplicationContextac=newFileSystemXmlApplicationContext(/WebRoot/WEB-INF/classes/config.xml);DateClassdc=(DateClass)ac.getBean(getDate);System.out.println(dc.getDate();运行后查看结果,输出为:WedJul2816:56:40CST2009,14.2.6Bean的自动装配,2使用byType模式byType模式指如果配置文件中正好有一个与属性类型一样的Bean,就自动装配这个属性,如果有多于一个这样的Bean,就抛出一个异常。例如在上例中,DateClass类的属性date为“Date”类型,而在配置文件中也有一个“Date”类型的Bean,这时若配置了自动装配的byType模式,就会自动装配DateClass类中的属性date值。例如,把上例的配置文件稍微修改,其他的不改变:,14.2.6Bean的自动装配,3使用constructor模式constructor模式指的是根据构造方法的参数进行自动装配。例如,把DateClass.java修改为:packageorg.model;importjava.util.Date;publicclassDateClassprivateDatedate;publicDateClass(Datedate)this.date=date;publicDategetDate()returndate;publicvoidsetDate(Datedate)this.date=date;,14.2.6Bean的自动装配,配置文件config.xml修改为:,14.2.6Bean的自动装配,4使用autodetect模式autodetect模式指的是通过检查类的内部来选择使用constructor或byType模式。例如,把使用constructor模式的实例的配置文件修改为:,14.2.6Bean的自动装配,5使用no模式使用no模式就是不使用自动装配,这时为属性赋值就必须通过ref来引用其他Bean。例如,DateClass.java修改为:packageorg.model;importjava.util.Date;publicclassDateClassprivateDatedate;publicDateClass(Datedate)this.date=date;publicDategetDate()returndate;publicvoidsetDate(Datedate)this.date=date;,14.2.6Bean的自动装配,配置文件修改为:,14.3Bean中对集合的注入,14.3.1对list的注入对list集合的注入非常简单,如果类中有list类型的属性,在为其依赖注入值的时候就需要在配置文件中的元素下应用其子元素。下面举例说明。创建类ListBean.java,其有一个List类型的属性,代码如下:packageorg.model;importjava.util.List;publicclassListBeanprivateListlist;publicListgetList()returnlist;publicvoidsetList(Listlist)this.list=list;,14.3.1对list的注入,配置文件中Bean的配置为:javac+php,14.3.1对list的注入,编写测试类,对ListBean类的“list”属性进行输入,测试是否注入成功。packageorg.test;importjava.util.Iterator;importjava.util.List;importorg.model.ListBean;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassTestpublicstaticvoidmain(Stringargs)ApplicationContextac=newFileSystemXmlApplicationContext(/WebRoot/WEB-INF/classes/config.xml);ListBeanlistbean=(ListBean)ac.getBean(listBean);Listl=listbean.getList();System.out.println(l);运行程序,控制台信息为:java,c+,php,14.3.2对Set的注入,创建类SetBean.java,代码编写为:packageorg.model;importjava.util.Set;publicclassSetBeanprivateSetset;publicSetgetSet()returnset;publicvoidsetSet(Setset)this.set=set;,14.3.2对Set的注入,配置文件config.xml编写为:javac+php,14.3.2对Set的注入,编写测试类,代码如下:packagetest;importorg.model.SetBean;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassTestpublicstaticvoidmain(Stringargs)ApplicationContextac=newFileSystemXmlApplicationContext(/WebRoot/WEB-INF/classes/config.xml);SetBeansetbean=(SetBean)ac.getBean(setbean);System.out.println(setbean.getSet();运行程序,输出结果为:java,c+,php,14.3.3对Map的注入,创建类MapBean.java,代码编写为:packageorg.model;importjava.util.Map;publicclassMapBeanprivateMapmap;publicMapgetMap()returnmap;publicvoidsetMap(Mapmap)this.map=map;,14.3.3对Map的注入,配置文件config.xml文件配置为:JavaEE实用教程c+实用教程PHP实用教程,14.3.3对Map的注入,编写测试类:packageorg.test;importjava.util.Map;importorg.model.MapBean;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassTestpublicstaticvoidmain(Stringargs)ApplicationContextac=newFileSystemXmlApplicationContext(/WebRoot/WEB-INF/classes/config.xml);MapBeanmapbean=(MapBean)ac.getBean(mapbean);Mapmap=mapbean.getMap();System.out.println(map);运行程序,控制台输出结果为:java=JavaEE实用教程,c+=c+实用教程,php=PHP实用教程,14.4两种后处理器,14.4.1Bean后处理器下面举例说明Bean后处理器的应用。建立项目,添加Spring核心类库后,在src下建立包“org.beanpost”,在该包下建立类MyBeanPost.java,代码编写如下:packageorg.beanpost;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.config.BeanPostProcessor;publicclassMyBeanPostimplementsBeanPostProcessorpublicObjectpostProcessAfterInitialization(Objectbean,Stringbeanname)throwsBeansExceptionSystem.out.println(Bean后处理器在初始化之前对+beanname+进行处理);returnbean;publicObjectpostProcessBeforeInitialization(Objectbean,Stringbeanname)throwsBeansExceptionSystem.out.println(Bean后处理在初始化之后对+beanname+进行处理);returnbean;,14.4.1Bean后处理器,编写HelloWorld.java类,代码如下:packageorg.model;/该类放在org.model包中publicclassHelloWorldprivateStringmessage;publicStringgetMessage()returnmessage;publicvoidsetMessage(Stringmessage)this.message=message;/该方法会在初始化过程中被执行publicvoidinit()System.out.println(该句在Bean初始化过程中执行);,14.4.1Bean后处理器,编写配置文件config.xml文件:HelloWorld!,14.4.1Bean后处理器,编写测试类,完成Bean的实例化,代码如下:packageorg.test;importorg.model.HelloWorld;importorg.springframework.context.ApplicationContext;importorg.spri

温馨提示

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

评论

0/150

提交评论