ApplicationContext实现

news2024/11/24 22:34:10

基于classpath下的xml格式的配置文件来创建bean对象

  • java代码
    • package com.example;
      
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      import org.springframework.context.support.FileSystemXmlApplicationContext;
      
      public class TestApplicationContext {
          private static final Logger log = LoggerFactory.getLogger(TestApplicationContext.class);
      
          public static void main(String[] args) {
              testClassPathXmlApplicationContext();
      
          }
      
          // todo 较为经典的容器、基于classpath下的xml格式的配置文件来创建
          private static void testClassPathXmlApplicationContext() {
              ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("b01.xml");
              for (String name : context.getBeanDefinitionNames()) {
                  System.out.println(name);
              }
              System.out.println(context.getBean(Bean2.class).getBean1());
          }
      
      
      
          static class Bean1 {
          }
      
          static class Bean2 {
              private Bean1 bean1;
      
              public void setBean1(Bean1 bean1) {
                  this.bean1 = bean1;
              }
      
              public Bean1 getBean1() {
                  return bean1;
              }
          }
      }
      
  •  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"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
          <bean id="bean1" class="com.example.TestApplicationContext.Bean1"></bean>
          <bean id="bean2" class="com.example.TestApplicationContext.Bean2">
              <property name="bean1" ref="bean1"/>
          </bean>
      </beans>
  • 在前面也讲过,ApplicationContext接口的实现需要BeanFactory接口的支持,具体见文章:BeanFactory与ApplicationContext_熵240的博客-CSDN博客
    ​​​​

    • 具体如下关键实现代码如下

      •         // todo 先创建一个beanFactory对象
                DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
                // todo 设置将读取目标存在哪一个beanFactory中
                XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
                // todo 设置读取目标
                reader.loadBeanDefinitions(new ClassPathResource("b01.xml"));
                for (String name : beanFactory.getBeanDefinitionNames()) {
                    System.out.println(name);
                }
  • 运行结果为
    •  

基于磁盘路径下的xml格式的配置文件来创建bean对象

  • java代码
    • package com.example;
      
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.beans.factory.support.DefaultListableBeanFactory;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      import org.springframework.context.support.FileSystemXmlApplicationContext;
      
      public class TestApplicationContext {
          private static final Logger log = LoggerFactory.getLogger(TestApplicationContext.class);
      
          public static void main(String[] args) {
      //        testClassPathXmlApplicationContext();
              testFileSystemXmlApplication();
          }
          
      
          // todo 基于磁盘路径下的xml格式的配置文件来创建bean对象
          private static void testFileSystemXmlApplication() {
              FileSystemXmlApplicationContext context =
                      new FileSystemXmlApplicationContext("D:\\JavaProject\\Spring\\Spring\\src\\main\\resources\\b01.xml");
              for (String name : context.getBeanDefinitionNames()) {
                  System.out.println(name);
              }
      
          }
      
          static class Bean1 {
          }
      
          static class Bean2 {
              private Bean1 bean1;
      
              public void setBean1(Bean1 bean1) {
                  this.bean1 = bean1;
              }
      
              public Bean1 getBean1() {
                  return bean1;
              }
          }
      }
      
  • 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"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
          <bean id="bean1" class="com.example.TestApplicationContext.Bean1"></bean>
          <bean id="bean2" class="com.example.TestApplicationContext.Bean2">
              <property name="bean1" ref="bean1"/>
          </bean>
      </beans>
  • 同样的这种方法也是通过Beanfactory接口来具体实现的

    • 具体关键代码如下

      •         DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
                XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
                reader.loadBeanDefinitions(new PathResource("D:\\JavaProject\\Spring\\Spring\\src\\main\\resources\\b01.xml"));
                for (String name : beanFactory.getBeanDefinitionNames()) {
                    System.out.println(name);
                }
  • 运行结果如下

