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

 更新时间:2023年04月23日 09:32:57   作者:郝学胜  
这篇文章主要为大家介绍了ApplicationContext继承接口功能及与BeanFactory区别示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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继承接口的资料请关注脚本之家其它相关文章!

相关文章

  • 深入了解Java定时器中的Timer的原理

    深入了解Java定时器中的Timer的原理

    这篇文章主要介绍了Java定时器中的Timer的原理。Timer主要用于Java线程里指定时间或周期运行任务,它是线程安全的,但不提供实时性(real-time)保证。接下来就跟随小编一起深入了解Timer吧
    2022-01-01
  • IDEA Error:java:无效的源发行版:13的解决过程

    IDEA Error:java:无效的源发行版:13的解决过程

    之前用idea运行时,也会出现这种情况,后面通过网上的资料解决了这个问题,下面这篇文章主要给大家介绍了关于IDEA Error:java:无效的源发行版:13的解决过程,需要的朋友可以参考下
    2023-01-01
  • SpringBoot整合MyBatisPlus详解

    SpringBoot整合MyBatisPlus详解

    这篇文章详细介绍了SpringBoot整合mybatisplus的全过程,文中有详细的代码示例,具有一定的参考价值,需要的朋友可以参考一下
    2023-04-04
  • Java String 字符串常量池解析

    Java String 字符串常量池解析

    这篇文章主要介绍了Java String 字符串常量池解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • springboot关闭druid监控 druid2改配置文件无效的解决

    springboot关闭druid监控 druid2改配置文件无效的解决

    这篇文章主要介绍了springboot关闭druid监控 druid2改配置文件无效的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 深入探究Java线程的状态与生命周期

    深入探究Java线程的状态与生命周期

    在java中,任何对象都要有生命周期,线程也不例外,它也有自己的生命周期。线程的整个生命周期可以分为5个阶段,分别是新建状态、就绪状态、运行状态、阻塞状态和死亡状态
    2022-04-04
  • 一文掌握Java的工具类和API

    一文掌握Java的工具类和API

    在Java中,工具类通常包含一系列静态方法,用于执行常见的任务,这些任务可能不直接关联到特定的业务逻辑,而是用于处理一些基础的数据转换、字符串操作、文件操作等,这篇文章主要介绍了一文搞懂Java的工具类和API,需要的朋友可以参考下
    2008-01-01
  • MyBatis Generator快速生成实体类和映射文件的方法

    MyBatis Generator快速生成实体类和映射文件的方法

    这篇文章主要介绍了MyBatis Generator快速生成实体类和映射文件的方法,通过示例代码介绍了MyBatis Generator 的使用,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • Java日期操作类常见用法示例

    Java日期操作类常见用法示例

    这篇文章主要介绍了Java日期操作类常见用法,结合实例形式分析了java针对日期时间的获取、转换常见操作技巧,需要的朋友可以参考下
    2019-07-07
  • 解决java.util.NoSuchElementException异常的问题

    解决java.util.NoSuchElementException异常的问题

    这篇文章主要介绍了解决java.util.NoSuchElementException异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论