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

下载本文档

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

文档简介

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

温馨提示

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

评论

0/150

提交评论