Spring笔记——2.使用Spring容器

Spring有连个核心接口:BeanFactory和ApplicationContext。而ApplicationContext是BeanFactory的子接口,都可以代表Spring容器,用于产生管理Bean们。我们经常使用ApplicationContext以及它的实现类ClassPathXmlApplicationContext。当创建ApplicationContext时,会实例化所有的单例Bean,花销较大,但之后性能较好。如果为bean设置lazy-init为true,则不会在开始初始化。

国际化支持

ApplicationContext集成了MessageSource接口,具有国际化功能。当程序创建ApplicationContext容器时,架构会去找messageSource这个Bean,然后接口中的getMessage(String code,Object[] args, Locale loc)与getMessage(String code, Object[] args, String default, Local loc)就会被交给messageSource这个bean使用。如果没找到,则会穿件一个StaticMessageSource,由它调用两个方法。其中第二个参数的对象组是为了填补国际化文件中的{0}、{1}这些的。

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>包名/资源文件组1</value>
<value>包名1/包名2/资源文件组2</value>
</list>
</property>
</bean>

使用方法:

String hello=act.getMessage("hello", new String[] {"A"}, Locale.getDefault());


ApplicationContext的事件机制

通过ApplicationEvent(必须由ApplicationContext发布)和ApplicationListener(容器中任意的bean承担)接口可以实现ApplicationContext的事件处理。如果容器中有一个ApplicationListener Bean,每当ApplicaitonContext发布ApplicationEvent,ApplicationLIstener Bean将会自动被触发。我们都知道事件机制需要事件源,事件和监听器。事件源此处是ApplicationContext,必须由java程序显式触发。

事件如下,必须继承ApplicationEvent父类

package com.cm.event;
import org.springframework.context.ApplicationEvent;
public class EmailEvent extends ApplicationEvent {
	private String address;
	private String text;
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	public EmailEvent(Object source,String address,String text) {

		super(source);
this.address=address;
this.text=text;

		// TODO Auto-generated constructor stub
	}
	public EmailEvent(Object source) {

		super(source);
		// TODO Auto-generated constructor stub
	}
}

监听器如下,需要实现ApplicationListener接口:

public class EmailNotifier implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent arg0) {
	// TODO Auto-generated method stub
	if(arg0 instanceof EmailEvent){
		EmailEvent emailEvent=(EmailEvent)arg0;
		System.out.println("需要发送邮件的接收地址"+emailEvent.getAddress());
		System.out.println("需要发送邮件的征文"+emailEvent.getText());
	}else{
		System.out.println("other!!!!!!!!!!!"+arg0);
	}}
}

注意我们在xml中配置的只有监听器,而事件是显式触发的(当然有些时候也需要配置,不过本例中我们还是使用了new,因为没有用到依赖关系)

<bean class="com.cm.event.EmailNotifier">


显式触发事件

ApplicationContext act=new ClassPathXmlApplicationContext("beans.xml");
EmailEvent ele=new EmailEvent("test","[email protected]","my email");
act.publishEvent(ele);

总结如下:当程序发布了一个事件(内置事件不需要手动发布,会自动监听),xml中的所有监听器就会自动被启动,并执行相应程序。

让Bean获取Spring容器

之前的例子中我们都是先new一个ApplicationContext实例,然后通过实例操作。这种情况下,程序中总是持有Spring容器的引用。Web应用中,Spring容器通常采用声明方式配置产生。开发者需要在web.xml中设一个listener,它会负责初始化容器,前段mvc框架可以直接调用bean,无需通过容器。但是有的时候,bean需要实现某个功能比如国际化(这个bean中需要使用ctx,使用的是容器实例的getMessage方法),而他们必须借助容器才能完成,因此还是要先得到容器,再实现功能。

为了能让某一个bean得到他的爸爸:容器,可以让这个bean实现BeanFactoryAware接口,它里面youyigesetBeanFactory方法,它的参数就是指向创建它的容器。这个set方法是由Spring调用的。

public class Aperson implements ApplicationContextAware {
private ApplicationContext ctx;
	@Override
	public void setApplicationContext(ApplicationContext arg0)
			throws BeansException {
		// TODO Auto-generated method stub
this.ctx=arg0;
	}
public void sayHi(String name){
	System.out.println(ctx.getMessage(arg0, arg1));
}
}

架构会扫面所有的bean看哪个有接口ApplicationCAware,然后使用set方法传入容器实例。此bean的测试程序省略。。。测试中调用了sayHi方法,而这个方法自己没法完成功能,需要ctx的getMessage,因此它得想法得到实例。那就实现一个接口吧,Srping会为这个接口的set方法传入一个容器实例,将传入值赋给自己的成员变量吧!

时间: 2024-08-05 12:19:23

Spring笔记——2.使用Spring容器的相关文章

Spring笔记——5.深入理解容器中的Bean

