精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-13
最后修改:2010-03-13
context的核心作用是ApplicationContext接口,这是由BeanFactory接口派生而来。同时,context还提供了以下的功能:
1.MessageSource
当一个 Spring目前提供了两个
<beans> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>format</value> <value>exceptions</value> <value>windows</value> </list> </property> </bean> </beans>
这段配置文件告诉我们资源文件加载的方式,它可以从format.properties,exceptions.properties,windows.properties三个文件里分别加载我们需要的资源,且它们是按配置文件夹的顺序加载的。 我们可以分别往三个文件里加 # in 'format.properties' message=Alligators rock format! # in 'exceptions.properties' argument.required=The {0} argument is required.
... ... 测试代码如下: public static void main(String[] args) { MessageSource resources = new ClassPathXmlApplicationContext("beans.xml"); String message = resources.getMessage("message", null, "Default", null); System.out.println(message); } 打印的结果就是: Alligators rock format!
对于第二个参数可以用如下方法测试:
MessageSource resources = new ClassPathXmlApplicationContext("bean.xml"); String message = resources.getMessage("argument.required", new Object [] {"userDao"}, "Required", Locale.UK); System.out.println(message);
2.资源访问 如: Resource rs = ctx.getResource("classpath:config.properties"); File file = rs.getFile();
可以直接访问资源文件
3.事件传播
ApplicationContext基于观察者模式提供了对Bean的事件传播功能,通过Application.publicEvent访问方法,可以将事件通知系统内所有的ApplicationListener
事件传播的一个典型应用是,当Bean中的操作发生异常(如数据库连接失败),则通过事件传播
ApplicationListener是由在配置文件中配置我们感兴趣的监听,如这里我们配置两个监听ActionListener1和ActionListener1它们的配置文件为: <bean id="action" class="org.spring.LoginAction" /> //登录动作 <bean id="listener1" class="org.spring.ActionListener1" /> <bean id="listener2" class="org.spring.ActionListener2" />
类为: public class ActionListener1 implements ApplicationListener { public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ActionEvent) { System.out.println("ActionListener1:"+event.toString()); } } } public class ActionListener2 implements ApplicationListener { public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ActionEvent) { System.out.println("ActionListener2:"+event.toString()); } } }
定义登录事件ActionEvent: public class ActionEvent extends ApplicationEvent { public ActionEvent(Object source) { super("actionEvent "+source); } } 而登录动作的具体实现它要实现接口 ApplicationContextAware
public class LoginAction implements ApplicationContextAware { private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public int login(String username, String password) { ActionEvent event = new ActionEvent(username); this.applicationContext.publishEvent(event); return 0; } public static void main(String[] args) { ApplicationContext ctx=new FileSystemXmlApplicationContext("WebRoot/WEB-INF/bean.xml"); LoginAction action = (LoginAction)ctx.getBean("action"); action.login("hell","hell"); } }
结果当我们login时,就会通过acclicationContext来通知当前有的监听,使所有监听者知道一下。到于监听者对于这个登录事件是否感兴趣,那是他们自个的事了。。。
4.多个上下文: 以下摘自(夏昕) 上面的示例中,ApplicationContext均通过编码加载。对于Web应用,Spring提供了可配置的
配置非常简单,在web.xml中增加:
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
或者 <servlet> <servlet-name>context</servlet-name> <servlet-class> org.springframework.web.context.ContextLoaderServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> 通过以上配置,Web容器会自动加载/WEB-INF/applicationContext.xml初始化 <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/myApplicationContext.xml</param-value> </context-param> 配置完成之后可通过 WebApplicationContextUtils.getWebApplicationContext
参考文档: 夏昕 spring开发指南 spring framework 开发参考手册 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 4331 次