一文学透ApplicationContext继承接口功能及与BeanFactory区别

目录
  • BeanFactory与ApplicationContext关系的分析
  • ApplicationContext继承的接口与功能
  • BeanFactory应用代码示例
  • ApplicationContext各功能的应用代码示例
    • ResourceLoader 接口的示例
    • MessageSource 接口的示例
    • ApplicationEventPublisher 接口的示例
    • EnvironmentCapable 接口的示例
    • ListableBeanFactory接口示例
    • AutowireCapableBeanFactory接口示例
    • BeanDefinitionRegistry接口示例
    • ConfigurableApplicationContext接口示例

BeanFactory与ApplicationContext关系的分析

BeanFactory是Spring中最基本的接口,它是Spring IoC容器中最底层的接口,提供了IoC容器最基本的形式,它具有最基本的 IoC 功能,负责管理 Spring Bean 的生命周期,通过 BeanFactory 可以获取指定 Bean 的实例。 ApplicationContext是BeanFactory的子接口,ApplicationContext继承了BeanFactory接口的全部功能,同时还提供了其他的一些功能。ApplicationContext是Spring中最重要的接口之一,它是Spring容器的具体实现,在BeanFactory的基础上添加了一些更加实用的功能,比如资源加载、事件发布、AOP和事务等。 因此,可以认为ApplicationContext继承了BeanFactory,拥有了更多的功能和扩展性。

ApplicationContext继承的接口与功能

  • ResourceLoader:加载资源文件
  • MessageSource:国际化消息的源头
  • ApplicationEventPublisher:应用事件发布
  • EnvironmentCapable:获取当前应用的环境信息
  • ListableBeanFactory:提供了批量操作Bean的方法
  • HierarchicalBeanFactory:层次性的BeanFactory,支持子容器
  • AutowireCapableBeanFactory:Bean自动装配的BeanFactory
  • BeanDefinitionRegistry:定义和注册BeanDefinition的接口
  • ConfigurableApplicationContext:ApplicationContext可配置的接口,对外提供了修改bean定义、激活环境、注册shut-down hook等能力。

BeanFactory应用代码示例

public class TestBean {
    private String name;
    public TestBean() {
       System.out.println("constructor of TestBean is invoked");
    }
    public void setName(String name) {
       this.name = name;
    }
    public String getName() {
       return name;
    }
}
public class BeanFactoryExample {
    public static void main(String[] args) {
        Resource resource = new ClassPathResource("spring-config.xml");
        BeanFactory factory = new XmlBeanFactory(resource);
        TestBean testBean = (TestBean) factory.getBean("testBean");
        System.out.println("The name is : " + testBean.getName());
    }
}

其中,ClassPathResource是一个用于从classpath中加载资源文件的类。XmlBeanFactory是Spring提供的一个实现了BeanFactory接口的IoC容器实例。在实例化XmlBeanFactory时,需要提供一个Resource对象,这里传入的是spring-config.xml文件。

ApplicationContext各功能的应用代码示例

ResourceLoader 接口的示例

public class ResourceLoaderExample {
     public static void main(String[] args) throws IOException {
         ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
         ResourceLoader loader = context;
         Resource resource = loader.getResource("classpath:test.txt");
         InputStream inputStream = resource.getInputStream();
         BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
         String line;
         while ((line = reader.readLine()) != null) {
            System.out.println(line);
         }
         reader.close();
    }
}

这段示例代码通过ApplicationContext实例化了一个ResourceLoader对象,然后通过getResource方法加载了"classpath:test.txt"文件。这个文件在classpath路径下,所以可以使用 classpath: 前缀来定位文件。

MessageSource 接口的示例

首先,需要在Spring配置文件中定义一个资源文件:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages" />
</bean>

然后,在Java代码中使用注入方式获取 MessageSource 实例:

public class MessageSourceExample {
    public static void main(String[] args) {
       ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
       MessageSource messageSource = (MessageSource) context.getBean("messageSource");
       String message = messageSource.getMessage("test", null, Locale.getDefault());
       System.out.println("The message is : " + message);
    }
}

这个示例代码中,我们通过 messageSource.getMessage("test", null, Locale.getDefault()) 方法根据当前默认的语言获取了 messages.propertiestest 属性的值。

ApplicationEventPublisher 接口的示例

我们可以在启动时发布一个事件:

