BeanFactory 和 ApplicationContext

原文:BeanFactory 和 ApplicationContext

  Spring通过一个配置文件描述Bean及Bean直接的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。Sprig的IoC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。

    Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制。BeanFactory使管理不同类型的Java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供了更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建实际应用。我们一般称BeanFactory为IoC容器,而称 ApplicationContext为应用上下文。但有时为了行文方便,我们也将ApplicationContext称为Spring容器。

    BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext而非底层的BeanFactory。

 

1、初始化BeanFactory

beans.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="car" class="com.reflect.Car"
          p:brand="迈锐宝"
          p:color="黑色"
          p:maxSpeed="300"/>
</beans>

 

BeanFactoryTest:

package com.beanfactory;
import com.reflect.Car;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import java.io.IOException;
/**
 * Created by gao on 16-3-18.
 */
public class BeanFactoryTest {
    public static void main(String[] args) throws IOException {
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource res = resolver.getResource("classpath:beans.xml");
        BeanFactory bf = new XmlBeanFactory(res);
        System.out.println("init BeanFactory.");
        Car car = bf.getBean("car", Car.class);
        System.out.println("car bean is ready for use!");
    }
}

 

在初始化BeanFactory时,必须为其提供一种日志框架,我们使用Log4J,即在类路径下提供Log4J配置文件,这样启动Spring容器才不会报错。

log4j.properties

log4j.rootLogger=INFO,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n

测试输出:

2016-03-18 17:19:27,045  INFO [main] (XmlBeanDefinitionReader.java:315) - Loading XML bean definitions from class path resource [beans.xml]

init BeanFactory.

car bean is ready for use!

 

 

2、ApplicationContext

    ApplicationContext使用ClassPathXmlApplicationContext和FileSystemXMLApplicationContext,前者默认从类路径下加载配置文件,后者默认从文件系统中装载配置文件。在获取ApplicationContext实例后,就可以像BeanFactory一样调用getBean(beanName)返回Bean了。BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean;而ApplicationContext则在初始化应用上下文时就实例化所以单实例的Bean。

Beans:

package com.context;
import com.reflect.Car;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
/**
 * Created by gao on 16-3-18.
 */
@Configurable
public class Beans {
    @Bean(name = "car")
    public Car buildCar() {
        Car car = new Car();
        car.setBrand("英菲迪尼");
        car.setMaxSpeed(300);
        return car;
    }
}

 

AnnotationApplicationContext:

package com.context;
import com.reflect.Car;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
 * Created by gao on 16-3-18.
 */
public class AnnotationApplicationContext {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(Beans.class);
        Car car = ctx.getBean("car", Car.class);
        System.out.println(car.getBrand());
        System.out.println(car.getMaxSpeed());
    }
}

 

 

 

 

 

 

 

 

 

 

 

时间: 2024-10-25 15:36:43

BeanFactory 和 ApplicationContext的相关文章

在Spring中 BeanFactory与 ApplicationContext 俩个接口的区别是什么

问题描述 在Spring BeanFactory与 ApplicationContext 俩个接口的区别是什么?public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver {}...public interfa

《Spring技术内幕》——2.2节IoC容器系列的设计与实现:BeanFactory和ApplicationContext

2.2 IoC容器系列的设计与实现:BeanFactory和ApplicationContext在Spring IoC容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能:另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在.应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境作了许多适配.有了这两种基本的容器系列,基本上可以满足用户对IoC容器使用的大部分需求了.下面

2.2 BeanFactory和ApplicationContext

1.IoC概述         控制反转(Inverse of IoC)是Spring容器的内核,AOP.声明式事务都基于此.         IOC,即通过容器来控制业务对象间的依赖关系,而非传统的由代码直接操控.此即控制反转的关键所在:控制权由应用代码中转到了外部容器,控制权的转移,就是反转.        控制权转移好处:降低业务对象间的依赖程度. 2.BeanFactory 和 ApplicationContext Spring通过配置文件描述了Bean及Bean间的依赖关系,利用Jav

请问用applicationcontext有什么好处?

问题描述 知道applicationcontext比beanfactory有更多扩展功能,但不知道实质性的意义在哪??比起用beanfactory有什么好处?不太懂书里讲的内容,谁能帮忙解答下谢谢~ 解决方案 解决方案二:...解决方案三:???我理解错了?解决方案四:applicationcontext.xml?...................解决方案五:嗯spring的容器beanfactory和applicationcontext有什么区别?解决方案六:自己搜搜吧你看什么书,这么说的

BeanFactory与Application的区别

自从年初看了李刚写的那本<Spring2.0宝典>,好久没看过Spring任何资料,对于<Spring2.0宝典>的评价,我只能说一句话垃圾中的垃圾.我已经不敢再买国内作家写的书了. 在Spring中,两个最基本最重要的包是 org.springframework.beans 和 org.springframework.context. 这两个包中的代码为Spring的反向控制 特性(也叫作依赖注射)提供了基础. BeanFactory提供了一种先进的配置机制来管理任何种类bean

Spring面试问答Top 25

原文地址: http://www.importnew.com/15851.html#spring_framework 问题清单: 什么是Spring框架?Spring框架有哪些主要模块? 使用Spring框架有什么好处? 什么是控制反转(IOC)?什么是依赖注入? 请解释下Spring中的IOC? BeanFactory和ApplicationContext有什么区别? 将Spring配置到你的应用中共有几种方法? 什么基于XML的配置? 什么基Java的配置? 怎样用注解的方式配置Spring

Spring受管Bean的与处理和后处理 一

使用BeanPostProcessor接口对受管Bean进行预处理 有时候,我们希望在Spring IoC容器初始化受管Bean之前.属性设置之后对该Bean先做一些预处理, 或者在容器销毁受管Bean之前自己释放资源.那么该如何实现呢?Spring IoC为我们提供了多种方法来实 现受管Bean的预处理和后处理. 在Spring中定义了BeanPostProcessors接口,代码如下: package org.springframework.beans.factory.config; imp

简介Tapestry 5中的DI

DI是Dependency Injection缩写,我们翻译为"依赖注入".简单的说,两个对象A->B(或者组件)依赖关系的建立,最好不要在编程时候确定下来,即不要通过new的方式确定依赖关系,这种方式会使系统失去可扩展性.可复用性等特点.当业务需求变化的时候,A不再依赖B而是依赖C(A->C)时候,new方式建立依赖关系的时候就不得不修改A,这是我们在系统设计中最不希望看到的情况.我们需要的是A->B还是A->C的依赖关系不是固定的.死的,而是灵活的.可变的.

《Spring技术内幕》——导读

目 录 前言 第1章 Spring的设计理念和整体架构1.1 Spring的各个子项目 1.2 Spring的设计目标 1.3 Spring的整体架构 1.4 Spring的应用场景 1.5 小结 第一部分 Spring核心实现篇 第2章 Spring Framework的核心:IoC容器的实现 2.1 Spring IoC容器概述2.2 IoC容器系列的设计与实现:BeanFactory和ApplicationContext 2.3 IC容器的初始化过程 2.4 IoC容器的依赖注入 2.5