基于java配置类来创建bean对象

  • java代码(配置类代码也写在一起了,一般讲是创建一个配置类)
    • package com.example;
      
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.context.annotation.AnnotationConfigApplicationContext;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      public class TestApplicationContext {
          private static final Logger log = LoggerFactory.getLogger(TestApplicationContext.class);
      
          public static void main(String[] args) {
      //        testClassPathXmlApplicationContext();
      //        testFileSystemXmlApplication();
              testAnnotationConfigApplicationText();
      
          }
      
          // todo 基于java配置类来创建bean对象
          private static void testAnnotationConfigApplicationText() {
              AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
              for (String name : context.getBeanDefinitionNames()) {
                  System.out.println(name);
              }
          }
      
          // todo 创建一个配置类
          @Configuration
          static class Config {
              @Bean
              public Bean1 bean1() {
                  return new Bean1();
              }
      
              @Bean
              public Bean2 bean2(Bean1 bean1) {
                  Bean2 bean2 = new Bean2();
                  bean2.setBean1(bean1);
                  return bean2;
              }
          }
      
          static class Bean1 {
          }
      
          static class Bean2 {
              private Bean1 bean1;
      
              public void setBean1(Bean1 bean1) {
                  this.bean1 = bean1;
              }
      
              public Bean1 getBean1() {
                  return bean1;
              }
          }
      }
      

 
 

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

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

相关文章

力扣刷题班 第3课 02-分治与回溯算法

分治&#xff08;例题1&#xff09;九键电话号码的字母组合 电话号码的字⺟组合 给定⼀个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字⺟组合。答案可以按 任意顺序 返回。 给出数字到字⺟的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字…

【计算机视觉】Image Feature Extractors方法介绍合集(二)

文章目录 一、Mixed Depthwise Convolution二、Deformable Kernel三、Dynamic Convolution四、Submanifold Convolution五、CondConv六、Active Convolution七、Depthwise Dilated Separable Convolution八、Involution九、Dilated convolution with learnable spacings十、Att…

Elastic Stack 8.10:更简单的跨集群搜索和身份验证等等

作者&#xff1a;Tyler Perkins, Gilad Gal, Shani Sagiv, George Kobar, Michael Peterson, Aris Papadopoulos Elastic Stack 8.10 增强了跨集群和向量搜索、数据摄取、Kibana 和云注册。 配置远程搜索时获得更大的灵活性&#xff0c;并提供更多信息来分类问题&#xff0c;…

小白备战大厂算法笔试(八)——搜索

搜索 二分查找 二分查找是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮减少一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空为止。 Question&#xff1a; 给定一个长度为n的数组 nums &#xff0c;元素按从小到大的顺序排列&#xff0c;数组…

git基本手册

Git and GitHub for Beginners Tutorial - YouTube Kevin Stratvert git config --global user.name “xxx” git config --global user.email xxxxx.com 设置默认分支 git config --global init.default branch main git config -h查看帮助 详细帮助 git help config 清除 cl…

计网第五章(运输层)(二)(端口号、复用和分用)

一、端口号 &#xff08;1&#xff09;基本概念 在上部分&#xff08;计网第五章&#xff08;运输层&#xff09;&#xff08;一&#xff09;_永无魇足的博客-CSDN博客&#xff09;提到运输层用不同的端口对应不同的应用进程。 端口就是用来区分不同应用进程的标识符。 每个…

HarmonyOS/OpenHarmony应用开发-DevEco Studio新建项目的整体说明

一、文件-新建-新建项目 二、传统应用形态与IDE自带的模板可供选用与免安装的元服与IDE中自带模板的选择 三、以元服务&#xff0c;远程模拟器为例说明IDE整体结构 1区是工程目录结构&#xff0c;是最基本的配置与开发路径等的认知。 2区是代码开发与修改区&#xff0c;是开发…

分支分支分支分支

分支 查看分支 git branch -v 创建分支 git branch 分支名 切换分支 git checkout 分支名 合并分支 git merge 分支名 把指定的分支合并到当前分支上

【CMU15-445 Part-11】Join Algorithms

Part11-Join Algorithms Why Do We Need to Join? Join其实是关系数据库和范式化表时候所产生的副产物。 也就是说我们范式化表是为了减少冗余信息&#xff0c;而我们使用join就是为了去重建reconstruct 这些原本的tuple Join Algorithms 主要关注两表的inner equijoin a…

UE5学习笔记(1)——从源码开始编译安装UE5