public class MyApplicationEvent extends ApplicationEvent {
     public MyApplicationEvent(Object source) {
         super(source);
     }
}
public class PublishEventExample {
     public static void main(String[] args) {
         ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
         context.addApplicationListener(new ApplicationListener<MyApplicationEvent>() {
             @Override
             public void onApplicationEvent(MyApplicationEvent event) {
                 System.out.println("MyApplicationEvent received!");
             }
         });
         context.publishEvent(new MyApplicationEvent("Hello World!"));
         context.close();
   }
}

当程序成功运行时,我们可以看到输出了 MyApplicationEvent received! 的信息。

EnvironmentCapable 接口的示例

这个接口用于获取当前运行的环境信息:

public class EnvironmentExample {
    public static void main(String[] args) {
         ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
         Environment environment = context.getEnvironment();
         System.out.println("The environment is : " + environment.getProperty("os.name"));
    }
}

ListableBeanFactory接口示例

这个接口中提供了一些批量操作Bean的方法:

public class ListableBeanFactoryExample {
    public static void main(String[] args) {
       ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
       ListableBeanFactory beanFactory = context.getBeanFactory();
       String[] beanNames = beanFactory.getBeanDefinitionNames();
       for (String beanName : beanNames) {
           System.out.println(beanName);
       }
   }
}

AutowireCapableBeanFactory接口示例

这个接口用于完成Bean的自动装配:

public class AutowireCapableBeanFactoryExample {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        AutowireCapableBeanFactory beanFactory = context.getAutowireCapableBeanFactory();
        TestBean testBean = new TestBean();
        beanFactory.autowireBean(testBean);
        System.out.println("The name is : " + testBean.getName());
    }
}

BeanDefinitionRegistry接口示例

这个接口用于注册Bean:

public class BeanDefinitionRegistryExample {
    public static void main(String[] args) {
        XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
        BeanDefinition beanDefinition = new RootBeanDefinition(TestBean.class);
        registry.registerBeanDefinition("testBean", beanDefinition);
        TestBean testBean = (TestBean) beanFactory.getBean("testBean");
        System.out.println("The name is : " + testBean.getName());
    }
}

这个示例代码中,我们通过 BeanDefinitionRegistry 接口实现了向容器注册 TestBean 的过程。

ConfigurableApplicationContext接口示例

这个接口用于修改bean定义、激活环境、注册shut-down hook等能力:

public class ConfigurableApplicationContextExample {
    public static void main(String[] args) {
       ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
       ConfigurableEnvironment environment = context.getEnvironment();
       environment.setActiveProfiles("dev");
       context.refresh();
       TestBean testBean = (TestBean) context.getBean("testBean");
       System.out.println("The name is : " + testBean.getName());
   }
}

在这个示例代码中,我们通过 ConfigurableApplicationContext 接口修改了当前的运行环境,激活了dev配置文件并重新刷新了容器,然后获取了 testBean 的实例并输出它的名称。

以上就是一文学透ApplicationContext继承接口功能及与BeanFactory区别的详细内容,更多关于ApplicationContext BeanFactory继承接口的资料请关注我们其它相关文章!

(0)

