Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口。他们都可代表Spring容器,Spring容器是生成Bean实例的工厂,并且管理容器中的Bean。

Bean是Spring管理的基本单位,在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源、Hibernate的SessionFactory、事务管理器等。在Spring中,Bean的是一个非常广义的概念,任何的Java对象、Java组件都被当成Bean处理。

而且应用中的所有组件,都处于Spring的管理下,都被Spring以Bean的方式管理,Spring负责创建Bean实例,并管理他们的生命周期。Bean在Spring容器中运行,无须感受Spring容器的存在,一样可以接受Spring的依赖注入,包括Bean属性的注入,协作者的注入、依赖关系的注入等。

Spring容器负责创建Bean实例,所以需要知道每个Bean的实现类,Java程序面向接口编程,无须关心Bean实例的实现类;但是Spring容器必须能够精确知道每个Bean实例的实现类,因此Spring配置文件必须精确配置Bean实例的实现类。

一、Spring容器

Spring容器最基本的接口就是BeanFactor。BeanFactory负责配置、创建、管理Bean,他有一个子接口:ApplicationContext,因此也称之为Spring上下文。Spring容器负责管理Bean与Bean之间的依赖关系。

BeanFactory接口包含以下几个基本方法:

Ø Boolean containBean(String name):判断Spring容器是否包含id为name的Bean实例。

Ø <T> getBean(Class<T> requiredTypr):获取Spring容器中属于requiredType类型的唯一的Bean实例。

Ø Object getBean(String name):返回Sprin容器中id为name的Bean实例。

Ø <T> T getBean(String name,Class requiredType):返回容器中id为name,并且类型为requiredType的Bean

Ø Class <?> getType(String name):返回容器中指定Bean实例的类型。

调用者只需使用getBean()方法即可获得指定Bean的引用,无须关心Bean的实例化过程。即Bean实例的创建过程完全透明。

在使用BeanFactory接口时,我们一般都是使用这个实现类:org.springframework.beans.factory.xml.XmlBeanFactory。然而ApplicationContext作为BeanFactory的子接口,使用它作为Spring容器会更加方便。它的实现类有:FileSystemXmlApplicationContext、ClassPathXmlApplicationContext、AnnotationConfigApplicationContext。

创建Spring容器实例时,必须提供Spring容器管理的Bean的详细配置信息。Spring的配置信息通常采用xml配置文件来设置,因此,创建BeanFactory实例时,应该提供XML配置文件作为参数。

XML配置文件通常使用Resource对象传入。Resource接口是Spring提供的资源访问接口,通过使用该接口,Spring能够以简单、透明的方式访问磁盘、类路径以及网络上的资源。

对于Java EE应用而言,可在启动Web应用时自动加载ApplicationContext实例,接受Spring管理的Bean无须知道ApplicationContext的存在。一般使用如下方式实例化BeanFactory

                //搜索当前文件路径下的bean.xml文件创建Resource对象InputStreamSource isr = new FileSystemResource("bean.xml");//以Resource对象作为参数创建BeanFactory实例XmlBeanFactory factory = new XmlBeanFactory((Resource) isr);

     ClassPathResource res = new ClassPathResource("bean.xml");//以Resource对象作为参数创建BeanFactory实例XmlBeanFactory factory = new XmlBeanFactory(res);

但是如果应用里面有多个属性配置文件,则应该采用BeanFactory的子接口ApplicationContext来创建BeanFactory的实例。ApplicationContext通常使用如下两个实现类:

FileSystemXmlApplicationContext:以基于文件系统的XML配置文件创建ApplicationContext实例。

ClassPathXmlApplicationContext:以类加载路径下的XML配置文件创建的ApplicationContext实例。

如果需要同时加载多个XML配置文件,采用如下方式:

     //搜索CLASSPATH路径,以classpath路径下的bean.xml、service.xml文件创建applicationContextApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"bean.xml","service.xml"});//以指定路径下的bean.xml、service.xml文件创建applicationContextApplicationContext ctx1 = new FileSystemXmlApplicationContext(new String[]{"bean.xml","service.xml"});

二、让Bean获取Spring容器

在前面简单的介绍了Spring容器。在Spring中我们可以使用Spring容器中getBean()方法来获取Spring容器中的Bean实例。在这样的访问模式下,程序中总是持有Spring容器的引用。但是在实际的应用中,Spring容器通常是采用声明式方式配置产生:记开发者只要在web.xml文件中配置一个Listener,该Listener将会负责初始化Spring容器。在这种情况下,容器中Bean处于容器管理下,无须主动访问容器,只需要接受容器的注入管理即可。同时Bean实例的依赖关系通常也是由容器冬天注入,无须Bean实例主动请求。

在这种情况下,Sprig容器中Bean通常不会需要访问容器中其他的Bean—采用依赖注入,让Spring把被依赖的Bean注入到依赖的Bean中即可。

实现BeanFactoryAware接口的Bean,拥有访问的BeanFactory容器的能力,实现BeanFactoryAware接口的Bean实例将会拥有对容器的访问能力。BeanFactoryAware接口仅有如下一个方法:

SetBeanFactory(BeanFactory beanFactory):该方法有一个参数beanFactory,该参数指向创建它的BeanFactory。

该方法将由Spring调动,当Spring调用该方法时会将Spring容器作为参数传入该方法。

public class Chinese implements ApplicationContextAware{//将BeanFactory容器以成员变量保存private ApplicationContext ctx;/*** 实现ApplicationContextAware接口实现的方法*/public void setApplicationContext(ApplicationContext cyx)throws BeansException {this.ctx = ctx;}//获取ApplicationContext的测试方法public ApplicationContext getContext(){return ctx;}}

上面的Chinese类实现了ApplicationContext接口,并实现了该接口提供的setApplicationContextAware()方法,这就使得该Bean实例可以直接访问到创建她的Spring容器。

将该Bean部署在Spring容器中。

测试类:

该程序先通过实例化的方法来获取ApplicationContext,然后通过chinese Bean来获得BeanFactory,并将两者进行比较。

public class ChineseTest {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");Chinese c = ctx.getBean("chinese",Chinese.class);System.out.println(c.getContext());System.out.println(c.getContext()==ctx);}
}

结果如下:

true

上面的代码虽然实现了ApplicationContextAware接口让Bean拥有了访问容器的能力,但是污染了代码,导致代码与Spring接口耦合在一起。所以,如果不是特别需要,一般不建议直接访问容器。

读李刚《轻量级Java EE企业应用实战》

Spring 读书笔记-----使用Spring容器(一)相关推荐

  1. Spring读书笔记-----使用Spring容器(二)

    一.使用ApplicationContext 前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFa ...

  2. Spring读书笔记——bean创建(下)

    有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...

  3. (转) Spring读书笔记-----Spring的Bean之配置依赖

    前一篇博客介绍了Spring中的Bean的基本概念和作用域(Spring读书笔记-----Spring的Bean之Bean的基本概念 ),现在介绍Spring Bean的基本配置. 从开始我们知道Ja ...

  4. 读书笔记《Spring Boot+Vue全栈开发实战》(下)

    本书将带你全面了解Spring Boot基础与实践,带领读者一步步进入 Spring Boot 的世界. 前言 第九章 Spring Boot缓存 第十章 Spring Boot安全管理 第十一章 S ...

  5. (转)Spring读书笔记-----Spring的Bean之Bean的基本概念

    从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...

  6. 读书笔记《Spring Boot实战 —— Java EE 开发的颠覆者》

    Spring框架是轻量级的企业级开发一站式解决方案 Spring使用简单的POJO Plain Old Java Object 无限制的普通Java对象 Spring Framework Runtim ...

  7. Spring读书笔记-----Spring的Bean之Bean的基本概念

    从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...

  8. Spring学习笔记 之 Spring<全>

    开始学习Spring全家桶 文章目录 1. IoC 定义 为什么叫控制反转? 实现 IoC 容器创建 bean 的两种⽅式 IoC DI 特殊字符的处理 Spring 中的bean创建类型 -- sc ...

  9. spring学习笔记(spring概述和IOC)

    spring5 1.spring的概述 1.1.spring是什么 Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的. Spring 的 ...

最新文章

  1. IDEA下spring boot项目打包war包部署外部tomcat问题
  2. ubuntu linux下解决“no java virtual machine was found after searching the following locations:”的方法
  3. TZOJ 2569 Wooden Fence(凸包求周长)
  4. wangeditor html编辑,Vue整合wangEditor富文本编辑器
  5. 数据结构——线性表的C语言实现
  6. 2014 年度 Git@OSC 最热门的 50 个项目
  7. Struts2 整合jQuery实现Ajax功能
  8. C语言TCP客户端获取时间
  9. 无人机在高楼区做倾斜摄影的地籍建模项目报告
  10. 【matlab 基础篇 01】快速开始第一个程序(详细图文+文末资源)
  11. WIN7 32/64位安装SQL Server 2005详细步骤(图文)
  12. 好用的待办事项APP有哪些
  13. Google CardBoard SDK for Unity集成指南
  14. zabbix lld使用trapper方式(zabbix_sender)
  15. 信息设计软件+信息图表设计软件介绍
  16. java 万年历接口_接口详细介绍-万年历查询
  17. 农业银行取消短信提醒 消息服务步骤
  18. 黑客攻防技术宝典-Web实战篇——第二章、核心防御机制(一)
  19. 在线预览PDF文件功能实现
  20. 【Vue前端开发学习】第2章,Vue项目目录结构

热门文章

  1. 人脸识别 开放书籍 下载地址
  2. 车载电台天线按装示意图
  3. 电容老化失效测试解决方案
  4. MKS Robin E3D V1.1主板使用说明书
  5. 【现代机器人学】学习笔记三:前向运动学(Forward Kinematics)
  6. 华为8817升级Android5,华为c8817e官方系统升级更新教程(固件rom升级)
  7. GPU并行计算基础知识科普
  8. 短视频账号推广模板 个性时尚INS风个人账号推广宣传pr模板
  9. position:fixed;滚动条
  10. 【博学谷学习记录】超强总结,用心分享 | 狂野大数据HDFS的Archive机制~个人学习复习记录~PART-04