目录 0. 前期准备1. Git bash here2. 克隆官方源码。3. 选择安装分支4. 运行Setup.bat&#xff0c;下载依赖文件5. 运行GenerateProjectFiles.bat生成工程文件6. 生成完成&#xff0c;找到UE5.sln/UE4.sln7. 大功告成 0. 前期准备 0.1 在windows的话&#xff0c;建议装一个Git…

基于SpringBoot的驾校管理系统

基于SpringBootVue的驾校管理系统、前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;管理员、用户、教练 管理员&#x…

Python 可迭代对象、迭代器、生成器

可迭代对象 定义 在Python的任意对象中&#xff0c;只要它定义了可以返回一个迭代器的 __iter__ 魔法方法&#xff0c;或者定义了可以支持下标索引的 __getitem__ 方法&#xff0c;那么它就是一个可迭代对象&#xff0c;通俗的说就是可以通过 for 循环遍历了。Python 原生的列…

(手撕)数据结构--->堆

文章内容 目录 一&#xff1a;堆的相关概念与结构 二&#xff1a;堆的代码实现与重要接口代码讲解 让我们一起来学习:一种特殊的数据结构吧&#xff01;&#xff01;&#xff01;&#xff01; 一&#xff1a;堆的相关概念与结构 在前面我们已经简单的学习过了二叉树的链式存储结…

城市管网污水监测方案,科技助力污水排放管理!

根据《国务院办公厅关于加强入河入海排污口监督管理工作的实施意见》各地要明确“水污染&#xff0c;谁治理”和政府兜底的原则&#xff0c;明确排污主体责任。根据排污口类型集中整治&#xff0c;划分主体。加大私设暗管借道排污的监察力度溯源主体责任。加强科技研发&#xf…

【数据结构】C++实现AVL平衡树

文章目录 1.AVL树的概念2.AVL树的实现AVL树结点的定义AVL树的插入AVL树的旋转左单旋右单旋左右双旋右左双旋插入代码 AVL树的验证AVL树的查找AVL树的修改AVL树的删除AVL树的性能 AVL树的代码测试 1.AVL树的概念 二叉搜索树虽然可以提高我们查找数据的效率&#xff0c;但如果插…

计网第四章(网络层)(八)(最短路径优先协议OSPF)

在第七节&#xff08;计网第四章&#xff08;网络层&#xff09;&#xff08;七&#xff09;_永无魇足的博客-CSDN博客&#xff09;我们总结了路由信息协议RIP。在最后我们提到了RIP协议有坏消息传的慢的问题&#xff0c;这是距离向量算法的本质决定的&#xff0c;所以这种问题…

c语言练习59:深入理解char类型的取值范围

深入理解char类型的取值范围 例如&#xff1a; #include <stdio.h> int main() {char a[1000];int i;for(i0; i<1000; i){a[i] -1-i;}printf("%d",strlen(a));return 0; }结果为255 ab以%d的形式打印结果为&#xff1a;300 而c由于unsigned char的取值范…

【CMU15-445 Part-9】Multi-Threaded Index Concurrency Control

Part09-Multi-Threaded Index Concurrency Control 多线程下索引的并发控制 Concurrency Control 强制所有访问数据结构的线程都使用某种协议或者某种方式。并发控制协议的概念&#xff1a;并发控制协议是一种当并发操作作用在一个共享对象上时DBMS用来确保correct的method。…

【杂记】git管理工具的相关应用

这里记录一些用git管理工具进行开发的命令&#xff0c;便于自己查看&#xff0c;我认为下面两篇博客写的很详细&#xff0c;但是为了自己方便查看&#xff0c;所以自己写了一些命令供自己进一步理解。gitee相对git来说更方便一些&#xff08;毕竟国内的不用担心墙&#xff09;&…

JavaEE 网络原理——TCP的工作机制(初篇 包含 UDP 协议的再次阐述)

文章目录 一、再次简述 UDP 协议二、再次简述 TCP 协议三、描述部分 TCP 内部的工作机制1. 确认应答2. 超时重传 前提&#xff1a; 在前面的文章中&#xff0c;我向大家分别简单介绍了 TCP 协议和 UDP 包装一个数据形成数据报发送信息。 除此之外&#xff0c;还通过代码编写了 …