Springboot - 4.ApplicationContext

✍1. ApplicationContext:

当在Spring Boot中使用ApplicationContext时,您可以遵循以下详细示例来了解每个概念和用法,同时考虑了Spring Boot的自动配置和便利性:

🎷1. ApplicationContext接口:

ApplicationContext是Spring IoC容器的更高级别接口,除了BeanFactory的功能外,还提供了更多的功能,如国际化、事件传播等。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;@Component
public class MyComponent {private final ApplicationContext applicationContext;@Autowiredpublic MyComponent(ApplicationContext applicationContext) {this.applicationContext = applicationContext;}public void useBean() {MyService myService = applicationContext.getBean(MyService.class);myService.doSomething();}
}

🎷2. 默认实现:

在Spring Boot中,默认的ApplicationContext实现是AnnotationConfigApplicationContext,用于基于注解的配置。

🎷3. Bean的生命周期:

ApplicationContext也负责管理Bean的生命周期,与BeanFactory相同。

🎷4. Bean的获取:

使用getBean()方法从容器中获取Bean,与BeanFactory相同。

MyService myService = applicationContext.getBean(MyService.class);

🎷5. 延迟初始化:

默认情况下,ApplicationContext同样支持延迟初始化,只有在需要时才创建Bean实例。

🎷6. 扩展和自定义:

您可以实现BeanPostProcessor接口等来自定义Bean的创建和初始化过程,与BeanFactory相同。

🎷7. 注解配置:

使用注解定义Bean。

import org.springframework.stereotype.Component;@Component
public class MyService {// Bean implementation
}

🎷8. 注解扫描:

使用注解扫描自动注册标记了@Component的Bean,与BeanFactory相同。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Application {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);MyService myService = context.getBean(MyService.class);myService.doSomething();}
}

🎷9. 自动装配:

使用@Autowired注解进行自动装配,与BeanFactory相同。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyController {private final MyService myService;@Autowiredpublic MyController(MyService myService) {this.myService = myService;}// Controller logic
}

通过这些详细示例,您可以更深入地理解在Spring Boot中如何使用ApplicationContext来管理和使用Bean,同时利用Spring Boot的自动配置和便利性。ApplicationContext提供了更多的功能,如事件传播和国际化,使得应用程序更加灵活和功能丰富。

✍2. 如何使用ApplicationContext:

在Spring Boot中,ApplicationContext是一个中央接口,它提供了应用程序运行时的配置信息。ApplicationContextBeanFactory的子接口,它添加了更多的企业级功能,比如从一个属性文件中解析文本信息。