Spring框架的绝大部分工作是对bean的管理,包括管理bean的生命周期.使用bean继承功能. 抽象bean与子bean 为了防止太多十分类似的bean出现在xml中,我们使用抽象bean把共同的信息提取出来,使用abstract属性标记为true.它不能被实例化,意义只是被继承,是个模板.子bean可以继承抽象bean的实现类,构造器参数,属性配置信息.子bean可增加新的信息也可覆盖父bean.子bean通过parent属性指定父bean的名字.与java继承相比,bean继承的bea

Spring:笔记整理(2)——IOC容器

IOC容器 什么是IOC IOC ,全称Inversion of control,即,控制反转,是一种设计思想. 控制: 在Java中,IOC意味着:你将设计好的对象交给容器控制,而不是传统的在你的对象内容直接控制. 在传统程序设计中,我们直接在对象内容通过new创建对象.而IOC是有一个专门的容器来创建这些对象,即由IOC来控制对象的创建. 反转: 容器帮助我们查找及注入依赖对象,对象只是被动的接受依赖对象. 图示: 当有了IOC/DI容器后,我们就不用在客户端中主动创建这些对象了:

SSH框架搭建 笔记 (含spring注解驱动)

分类: web 开发2014-04-27 12:33 354人阅读 评论(0) 收藏 举报 框架springinterface注解 好久没有搭建框架了,今天整理下以前的知识,整合下SSH,没想到手生了,一时半会各种异常出来,经过一番挣扎后,终于搞出来了雏形, 下面是我做整合框架的笔记,如果大家开发过程中又遇到的情况,可以参考下 首先是包的结构,(命名不算正规哈~,临时写的仓促了点) 框架是基于JAR包的基础上构建的,所以必须必备的jar包必须先下好, 如图: 没有的可以在本文源代码里下: 搭建框

Spring笔记(4)-----&lt;bean&gt;的基本配置

Spring容器成功需要具备的三个条件: 1)Spring框架的类包都已经放在应用程序的类路径下. 2)应用程序为Spring提供了完备的Bean配置信息. 3)Bean的类都已经放在类路径下. Spring启动时读取应用程序的Bean配置信息,在容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean的依赖关系,为上层应用提供准备就绪的运行环境. Bean的配置信息是Bean的元数据信息,有4部分: 1)Bean的实现类. 2)Bean的属性信息. 3)Bean

【Spring学习笔记-MVC-14】Spring MVC对静态资源的访问

作者:ssslinppp       参考链接: http://www.cnblogs.com/luxh/archive/2013/03/14/2959207.html http://www.cnblogs.com/fangqi/archive/2012/10/28/2743108.html 优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往使用

Spring.net(二)----初探IOC容器

我在上一篇关于Spring.net的文章“Spring.NET框架简介及模块说明 ”中很详细的介绍了,本文就不旧话从提.我门就直奔主题吧. 1.首先了解两个接口.  IObjectFactory接口和IApplicationContext接口:他两个称为“容器”或“IOC容器”. Spring.net框架的核心原则是非侵入性.  IObjectFactory接口是初始化.配置及管理对象的实际容器.  IObjectFactory全限定名为Spring.Objects.Factory.IObjec

spring笔记(三)

Spring 第二天: 1. 代理模式 2. Aop编程 3.Spring对Jdbc的支持 JdbcTemplate工具类 思考: 程序的"事务控制", 可以用aop实现! 即只需要写一次,运行时候动态织入到业务方法上. Spring提供了对事务的管理,开发者只需要按照Spring的方式去做就行. 目标: 1. Spring声明式事务管理 * XML配置 *注解方式 2. Spring与Hibernate整合 3.  SSH整合 1. 程序中事务控制 1.1 环境准备 用户访问->

[MVC学习笔记]3.使用Spring.Net应用IOC(依赖倒置)

到现在,我们已经基本搭建起了项目的框架,但是项目中还存在一个问题,就是尽管层与层之间使用了接口进行隔离,但实例化接口的时候,还是引入了接口实现类的依赖,如下面的代码: private IUserService _userService; private IUserService UserService { get { return _userService ?? (_userService = new UserService()); } set { _userService = value; }

《Spring学习笔记》:Spring、Hibernate、struts2的整合(以例子来慢慢讲解,篇幅较长)

<Spring学习笔记>:Spring.Hibernate.struts2的整合(以例子来慢慢讲解,篇幅较长) 最近在看马士兵老师的关于Spring方面的视频,讲解的挺好的,到了Spring.Hibernate.struts2整合这里,由于是以例子的形式来对Spring+Hibernate+struts2这3大框架进行整合,因此,自己还跟着写代码的过程中,发现还是遇到了很多问题,因此,就记录下. 特此说明:本篇博文完全参考于马士兵老师的<Spring视频教程>. 本篇博文均以如下这