Spring基础(5)——装配Bean之Bean容器1——Bean工厂

Spring提供了两种不同的Bean容器,第一种是Bean工厂,由beanFactory接口定义,是最简单的容器,提供基础的依赖注入支持;第二种是应用上下文,由ApplicationContext接口定义,建立在bean工厂之上,提供系统框架服务。所谓装配Bean,是指告诉Spring容器需要哪些Bean以及容器如何使用以来注入将他们组合在一起。

一、Bean容器

SpringIOC设计的核心是Bean容器,主要是实现是指Beans包,设计目标是与JavaBean一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的低层中介。其中一个最高级的抽象是BeanFactory接口,她是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory也可以管理对象之间的关系。

1、bean工厂

BeanFactory是一个类工厂,但和传统的类工厂不同,传统的类工厂只生成一个类的对象或几个实现某一个相同接口类的对象。而BeanFactory是一个通用的工厂,可以创建和管理各种类的对象,这些可以被创建和管理的对象本身没有什么特别之处,在Spring中称这些被创建和管理的java对象为Bean。

JavaBean必须满足一定的规范,如必须提供一个默认不带参数的构造方法,不依赖于某一个特定的容器等,但是Spring中的Bean比JavaBean更加宽泛一些,不需要额外服务支持的POJO(Plain Ordinary Java Object 简单的Java对象)都可以成为Bean。

BeanFactory是实例化、配置和管理众多Bean的容器。因为这些Bean需要彼此关联,因此它们之间就有了依赖关系。BeanFactory使用的配置数据可以反映这些依赖关系。

BeanFactory接口的继承关系:

盗用了一张网上的图类描述他们的关系

BeanFactory的主要方法是getBean(String beanName),用来从容器中返回特定名称的Bean,BeanFactory的功能通过其他的接口得到不断的扩展。

ListableBeanFactory:该接口定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数,获取某一类型Bean配置名、查看容器中是否包括某一Bean等方法;

HierarchicalBeanFactory:父子级联IOC容器的接口,子容器可以通过接口方法访问父容器;

ConfigurableBeanFactory:一个重要的接口,增强了IOC容器的可定制性,他定义了设置类装载器、属性编辑器以及容器初始化后置处理器等方法;

AutowireCapableBeanFactory:定义了将容器中的Bean按某种规则(如名称和类型匹配等)进行自动装配的方法;

SingletonBeanRegistry:定义了允许在运行期间向容器注册单实例Bean的方法;

BeanDefinitionRegistry:Spring配置文件中的每一个bean节点元素在Spring容器里都通过一个BeanDefinition对象标识,它描述了Bean的配置信息,而BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法。

虽然大多数情况下,被BeanFactory管理的用户代码都不需要知道BeanFactory,但是BeanFactory还是提供了三种实例化:

①从文件系统资源实例化BeanFactory

该方式配置文件bean.xml的位置可以不固定,例如beans.xml放在工程项目的根目录下。

String resPath = "beans.xml";
Resource res = new FileSystemResource(resPath);
BeanFactory factory = new XmlBeanFactory(res);

String resPath = "src\\beans.xml"文件路径为项目下的src文件夹下

String resPath = "E:\\beans.xml"文件路径为e盘的根目录下

②从classpath下的资源实例化beanFactory

使用这种方式,配置文件的位置相对固定一些

String resPath = "beans.xml";//classpath的根目录下
//String resPath = "acc\\beans.xml";//classpath下的acc目录下.
Resouce res = new ClassPathResource(resPath);
BeanFactory factory = new XMLBeanFactory(res);

③使用ApplicationContext从classpath下的xml文件实例化BeanFactory

这种方式与第二种方式基本相同,bean.xml放在项目的classpath目录下

ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
BeanFactory factory = (BeanFactory) appContext;//直接生成类工厂的实例

初始化BeanFactory并得到一个Bean实例:

public class Test {
    public static void main(String[] args) {
        Resource res = new ClassPathResource("beans.xml");
        BeanFactory factory = new XmlBeanFactory(res);
        Cat cat = (Cat) factory.getBean("cat");
        cat.eatFood();
    }

-------------------------------------------------------------------------

JDK提供的访问资源的类不能很好的满足各种底层资源的访问需求,例如缺少类路径或者web容器的上下文中获取资源的操作类。Spring设计了一个Resouce接口,位于org.springframework.core.io包中,微应用提供了更强大的访问底层资源的能力。

1)Resource接口

2)AbstractResource

3)ByteArrayResource、InputStreamResource、ClassPathResource、PortletContextResource、DescriptiveResource、ServletContextResource、FileSystemResource、UrlResource;

ByteArrayResource:二进制数组表示的资源,可以再内存中通过程序构建

ClassPathResource:类路径下的资源,资源以相对于类路径的方式表示

FileSystemResource:文件系统资源,资源以文件系统路径的方式表示

InputStreamResource:以输入流返回表示的资源

ServletContextResource:为访问web容器上下文中的资源而设计的类,负责从web应用根目录中加载资源,支持以流和URL的方式访问,在war解包的情况下,也可以通过file的方式访问,该类还可以从jar包中访问资源

UrlResource:封装了java.net.URL,使用户能够访问任何可以通过url标识的资源,如文件系统资源、http资源和ftp资源等。

有了这些资源类后,就可以将Spring配置信息储存在任何地方,例如数据库和LDAP(LightWeight Directory Access Protocol,轻量级目录访问协议)中,只要最终可以通过resource接口放回配置信息就可以。

Spring的resource接口及其实现类可以在脱离Spring框架的情况下使用,比通过JDK访问资源的Api更好,更强大

猜你喜欢

转载自blog.csdn.net/heye644171300/article/details/80671163