相关推荐

  • Spring中BeanFactory和ApplicationContext的作用和区别(推荐)

    作用: 1.BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期.2.ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能: a. 国际化支持 b. 资源访问:Resource rs = ctx. getResource("classpath:config.properties"), "file:c:/config.properties&qu

  • Spring系列中的beanFactory与ApplicationContext

    目录 一.BeanFactory 二.ApplicationContext 三.二者区别 四.总结 一.BeanFactory BeanFactory 是 Spring 的“心脏”.它就是 Spring IoC 容器的真面目.Spring 使用 BeanFactory 来实例化.配置和管理 Bean. BeanFactory:是IOC容器的核心接口, 它定义了IOC的基本功能,我们看到它主要定义了getBean方法.getBean方法是IOC容器获取bean对象和引发依赖注入的起点.方法的功能是

  • Spring容器-BeanFactory和ApplicationContext使用详解

    目录 将BeanFactory和ApplicationContext作为容器使用 BeanFactory容器 ApplicationContext容器 Spring内嵌Web容器的过程 将BeanFactory和ApplicationContext作为容器使用 在Spring中,BeanFactory和ApplicationContext是容器的两种实现方式,可以使用它们来管理对象的生命周期以及实现依赖注入等功能.下面我们来分别演示一下BeanFactory和ApplicationContext

  • Spring ApplicationContext接口功能详细介绍

    第一步,我们先来看这个接口的内部结构,了解别人的内部,知己知彼,百战不殆: 这个接口的扩展功能主要体现在它继承的四个接口上: MessageSource:国际化功能 ResourcePatternResolver: 资源访问功能 ApplicationEventPublisher: Spring事件发布者功能 EnvironmentCapable:提供当前系统环境 Environment 组件功能 国际化功能演示 查看对应的方法: 准备翻译资源信息: --------messages_en.pr

  • 浅谈java 面对对象(抽象 继承 接口 多态)

    什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接访问父类中的非私有的属性和行为. 通过 extends 关键字让类与类之间产生继承关系. class SubDemo extends Demo{} //SubDemo是子类,Demo是父类 继承有什么好处? •提高代码的复用性. •让类与类之间产生了关系,是多态的前提. 继承的特点 1.Java只支

  • PHP中抽象类,接口功能、定义方法示例

    本文实例讲述了PHP中抽象类,接口功能.定义方法.分享给大家供大家参考,具体如下: 这里先介绍接口,因为在我最近看的好几本php工具书中都没有提到抽象类. 本人也觉得,在理解了接口后抽象类也非常好理解. 例子代码随便写了一下.例子代码是很ok的,测试过了不会报错,懒得看代码的筒靴们看文字一样.栗子举的不好. 代码测试环境:php5.3.29 接口(interface): 接口就是为抽象而生的,相当于一个约定或规范,方便框架搭建,代码分工. 它里面指定了抽象方法的名称和参数和成员常量,但不能包含任

  • 详解spring中的Aware接口功能

    目录 一,ApplicationContextAware 二.ApplicationEventPublisherAware 在spring中有很多以XXXAware命名的接口,很多人也不清楚这些接口都是做什么用的,这篇文章将描述常用的一些接口. 一,ApplicationContextAware 获取spring容器,用来访问容器中定义的其他bean.实现接口方法public void setApplicationContext(ApplicationContext applicationCon

  • ThinkPHP实现支付宝接口功能实例

    本文实例讲述了ThinkPHP实现支付宝接口功能的方法.分享给大家供大家参考.具体分析如下: 最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能,这里我用的是即时到帐的接口,具体实现的步骤如下: 一.下载支付宝接口包 下载地址:https://b.alipay.com/order/productDetail.htm?productId=2012111200373124&tabId=4#ps-tabinfo-hash 具体如何下载,我就不在罗嗦了-- 二.重新整理接口包文件,

  • 在Koa.js中实现文件上传的接口功能

    文件上传是一个基本的功能,每个系统几乎都会有,比如上传图片.上传Excel等. 那么在Node Koa应用中如何实现一个支持文件上传的接口呢? 本文从环境准备开始.最后分别用 Postman 和一个HTML页面来测试. 01-环境准备 首先当然是要初始化一个Koa项目了,安装 Koa.koa-router 即可. npm install koa koa-router 设置图片上传目录,把图片上传到指定的目录中,在 app 路径下新建 public 文件夹,目录结构如下: koa-upload/

  • 浅谈Java 继承接口同名函数问题

    在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); } interface C extends A,B{ } public class Test implements C{ @Override public void fun() { System.out.println("hehe"); } public static void main

  • springboot vue测试列表递归查询子节点下的接口功能实现

    目录 基于 springboot+vue 的测试平台开发 一.后端 1. 建表 2. 列表接口 二.前端 1. 准备工作 2. 请求接口 3. 测试效果 4. 发现问题 基于 springboot+vue 的测试平台开发 继续更新 模块树节点的开发暂告一段落,现在开发右边接口相关的部分,今天先完成列表的功能. 功能是这样,当点击树的某个节点时候,右侧列表展示这个节点下的所有接口,带分页(最终效果图). 需要注意的是,因为节点下还有子节点,所以列表的功能需要使用递归来查询. 一.后端 1. 建表

  • Java接口和抽象类有什么区别

    接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制. 接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字interface实现. 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念.类描述对象的属性和方法.接口则包含类要实现的方法. 除非实

  • java中重载,继承,重写和多态的区别

    重载,继承,重写和多态的区别: 1)继承是子类获得父类的成员. 2)重写是继承后重新实现父类的方法. 3)重载是在一个类里一系列参数不同名字相同的方法. 4)多态则是为了避免在父类里大量重载引起代码臃肿且难于维护. 网上看到一个有趣的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法. 下面的例子包含了这四种实现: class Triangle extends Shape { public int getSides() {   return 3;  } } class Rectang

随机推荐