【面试】spring中BeanFactory和ApplicationContext的区别

文章详细介绍了Spring中的ApplicationContext,包括它与BeanFactory的共同点与区别,如ApplicationContext自动注册bean和处理环境变量的能力。此外,还深入讲解了ApplicationContext实现的MessageSource接口用于国际化,ResourcePatternResolver用于资源匹配,ApplicationEventPublisher用于事件发布,以及EnvironmentCapable用于读取环境信息的功能,并提供了相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 共同点

  • 1.都可以作为容器。

2. 区别

  • 1.ApplicationContext不生产Bean,而是通知BeanFactory来生产,getBean是一个表面方法。
  • 2. ApplicationContext会自动把配置的bean注册进来。
  • 3.ApplicationContext会加载环境变量。
  • 4.ApplicationContext支持多语言。
  • 5.ApplicationContext实现事件监听。
  • 6.ApplicationContext注册了很多对外的扩展点。

3. 关系

  • 1.ApplicationContext实现了BeanFactory接口。

4. 类关系图

在这里插入图片描述

5. ApplicationContext实现的接口

5.1 MessageSource
5.1.1 说明
  • 1.支持国际化语言
5.1.2 接口源码
package org.springframework.context;

import java.util.Locale;
import org.springframework.lang.Nullable;

public interface MessageSource {
    @Nullable
    String getMessage(String var1, @Nullable Object[] var2, @Nullable String var3, Locale var4);

    String getMessage(String var1, @Nullable Object[] var2, Locale var3) throws NoSuchMessageException;

    String getMessage(MessageSourceResolvable var1, Locale var2) throws NoSuchMessageException;
}
5.1.3 代码示例
package com.learning;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableScheduling;

import java.util.Locale;

/**
 * @Author wangyouhui
 **/
@SpringBootApplication
@EnableCaching
@EnableScheduling
public class SpringBootLearningApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(SpringBootLearningApplication.class, args);
        System.out.println(configurableApplicationContext.getMessage("hi", null, Locale.CHINA));
        System.out.println(configurableApplicationContext.getMessage("hi", null, Locale.ENGLISH));
    }
}
5.1.4 示例截图
  • 1. 配置文件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 2. 结果截图
    在这里插入图片描述
5.2 ResourcePatternResolver
5.2.1 说明
  • 1.通配符匹配资源(磁盘、类路径获取的文件)的能力。
  • 2.classpath是在类路径中查找,若在jar包中则找不到,加*可在jar中查找,即classpath*。
5.2.2 代码示例
package com.learning;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.io.Resource;

import java.io.IOException;

@SpringBootApplication
public class SpringBootLearningApplication {
    public static void main(String[] args) throws IOException {
        ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(SpringBootLearningApplication.class, args);

        Resource[] resources = configurableApplicationContext.getResources("classpath*:META-INF/spring.factories");
        for (Resource resource : resources) {
            System.out.println(resource);
        }
    }
}
5.2.3 截图示例

在这里插入图片描述

6.3 ApplicationEventPublisher
5.3.1 说明
  • 1.用来发布事件对象。
  • 2.事件可以用来解耦。
5.3.2 代码示例
  • 1.带事件监听的方法
package com.learning.component;

import com.learning.event.UserRegisterEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class ComponentTwo {

    @EventListener
    public void sendMessage(UserRegisterEvent event){
        log.info("{}", event);
        log.info("发送短信");
    }
}

  • 2.事件类
package com.learning.event;

import org.springframework.context.ApplicationEvent;

public class UserRegisterEvent extends ApplicationEvent {
    public UserRegisterEvent(Object source) {
        super(source);
    }
}

  • 3.发布类
package com.learning.component;

import com.learning.event.UserRegisterEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class ComponentOne {
    @Autowired
    private ApplicationContext applicationContext;

    public void register(){
        log.info("用户注册");
        applicationContext.publishEvent(new UserRegisterEvent(this));
    }
}

  • 4.启动类
package com.learning;

import com.learning.component.ComponentOne;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.io.IOException;

@SpringBootApplication
public class SpringBootLearningApplication {
    public static void main(String[] args) throws IOException {
        ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(SpringBootLearningApplication.class, args);
        ComponentOne componentOne = configurableApplicationContext.getBean(ComponentOne.class);
        componentOne.register();
    }
}

5.3.3 效果示例

在这里插入图片描述

5.4 EnvironmentCapable
5.4.1 说明
  • 1.读取系统环境变量、*.yml文件、*.property文件信息。
5.4.2 代码示例
package com.learning;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.io.IOException;

@SpringBootApplication
public class SpringBootLearningApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(SpringBootLearningApplication.class, args);
        String javaHome = configurableApplicationContext.getEnvironment().getProperty("java_home");
        String port = configurableApplicationContext.getEnvironment().getProperty("server.port");
        System.out.println(javaHome);
        System.out.println(port);
    }
}
5.4.3 截图示例

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王佑辉

老板,赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值