🎷1. 注入ApplicationContext:

  • 我们可以通过实现ApplicationContextAware接口或者直接在Bean中注入ApplicationContext来使用它。

    @Component
    public class ExampleBean implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}public void doSomething() {// 使用applicationContextAnotherBean anotherBean = (AnotherBean) applicationContext.getBean(AnotherBean.class);anotherBean.doSomething();}}@Component
    public class AnotherBean {public void doSomething() {System.out.println("AnotherBean doSomething 方法被调用");}}
    

    在这个示例中,ExampleBean实现了ApplicationContextAware接口,这样Spring容器会自动注入ApplicationContext。然后,在doSomething方法中,我们使用applicationContext获取AnotherBean的实例,并调用它的doSomething方法。

🎷2. 使用@Autowired注解:

  • 我们可以使用@Autowired注解直接在Bean中注入ApplicationContext

    @Component
    public class ExampleBean {@Autowiredprivate ApplicationContext applicationContext;public void doSomething() {// 使用applicationContextAnotherBean anotherBean = (AnotherBean) applicationContext.getBean(AnotherBean.class);anotherBean.doSomething();}}@Component
    public class AnotherBean {public void doSomething() {System.out.println("AnotherBean doSomething 方法被调用");}}
    

    在这个示例中,我们使用@Autowired注解直接在ExampleBean中注入ApplicationContext。然后,在doSomething方法中,我们使用applicationContext获取AnotherBean的实例,并调用它的doSomething方法。

🎷3. 使用ApplicationListener接口:

  • 我们可以实现ApplicationListener接口来监听应用程序的事件。

    @Component
    public class ExampleBean implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {System.out.println("应用程序上下文刷新");}}
    

    在这个示例中,ExampleBean实现了ApplicationListener接口,这样它会监听ContextRefreshedEvent事件。当应用程序上下文刷新时,onApplicationEvent方法会被调用。

✍3. BeanFactory和ApplicationContext:

在Spring Framework中,BeanFactory和ApplicationContext是用来管理和提供应用程序组件(即Java对象或"bean")的容器。它们在Spring框架中扮演着不同的角色,并适用于不同的使用场景。

🎷1. BeanFactory:

  • 作用:BeanFactory是Spring的IoC(控制反转)容器的基本形式,负责创建、管理和提供bean实例,从而实现了将对象的创建和配置与应用程序代码解耦的原则。
  • 特点:BeanFactory是轻量级容器,只在请求时才会实例化bean,从而实现了延迟加载,这在性能方面具有优势。它提供了基本的IoC功能,但在功能上相对较少。
  • 示例:在移动设备或资源受限的嵌入式系统中,使用BeanFactory可以降低内存和资源消耗,只有在需要时才实例化bean,如下所示:
    BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
    MyBean myBean = beanFactory.getBean(MyBean.class);
    

🎷2. ApplicationContext:

  • 作用:ApplicationContext是BeanFactory的更高级扩展,提供了更多的功能和特性,如国际化、事件传播、AOP(面向切面编程)集成等。
  • 特点:ApplicationContext在容器初始化时就实例化并配置所有bean,因此在容器启动时就完成了所有bean的创建。它是功能更强大、更全面的容器。
  • 示例:在Web应用程序中,使用ApplicationContext可以方便地管理国际化资源、处理事件和应用AOP,如下所示:
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    MessageSource messageSource = applicationContext.getBean(MessageSource.class);
    

🎷3. 总结:

  • 如果应用程序对性能和资源消耗有严格要求,可以选择使用BeanFactory来实现延迟加载和轻量级容器。例如,在嵌入式系统中。
  • 如果应用程序需要更多功能,如国际化、事件传播、AOP等,或者需要在启动时立即实例化所有bean,应选择使用ApplicationContext。例如,在Web应用程序或企业级应用中。

在实际开发中,许多应用程序会倾向于使用ApplicationContext,因为它提供了更多的便利和功能。但根据不同的需求和环境,选择合适的容器类型可以更好地满足应用程序的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/65856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读word模板批量生成制式文件

文章目录 1、Maven依赖2、.docx或.doc格式的word模板准备3、读word模板&#xff0c;批量替换代码域&#xff0c;生成文件&#xff0c;demo4、结果展示 1、Maven依赖 <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagre…

Cargo 静态编译

git clone --recursive https://github.com/kornelski/pngquant.git vi ~/.cargo/config.toml[http] debug true proxy "127.0.0.1:1080" 1.apt 更新 2.apt install cargo 3.修改源码的Cargo.toml [source.crates-io] #registry "https://code.aliyun.com…

一键替换工程文件和场景中的UI对象字体

具体流程&#xff1a; 找到工程中使用到的所有字体找到工程和场景中包含Text的所有对象展示要替换的字体名字让用户选择通过用户选择的字体&#xff0c;展示响应的物体对象一键替换 通过AssetDatabase.FindAssets找到工程中包含的所有字体&#xff1a; private List<strin…

nnUNet v2数据准备及格式转换 (二)

如果你曾经使用过nnUNet V1&#xff0c;那你一定明白数据集的命名是有严格要求的&#xff0c;必须按照特定的格式来进行命名才能正常使用。 这一节的学习需要有数据&#xff0c;如果你有自己的数据&#xff0c;可以拿自己的数据来实验&#xff0c;如果没有&#xff0c;可以用十…

ASP.NET Core 中的 静态文件

Static Files Static Files 包括 HTML&#xff0c;CSS&#xff0c;图片&#xff0c;JavaScript&#xff0c;以及其他静态资源文件。 即网站本身的内容。 Static Files 服务 Static Files 保存在项目的 Web Root 目录&#xff0c;即 wwwroot 文件夹中。 而wwwroot目录是Conte…

两个pdf文件合并为一个怎么操作?分享pdf合并操作步骤

不管是初入职场的小白&#xff0c;还是久经职场的高手&#xff0c;都必须深入了解pdf&#xff0c;特别是关于pdf的各种操作&#xff0c;如编辑、合并、压缩等操作&#xff0c;其中合并是这么多操作里面必需懂的技能之一&#xff0c;但是很多人还是不知道两个pdf文件合并为一个怎…

jenkins+ssh+Putty构建windows的IIS服务发布

使用JenkinssshPutty发布windows IIS服务 下面是使用Jenkins、SSH和PuTTY实现Windows IIS服务发布的步骤&#xff1a; 在构建服务器上安装Windows SSH服务、PuTTY和7-Zip软件。在部署服务器上也安装Windows SSH服务和7-Zip软件。在构建服务器上使用批处理命令执行编译&#x…

ChatGPT⼊门到精通(4):ChatGPT 为何⽜逼

⼀、通⽤型AI 在我们原始的幻想⾥&#xff0c;AI是基于对海量数据的学习&#xff0c;锻炼出⼀个⽆所不知⽆所不能的模 型&#xff0c;并借助计算机的优势&#xff08;计算速度、并发可能&#xff09;等碾压⼈类。 但我们⽬前的AI&#xff0c;不管是AlphaGo还是图像识别算法&am…

组件化开发之如何封装组件-react

组件化开发之如何封装组件-react 什么是组件为什么需要封装组件组件的分类函数组件&#xff08;Functional Components&#xff09;&#xff1a;展示型组件&#xff1a;容器型组件&#xff1a;知道组件分类的意义是&#xff1f; 如何拆分组件&#xff0c;需要遵循什么原则1.保证…

解决Debian系统通过cifs挂载smb后,中文目录乱码问题

解决Debian系统通过cifs挂载smb后&#xff0c;中文目录乱码问题 //$smb_server/share /mnt/nas_share cifs credentials/root/.smbcredentials,iocharsetutf8 0 0默认通过以上命令挂载smb&#xff0c;但是在查看文件目录时&#xff0c;中文乱码 解决问题方式&#xff1a; de…

MR混合现实汽车维修情景实训教学演示

MR混合现实技术应用于汽车维修课堂中&#xff0c;能够赋予学生更加真实&#xff0c;逼真地学习环境&#xff0c;让学生在情景体验中不断提高自己的专业能力。 MR混合现实汽车维修情景实训教学演示具体体现在&#xff1a; 1. 虚拟维修指导&#xff1a;利用MR技术&#xff0c;可…

企业架构LNMP学习笔记9

nginx配置文件定义php-fpm服务&#xff1a; 编写测试文件&#xff1a; vim /usr/local/nginx/html/index.php 内容&#xff1a; <?phpphpinfo(); 在nginx的配置文件中配置&#xff1a; 修改配置文件&#xff0c;告知nginx如果收到.php结尾的请求&#xff0c;交由给php-…

【数据结构篇】线性表1 --- 顺序表、链表 (万字详解!!)

前言&#xff1a;这篇博客我们重点讲 线性表中的顺序表、链表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列... 线性表在逻辑上是…

mac软件安装后打开软件显示损坏

#mac传输安装包后安装后打开软件显示损坏处理方式 以postman为例&#xff0c;输入前面的代码&#xff0c;打开访达&#xff0c;把有问题的软件拉到命令行窗口&#xff0c;确认即可 sudo xattr -r -d com.apple.quarantine /Applications/Postman.app sudo xattr -r -d com.ap…

如何中mac上安装多版本python并配置PATH

摘要 mac 默认安装的python是 python3&#xff0c;但是如果我们需要其他python版本时&#xff0c;该怎么办呢&#xff1f; 例如&#xff1a;需要python2 版本&#xff0c;如果使用homebrew安装会提示没有python2。同时使用python --version 会发现commond not found。 所以本…

MySQL中表的设计

在MySQL中表的设计&#xff0c;需要一定的经验才能理解&#xff0c;由于笔者目前在读中&#xff0c;理解不是很深刻&#xff0c;仅根据自己的想法外界的一些参考资料做出下述文字描述&#xff0c;一些错误&#xff0c;请大佬及时指正~~ 在本篇文章中&#xff0c;介绍一点简单粗…

RocketMQ(消息中间件)

目录 一、为什么会出现消息中间件&#xff1f; 二、消息中间件是干嘛的&#xff1f; 三、应用解耦 四、流量削峰 五、异步处理 1.串行方式&#xff1a; 2.并行方式&#xff1a; 3.引入消息队列&#xff1a; 六、RocketMQ的架构及概念 一、为什么会出现消息中间件&#…

k8s基于rbac权限管理serviceAccount授权管理

测试通过http访问apiServer curl没有证书不能通过https来访问apiServer需要使用kubectl代理 #使用kubectl代理 kubectl proxy --port8111& #curl访问 api/v1 是资源所属群组/版本 即创建资源时定义的apiVersion #后边跟的是要访问的资源 #查看所有命名空间 #查看核心资源用…

小程序快速备案助手代备案小程序开发

小程序快速备案助手代备案小程序开发 用户注册与登录&#xff1a;用户可以通过手机号或其他方式进行注册和登录&#xff0c;以便进行备案相关操作。备案信息填写&#xff1a;用户可以填写小程序的备案信息&#xff0c;包括小程序名称、小程序服务类目、域名等。备案材料上传&a…

Python钢筋混凝土结构计算.pdf-混凝土构件计算

计算原理&#xff1a; 代码实现&#xff1a; #钢筋混凝土参数 def c_hrb(): global fcuk,HRB,Ec,fc,ft,ftk,Es,fy,fyp,fyk global a1,epsilon_cu fcukEcfcftftk0.0 HRBEsfyfypfyk0.0 #矩形应力图系数a1&#xff0c;C50以下为1.0 a11.0 #正截面混凝土极限压应变epsilon_cu&#…