Spring3开发实战 之 第二章:IoC/DI开发(2)(二)

2014-11-24 08:36:51 · 作者: · 浏览: 1
rg.springframework.web.context.request.RequestContextListener


request作用域说明
等同于Http的Request
session作用域说明
针对某个HTTP Session,Spring容器会根据bean定义创建一个全新的bean实例,且该bean仅在当前HTTP Session内有效。与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉
global session
等同于标准的HTTP Session
问题:比如在调用一个singleton类型bean A的某个方法时,需要引用另一个非singleton(prototype)类型的bean B,对于bean A来说,容器只会创建一次,这样就没法在需要的时候每次让容器为bean A提供一个新的的bean B实例
解决方案:Lookup方法注入,示例如下:

java代码:
[java]
Java类
public abstract class HelloImpl implements HelloApi{
private T2 t2;
public String helloSpring3(int a){
getT2().t1();
System.out.println("hello Spring3==="+a);
return "Ok,a="+a;
}
public abstract T2 getT2();
}
public class T2 {
public void t1(){
System.out.println("now in t1");
}
}
配置文件:

java代码:
[java]





Lookup方法注入的内部机制是Spring利用了CGLIB库在运行时生成二进制代码功能,通过动态创建Lookup方法bean的子类而达到复写Lookup方法的目的
初始化回调
有两种方法,如下:
1:实现org.springframework.beans.factory.InitializingBean接口,这种方法不被推荐,因为这样和Spring耦合起来了。可以采用声明式的方法,如下:
2:在Bean定义中指定一个普通的初始化方法,即在XML配置文件中通过指定init-method属性来完成,配置如下:

析构回调
也有两种方法,如下:
1:实现org.springframework.beans.factory.DisposableBean接口,这种方法不被推荐,因为这样和Spring耦合起来了。可以采用声明式的方法,如下:

缺省的初始化和析构方法
配置在beans上,这样就不用每个Bean都配了,如下:

context包的核心是ApplicationContext接口。它由BeanFactory接口派生而来,除了提供了BeanFactory所有的功能,还提供了以下的功能:
1:MessageSource, 提供国际化的消息访问
2:资源访问,如URL和文件
3:事件传播,实现了ApplicationListener接口的bean
4:载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
利用MessageSource实现国际化
1:在配置文件中添加

java代码:
[java]



format
exceptions



2:说明:上述配置是表示在classpath下有两个标准的properties文件。文件格式是标准的properties格式,Spring通过ResourceBundle,使用JDK中解析消息的标准方式,来处理任何解析消息的请求。
3:测试代码:
String msg = context.getMessage("testmsg", null, "Default", Locale.CHINA);
前面getmessage方法的第二个参数是用来从程序中向消息里面传值的,如下:

java代码:
[java]
消息文件:testmsg=this is a test,{0},{1}
Java类:String msg = context.getMessage("testmsg",
ew Object[]{"M1","M2"},"Default", Locale.CHINA);
System.out.println("msg="+msg);
前面getmessage方法的第四个参数是用来指定Locale的
对于国际化(i18n),Spring中不同的MessageResource实现与JDK标准ResourceBundle中的locale解析规则一样。比如在上面例子中定义的messageSource bean,如果你想解析British (en-GB) locale的消息,那么需要创建format_en_GB.properties的资源文件;中国的如msg_zh_CN.properties。Locale解析通常由应用程序根据运行环境来指定。
也可以把MessageSource当作资源注入到Bean中,Java类示例如下:

java代码:
[java]
public class HelloImpl implements HelloApi{
private MessageSource ms = null;
public void setMs(MessageSource ms){
this.ms = ms;
}
public String helloSpring3(int a){
String msg = this.ms.getMessage("testmsg", null, "Default", Locale.CHINA);
System.out.println("hello Spring3==="+msg);
return "Ok,a="+a;
}
}
配置文件示例如下:

java代码:
[java]



事件传播
ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口来提供的。如果在上下文中部署一个实现了ApplicationListener接口的bean,那么每当一个ApplicationEvent发布到ApplicationContext时,这个bean就得到通知。
Spring提供了三个标准事件,如下:
ContextRefreshedEvent
当ApplicationContext初始化或刷新时发送的事件。这里的初始化意味着:所有的bean被装载,singleton被预实例化,以及ApplicationContext已就绪可用
ContextClosedEvent
当使用ApplicationContext的close()方法结束上下文时发送的事件。这里的结束意味着:singleton bean 被销毁
RequestHandledEvent
一个与web相关的事件,告诉所有的bean一个HTTP请求已经被响应了(也就是在一个请求结束后会发送该事件)。注意,只有在Spring中使用了