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

【学习笔记】Spring IOC为何重要?

一、如果不使用Sping,如何进行开发?

需要程序员直接new对象:

UserDao userDao = new UserDaoImpl();

其中UserDaoImpl访问MySQL数据库,使用MySQL方式。

问题:如果需要切换SQL Server方式,就需要将UserDaoImpl中MySQL方式改为SQL Server方式,大规模工程时效率极低

二、引入工厂类

提前把MySQL和SQL Server的Dao层写好,然后通过工厂来创建dao:

UserDao userDao = BeanFactory.getUserDao();

public class BeanFactory {

public static UserDao getUserDao() {

return new UserMySQLDaoImpl();

}

}

这样需要修改数据库,只需要修改BeanFactory中返回值即可

问题:工厂类强依赖Dao实现类,Dao实现类删除直接影响代码编译

三、反射(一般项目不这么做,要避免随意删除类)

Class .forName("…….dao .impl.UserMySQLDaoImpl") .newInstance();

问题:文件路径硬编码,如果切换数据库,还是要修改代码

四、通过配置进行实例注入

新增配置文件factory.properties

userDao=…….dao .impl.UserMySQLDaoImpl

然后通过反射获取dao:

UserDao userDao =Class .forName(properties.getProperty("userDao")) .newInstance();

问题:其他Dao如ManagerDao也需要创建类似的方法如getManagerDao(),代码重复

五、统一使用getBean方法代替,使用传参区分类型

public static Object getBean(String beanName) {

try {

return Class.forName(properties.getProperty(beanName)).newInstance();

} catch (Exception e) {//

}

}

UserDao userDao = BeanFactory.getBean("userDao");

问题:每次调用getBean方法都会生成一个新的对象,造成资源浪费

六、单例模式避免对象重复创建(双检索+容器式单例)

public class BeanFactory {
private static final Map<String, Object> beanMap = new ConcurrentHashMap<>();
private static final Properties properties;


static {
// properties初始化
}


public static Object getBean(String beanName) {
if (!beanMap.containsKey(beanName)) {
synchronized (BeanFactory.class) {
if (!beanMap.containsKey(beanName)) {
try {
Object bean =
Class.forName(properties.getProperty(beanName)
).newInstance();
beanMap.put(beanName, bean);
return bean;
} catch (Exception e) {//
}
}
}
}
return beanMap.get(beanName);
}

}

Spring IOC思路跟以上是类似的,该思路可以帮助我们快速理解Spring IOC演进过程。
http://www.cnnetsun.cn/news/1929096.html

相关文章:

  • 八大网盘直链下载助手:免费开源工具实现下载速度10倍提升
  • Linux C编程基础知识(文件目录操作)
  • FaceFusion使用技巧:如何设置参数获得最佳换脸效果?
  • 破局高速与疲劳测量难题:DIC技术的全场动态视界
  • Nucleus Co-Op深度解析:单机游戏分屏多人协作的完整技术指南
  • 大模型应用开发入门指南:小白程序员轻松进阶,收藏必备!
  • 从理论到实践:基于Python与RealSense的JAKA机械臂手眼标定全流程解析
  • 三步掌握百度网盘秒传脚本:永久分享文件的终极解决方案
  • STK 12.2 与 MATLAB R2021a 联调避坑全记录:从环境配置到第一个Python脚本跑通
  • 激光SLAM实战解析——从特征点提取到匹配优化全流程
  • SITS2026图谱紧急预警:3类正在被淘汰的AI应用模式,及2025年前必须升级的4项架构能力
  • csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:分糖果
  • Java组件安全实战:FastJson漏洞利用与WAF绕过技巧
  • BibTeX参考文献实战指南:从入门到精通各类文献格式
  • STL算法库中的极值查找:从min_element/max_element到minmax_element的实战演进
  • 避开这些坑!在Windows上用TensorFlow部署YOLOv8模型的完整指南
  • 【评测系列2】从零实现 AgentBench评测系统:架构设计与实战
  • 模型热更新必须绕开的3个GPU内存陷阱,附NVIDIA Triton 3.4+自定义Backend实测对比报告
  • 【技术解析】GSConv与Slim-Neck:轻量级目标检测的平衡之道
  • 【2026倒计时预警】:SITS圆桌确认的3类“AI原生应用”将淘汰传统RPA/低代码平台
  • 深入拆解:一个PT100测温模块的硬件成本与设计取舍(附BOM清单)
  • QNAP Container Station部署MySQL后,Navicat连不上的3个常见原因及解决办法
  • 从零开始:KataGo围棋AI的完整配置与实战对弈指南
  • MATLAB实战:从语音信号到Mel Spectrogram(梅尔频谱图)的完整实现与参数调优
  • 如何部署并优化AOD-NET图像去雾模型
  • 功能安全——严重度(Severity)评估实战指南
  • 告别Homebrew安装烦恼:从零配置到完美卸载的一站式指南
  • 如何完整备份QQ空间:终极免费工具使用指南
  • 长沙儿童心理医院暖心指南与真实案例分享
  • 如何快速搭建物联网监控系统:Arduino IDE完整实战指南 [特殊字符]