当前位置: 首页 > article >正文

spring214

spring父子容器:

为什么会有spring父子容器,,因为一般大一点的项目都是分模块的,,不同的人开发不同的模块,,可以在两个不同的模块中,,使用相同的beanName,,如果不是父子容器,,那么spring的配置文件,后面的会覆盖前面的,,有一个bean就会找不到,,,
要么写成兄弟容器,,两个并列的容器,,通过ctx.setParent()设置一个相同的父容器,,但是,这样不能从其中一个容器,获取到另一个容器的bean,两个容器是相互独立的,,,

所以需要父子容器,,在子容器中,可以获取父容器的Bean,在父容器中不能获取子容器的bean,,,就跟springmvc中一样,

   public static void main(String[] args) {// 父子容器ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext("merchant_beans.xml");// springmvc中  service中不能注入controller ,,===》 父子容器ClassPathXmlApplicationContext child = new ClassPathXmlApplicationContext("consumer_beans.xml");child.setParent(parent);// 重新初始化容器child.refresh();RoleService consumerBean = child.getBean(RoleService.class);merchant.RoleService merchantService = child.getBean(merchant.RoleService.class);}
scope作用域
  • singleton : 单例==》 容器启动会直接初始化
  • prototype: 多例 ==〉 懒加载,,使用到的时候才会初始化
  • request
  • session
  • application
  • websocket
@Bean
@Scope(scopeName = "prototype")User user(){return new User();}
工厂bean

spring整合第三方框架:

  • 静态工厂
public class OkHttpClientStaticFactory {public static OkHttpClient getInstance(){OkHttpClient.Builder builder = new OkHttpClient.Builder();builder.setReadTimeout$okhttp(5000);return builder.build();}}
    <bean class="com.cj.demo214.OkHttpClientStaticFactory" factory-method="getInstance" id="okHttpClient"/>
  • 实例工厂
public class OkHttpClientStaticFactory {private static OkHttpClient okHttpClient;static {OkHttpClient.Builder builder = new OkHttpClient.Builder();builder.setReadTimeout$okhttp(5000);okHttpClient = builder.build();}public static OkHttpClient getInstance(){return okHttpClient;}}
  <bean class="com.cj.demo214.OkHttpClientFactory" id="clientFactory"/><bean factory-bean="clientFactory" factory-method="getOkHttpClient" id="okHttpClient2"/>
  • FacotryBean : 用的最广泛的,,注入第三方bean
public class OkHttpClientFactoryBean implements FactoryBean<OkHttpClient> {/*** 返回真正的 bean对象* @return* @throws Exception*/@Overridepublic OkHttpClient getObject() throws Exception {OkHttpClient.Builder builder = new OkHttpClient.Builder();return builder.build();}/*** 返回对象的类型* @return*/@Overridepublic Class<?> getObjectType() {return OkHttpClient.class;}/*** 返回false : 只是不是singleton,,, 但不一定是prototype* @return*/@Overridepublic boolean isSingleton() {// 调父类的方法,默认就是truereturn FactoryBean.super.isSingleton();}
}
<!--    这里向spring注册的是,,这个factoryBean中getObject返回的值--><bean class="com.cj.demo214.OkHttpClientFactoryBean" id="client3"/>
 public static void main(String[] args) {ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");Object client3 = ctx.getBean("client3");// 获取factoryBean,,前面加上&Object factoryBean = ctx.getBean("&client3");System.out.println("client3.getClass() = " + client3.getClass());System.out.println("factoryBean = " + factoryBean);}

FactoryBean默认是懒加载的,,,,

spring加载配置文件
<!--     将配置文件中的key-value,,, 注册到spring容器中-->
<context:property-placeholder location="classpath:db.properties"/>

或者使用 @PropertySource("classpath:db.properties")

后置处理器
  • BeanPostProcessor : bean的后置处理器,,所有的bean都会执行这个
  • BeanFactoryPostProcessor

bean初始化执行的方法:

  • 执行设置的 init-method ,,
  • 如果实现了InitializingBean 会执行afterPropertiesSet方法

bean的加载过程:
xml内容 ===〉 BeanDefinition ⇒ 根据beanDefinition的信息实例化bean ===》 给bean的属性赋值(@Autowired @Value等注解注入的值) ===> 调用bean的各种初始化方法 ===》 成品的bean

有两个地方可以对bean修改:
BeanFactoryPostProcessor : bean工厂的后置处理器,,这里会对beanDefinition进行修改,最终影响到生成的bean,,比如说${xxx}占位符,,就是在。BeanFactoryPostProcessor中拦截下来,获取BeanDefinition然后通过visitor ,遍历BeanDefinition并修改其中的属性值。。

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {/*** 只会执行一次,,,, 这个相当于spring容器,,只会执行一次后置处理* 这个时候 BeanDefinition 已经有了,,但是bean还没有生成* @param beanFactory  这个参数相当于 spring容器* @throws BeansException*/@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
//        beanFactory.getBeanDefinition("")// 获取spring容器中,所有的beanNameString[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();System.out.println(Arrays.toString(beanDefinitionNames));// bean的提前初始化,,,按理说此时bean是没有生成的,,, 这个比spring容器初始化更早
//        User user = beanFactory.getBean(User.class);
//        System.out.println("user = " + user);BeanDefinition userBeanDefinition = beanFactory.getBeanDefinition("user");//是一个专门用来访问BeanDefinition中属性的工具==》 直接操作 BeanDefinition 比较麻烦,spring中提供了这样一个访问器//BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(strVal -> {// 访问BeanDefinition中所有的值if (strVal.equals("zs")) {return "cc";}return strVal;});// 像 ${xxx} 占位符,,, 就是这样根据 visitor访问 BeanDefinition中的值,,如果发现是 占位符${xxx},, 就将这些占位符替换成spring容器中读取出来的值// 修改userBeanDefinition中的值visitor.visitBeanDefinition(userBeanDefinition);System.out.println("postProcessBeanFactory");}
}

BeanPostProcessor: bean的后置处理器,他起作用的时候,bean已经生成了,,此时就可以对已经生成的bean对象做一些修改,把已经生成的bean拦截下来,做一些修改

public class UserBeanPostProcessor implements BeanPostProcessor {/*** 所有的bean都会执行一边* 初始化之前* @param bean  对象本身* @param beanName 对象的名字* @return* @throws BeansException*/@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("post process initalization ");if (beanName.equals("user")){User user = (User) bean;user.setUsername("waterkid");return user;}return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);}/*** 初始化之后* @param bean* @param beanName* @return* @throws BeansException*/@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessAfterInitialization");return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);}
}

相关文章:

spring214

spring父子容器&#xff1a; 为什么会有spring父子容器&#xff0c;&#xff0c;因为一般大一点的项目都是分模块的&#xff0c;&#xff0c;不同的人开发不同的模块&#xff0c;&#xff0c;可以在两个不同的模块中&#xff0c;&#xff0c;使用相同的beanName&#xff0c;&a…...

AI 编程工具—Cursor 进阶篇 数据分析

AI 编程工具—Cursor 进阶篇 数据分析 上一节课我们使用Cursor 生成了北京房产的销售数据,这一节我们使用Cursor对这些数据进行分析,也是我们尝试使用Cursor 去帮我们做数据分析,从而进一步发挥Cursor的能力,来帮助我们完成更多的事情 案例一 房产销售数据分析 @北京202…...

搭建Deepseek推理服务

概述&#xff1a; 本文介绍用Open webui ollama搭建一套Deepseek推理服务&#xff0c;可以在web页面上直接进行对话。作为体验搭建的是Deepseek 7b参数版本 首先选择一个云厂商创建一台ubuntu系统的虚拟机&#xff0c;带公网IP&#xff0c;通过shell登录虚拟机完成以下操作&…...

GDB 调试入门教程

GDB 调试入门教程 1. sample.cpp1.1. Compile and Run 2. GDB 调试3. GDB commandsReferences GDB is a command line debugger. It is a good choice on Linux or WSL. On macOS, use LLDB instead. 1. sample.cpp (base) yongqiangyongqiang:~/workspace/yongqiang$ ls -l …...

STM32的HAL库开发---ADC

一、ADC简介 1、ADC&#xff0c;全称&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 把一些传感器的物理量转换成电压&#xff0c;使用ADC采集电压&#xff0c;然后转换成数字量&#xff0c;经过单片机处理&#xff0c;进行控制和显示。 2、常见的AD…...

6.编写正排索引切分字符串|倒排索引原理|引入jieba到项目(C++)

编写正排索引 继续编写incde.hpp #pragma once#include <iostream> #include <string> #include <vector> #include <fstream> #include <unordered_map> #include "util.hpp"namespace ns_index{struct DocInfo{std::string title;…...

在Windows系统上测试safari浏览器的兼容性

文章目录 前言手机端的safari浏览器能替代PC端吗在Windows上测试safari浏览器的兼容性的方法利用云服务使用虚拟机在Windows上下载虚拟机遇到的问题以及解决思路总结 前言 在测试网站的兼容性时需要用到safari浏览器&#xff0c;在没有Mac的情况下&#xff0c;又不想麻烦同事&…...

【设计模式】【结构型模式】桥接模式(Bridge)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

惠普HP Color LaserJet CP1215/1210彩色打印机打印校准方法

执行校准 &#xff08;用随机光盘安装驱动&#xff09;完整安装打印机驱动程序。安装驱动程序的操作方法请参考以下文章&#xff1a; 惠普HP Color laserjet cp1215激光打印机在windows 7下使用随机光盘安装驱动程序&#xff0c;安装完成后&#xff1b; 依次点击“开始”→“所…...

【雅思博客02】Virus!

Elementary ‐ Virus! (C0007) A: Oh great! This stupid computer froze again! That’s the third time today! Hey Samuel, can you come take a look at my PC? It’s acting up again. It must have a virus or something. B: Just give me a second; I’ll be right …...

模型GPU->NPU(Ascend)迁移训练简述

目录 一、迁移训练流程图解 二、详细流程步骤 1. 模型训练与日志记录 2. 跨平台精度对齐对比 3. 问题定位与修复 4. 迭代验证 三、关键技术点 四、常见问题与解决方案 一、迁移训练流程图解 通过华为云的modelart进行运行环境选型 北京四使用GPU进行模型训练&#xff…...

skywalking实现原理

SkyWalking 是一个开源的分布式应用性能监控&#xff08;APM&#xff09;系统&#xff0c;主要用于微服务、云原生应用的性能监控、追踪和故障诊断。其实现原理涉及多个核心模块和技术&#xff0c;以下是 SkyWalking 的实现原理概述&#xff1a; 1. 采集数据&#xff08;数据收…...

sql语言语法的学习

sql通用语法 sql分类 DDL(操作数据库和表) 操作数据库 操作表_查询 操作表_创建 举例&#xff1a; 操作表_删除 操作表_修改 DML(增删改表中数据) DML添加数据 DML删除数据...

3.buuctf [BSidesCF 2019]Kookie

进入题目页面如下 尝试弱口令密码登录&#xff0c;无果 显示无效密码 用题中给出的用户名和密码登录虽然成功但没得到flag 用burp suite抓包试试 看到username处显示cookie 题目说用admin登录 将username的值改为admin 拿到flag 最后拿到flag...

springboot245-springboot项目评审系统(源码+论文+PPT+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…...

Dify+Ollama+DeepSeek部署本地大模型+知识库搭建

前言 上一篇文章《OllamaDeepSeek部署本地大模型》我们已经知道如何在本地搭建自己的大模型了&#xff0c;不过想要让大模型能够根据我们个人或者企业的数据情况做出精准的回答&#xff0c;我们还需要将自己的数据投喂给大模型才可以。本篇文章我们将会使用一个开源项目dify集…...

每日一题——不同路径的数目与矩阵最小路径和

机器人路径问题与矩阵最小路径和 1. 机器人路径问题题目描述示例示例 1示例 2 解题思路动态规划 代码实现复杂度分析 2. 矩阵的最小路径和题目描述示例示例 1示例 2 解题思路动态规划 代码实现复杂度分析 总结 1. 机器人路径问题 题目描述 一个机器人在 (m \times n) 大小的地…...

143,【3】 buuctf web [GYCTF2020]EasyThinking

进入靶场 一开始那个题目名字就想到了框架 扫描目录 访问后自动下载了 找源码 <?php namespace app\home\controller;use think\exception\ValidateException; use think\facade\Db; use think\facade\View; use app\common\model\User; use think\facade\Request; use …...

Windows逆向工程入门之栈指令与核心机制深度解析

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Windows逆向工程入门&#xff1a;栈指令与核心机制深度解析 一、栈的核心概念与内存布局 二、栈操作指令详解 1. PUSH 与 POP 2. PUSHA/PUSHAD 与 POPA/POPAD 3. PUSHF/PUSHFD 与 P…...

腾讯混元hunyuan3d生成模型,本地搭建和使用

腾讯混元hunyuan3d生成模型,本地搭建和使用 腾讯混元hunyuan3d生成模型,本地搭建和使用一. 话不多说,我们直接上本地部署的详细步骤1. 将仓库拉到本地2. 下载2个模型, 注意这里推荐 先使用conda创建环境后在安装modelscope进行下载模型2.1 关于第一个模型我们要在 Hunyuan3D-1 …...

flutter image_cropper插件安装后 打包apk 报错命名空间问题

本篇文章主要讲解&#xff0c;Flutter安装完新依赖打包apk报错 A problem occurred configuring project ‘:image_cropper’. 命名空间问题的解决办法及原因说明。 日期&#xff1a;2025年2月15日 作者&#xff1a;任聪聪 一、报错现象&#xff1a; 报文信息&#xff1a; FAI…...

2025-2-15-4.5 链表(基础题)

文章目录 4.6 链表&#xff08;基础题&#xff09;206. 反转链表92. 反转链表II24. 两两交换链表中的节点 4.6 链表&#xff08;基础题&#xff09; 有一天我做题忽然发现要把一个数组完全倒着翻过来很费劲&#xff0c;今天看&#xff0c;链表为此而生啊。 206. 反转链表 题目…...

目标检测IoU阈值全解析:YOLO/DETR模型中的精度-召回率博弈与工程实践指南

一、技术原理与数学本质 IoU计算公式&#xff1a; IoU \frac{Area\ of\ Overlap}{Area\ of\ Union} \frac{A ∩ B}{A ∪ B}阈值选择悖论&#xff1a; 高阈值&#xff08;0.6-0.75&#xff09;&#xff1a;减少误检&#xff08;FP↓&#xff09;但增加漏检&#xff08;FN↑…...

免费大模型网站

腾讯元宝 腾讯元宝 秘塔搜索 秘塔搜索 超算互联网 超算互联网回答速度很慢 Chatbot Arena Chatbot Arena 大模型竞技场。...

【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第三节】

ISO 14229-1:2023 UDS诊断服务测试用例全解析&#xff08;安全访问0x27服务&#xff09; 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025-02-12 关键词&#xff1a;UDS安全访问、0x27服务、ISO 14229-1:2023、ECU安全验证 一、服务概述 安全访问服务&#xff0…...

macOS部署DeepSeek-r1

好奇&#xff0c;跟着网友们的操作试了一下 网上方案很多&#xff0c;主要参考的是这篇 DeepSeek 接入 PyCharm&#xff0c;轻松助力编程_pycharm deepseek-CSDN博客 方案是&#xff1a;PyCharm CodeGPT插件 DeepSeek-r1:1.5b 假设已经安装好了PyCharm PyCharm: the Pyth…...

java八股文-mysql

1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树&#xff0c;最坏情况o&…...

YOLO11环境搭建CUDA12.6

1.安装CUDA和cuDNN 1.1安装CUDA 1.1.1查看当前你的电脑显卡支持的最高CUDA版本,后面的安装不能超过它 通过命令的方式查看 输入nvidia-smi 1.1.2 下载CUDA 官网地址:CUDA Toolkit Archive | NVIDIA Developer 选择cuda_12.6.3 下载完成后,如下: 安装,一直下一步即可:…...

OpenEuler学习笔记(三十二):在OpenEuler上搭建项目管理平台

在OpenEuler上搭建一个支持网页和手持访问、且支持用户功能自定义的项目管理平台&#xff0c;可以选择多种开源工具。以下是基于 Redmine 的搭建方案&#xff0c;Redmine 是一个灵活的项目管理工具&#xff0c;支持网页和移动端访问&#xff0c;并且可以通过插件扩展功能。 1.…...

LabVIEW中的icon.llb 库

icon.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下&#xff0c;是 LabVIEW 系统中的一个重要库。它的主要功能是与图标相关的操作&#xff0c;提供了一些实用的 VI 用于处理 LabVIEW 图标的显示、修改和设置。通过该库&#x…...