初识Spring

C++性能优化实战:从内存访问到编译器优化的卡常技巧 在计算机程序设计中,性能优化是提升软件执行效率的核心技术。其原理在于通过减少不必要的计算、优化数据访问模式以及充分利用硬件特性,来降低程序的运行时间和资源消耗。这项技术的价值不仅体现在算法竞赛中帮助程序“压线AC”,更在于为高性能计算、游戏引擎、高频交易等对实时性要求极高的工程领域提供关键支撑。从应用场景来看,无论是科学计算中的大规模数据处理,还是在线服务中的高并发请求处理,性能优化都是确保系统稳定高效运行的基础。本文聚焦于C++语言中的常数优化(卡常),深入探讨如何通过优化内存访问模式、提高缓存命中率、协 阅读详情

什么是Spring

Spring是一个轻量级的,非注入式的框架。其目标是使应用程序对框架的依赖最小化,应用代码可以在没有Spring或者其他容器的情况下运行。

Spring的特点

①轻量级(Lightweight)
Spring 核心包容量不到1MBde 大小,可以在很多小型设备中使用Spring

②非侵入性(No intrusive)
增强应用程序组件的可重用性,减少对框架的依赖

③容器(Container)
根据配置文件自动生成对象及属性等,不用编写任何代码来产生对象

④Inversion of Control(IOC控制反转)与Dependency Injection(DI依赖注入)
IOC目的就是依赖于抽象;对象之间的关系由容器根据配置文件将依赖
注入指定的对象中

⑤AOP(Aspect-oriented programming)
基于代理及拦截器的机制,与Spring IOC 结合,采用运行时Weaving方式在
Spring框架的应用程序中使用各种声明式系统级服务。

⑥持久层(Persistent)
Spring提供DAO、编程事务与声明式事务,对于ORM工具(Hibernate、iBATIS)的整合及使用上简化。


Spring中两个重要的思想便是Inversion of Control(IOC控制反转)与Dependency Injection(DI依赖注入),下面谈谈对这两个思想的理解。


IOC控制反转的理解

如果一个类的合作对象的引用或依赖关系的管理由具体的对象来完成,会导致代码的耦合度和可测试性降低,这对面向对象系统的设计是非常不利的。控制反转就是,这些依赖关系通过把对象的依赖注入交给框架或者IOC来完成。

如有一个类FloppyWriter(底层模块)代表向软盘写入东西和一个类 Business(高层应用)要使用FloppyWriter的方法向软盘写入东西,那么

class FloppyWriter
{
    void saveToFloppy()
    {
        ……
    }

}
public class Business{
   private FloppyWriter writer=new FloppyWriter();
   public void save()
  {
      writer.saveToFloppy();//依赖于底层模块
  }
} 

直接在高层的应用程序中调用底层模块的API,导致应用程序对底层模块产生的依赖…

那么有一个问题:如果使用USB作为存储介质,该应用程序无法直接重用,需要修改。导致由于
底层模块的变化,造成高层的应用程序跟着变化。

为了解决上面的问题。可以对类进行如下改造,

public interface IDeviceWriter //接口,向设备写入
{
  public void saveToDevice();
} 

public class FloppyWriter implement IDeviceWriter
{
     public void saveToDevice()
     {
        //实际存储在软盘
     }
} 

public class Business{
   private IDeviceWriter writer;

    public void setDeviceWriter (IDeviceWriter writer)
     {
       this.writer=writer;
    } 
    public void save()
    {
        writer.saveToDevice();
    }
}

主程序:
Business bus=new Business();
bus.setDeviceWriter(new FloppyWriter());
bus.save();



//思考此时如果要向U盘写入文件怎么办,很简单建一个类USBWriter并实现save方法,并将主程序改为bus.setDeviceWriter(new FloppyWriter());

public class USBWriter implement IDeviceWriter{
     public void saveToDevice(){
     //实际存储在U盘
  }
} 

依赖关系的转移,高层模块不依赖于底层模块,必须依赖于抽象,实现必须依赖于抽象,而不是抽象依赖于实现。可以看到,无论底层的存储实现如何变动,对于Business类来说无须做任何修改。

DI依赖注入的理解

保留抽象接口,让组件依赖于抽象接口。当组件要与其他实际的对象发生依赖关系时,由抽象接口来注入依赖的实际对象。

有三种实现方式。
①Type 1 IoC:Interface injection(接口注入)
②Type 2 IoC: Setter injection(推荐使用)(setter方法注入)
③Type 3 IoC: Constructor injection(构造方法注入)

Type 1 IoC

public interface IDependency
{
  //在接口中声明注入方法
  public void saveToDevice(Map device);
} 
public class Business implement IDependency
{
    private Map device;
    public void saveToDevice(Map device)
    {
     this.device=device;//实现Business关系依赖
   }
}

使用该方式会要求实现接口,对象所在的容器也会使用这个接口,容器知道接口上的所有方法,所以可调用实现接口的对象完成依赖关系的注入!

依赖的接口越多,程序的侵入性越强,组件的重用性降低

Type 3 IoC

public class Business{
  public IDeviceWriter writer;
  public Business(IDeviceWriter writer)
  {
   this.writer=writer;
   }
  public void save()
  {
    writer.saveToDevice();
  }

//主程序
Business bus=new Business(new FloppyWriter());
bus.save();

使用该方式注入,可以在构造对象的同时,一并建立依赖关系,但如果依赖关系很多需要构造的参数很多,使用Type 2 IoC较为方便。

Type 2 IoC(重点,Spring的IOC容器)

//先实现接口
public interface IDeviceWriter //接口,向设备写入
{
  public void saveToDevice();
} 

//实现各个存储设备的写入

public class FloppyWriter implement IDeviceWriter
{
     public void saveToDevice()
     {
        //实际存储在软盘
     }
} 

public class USBWriter implement IDeviceWriter
{
     public void saveToDevice(){
     //实际存储在U盘
  }
} 

//实现business类
public class Business{
   private IDeviceWriter writer;

    public void setDeviceWriter (IDeviceWriter writer)
     {
       this.writer=writer;
    } 
    public void save()
    {
        writer.saveToDevice();
    }
}

//实现businessFactory工厂类获得business单例

public class businessFactory
{
    private static businessFactory factory;
    private Properties props;//通过属性文件读取包名
    private Business bus;
    private IDeviceWriter writer;

    businessFatory()
    {
        //在此实现通过属性文件获得包名并实现依赖注入
        bus=(Business)(Class.forName...);
        writer=(IDecviceWriter)(Class.forName...);
        bus.setWriter(writer);//完成注入
    }
}

//实现主程序
public class BusinessExample
{
    //主函数
    main
    {
        BusinessFactort bus=new BusinessFactory();
    }
}

如果使用了Type 2 IoC,需要改变写入的存储方式,如FloppyWriter 改为USBWriter,只需改变属性文件。但是Spring的为xml文件,原理是一样的。

如果有什么不懂欢迎评论。

【Spring】 ——初识Spring 容器是⽤来容纳某种物品的(基本)装置。——来⾃:百度百科我们想想,之前我们接触的容器有哪些?List/Map -> 数据存储容器Tomcat -> Web 容器既然 Spring 是⼀个 IoC容器,重点应该是在“容器”⼆字上,那么它就具备两个最基础的功能:将对象存⼊到容器;从容器中取出对象所以Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能⼒。 阅读详情

相关推荐

【WRF-CMAQ实战指南】从环境配置到测试案例运行全解析

本文详细解析了WRF-CMAQ从环境配置到测试案例运行的全过程,包括系统环境检查、依赖库安装、源码获取与项目初始化、关键配置技巧、编译实战与排错、测试案例运行验证等关键步骤。通过实战指南,帮助用户快速掌握WRF-CMAQ的安装和运行技巧,提升空气质量模拟的效率。

year5的博客 245

springboot项目前台通过地址栏传CST格式的时间到后台多十四个小时的解决办法

废话不多说,直接正题。 <c:forEach items="${requestScope.times}" var="time"> <tr> <td>${time.id}</td> <td>${time.createDate}</td> ...

zhang33565417的博客 2393

Windows平台MuJoCo仿真环境配置与Qt集成实战

本文详细介绍了在Windows平台上配置MuJoCo物理仿真环境并与Qt框架集成的完整实战流程。内容涵盖从环境准备、库文件配置、项目创建到核心代码编写的每一步,重点解决了Windows下常见的编译链接错误和路径问题,帮助开发者在Windows系统中高效搭建机器人仿真与可视化控制开发环境。

weixin_29221753的博客 173

初识Spring Boot框架

前面的铺垫文章已经连着写了六篇了,主要是介绍了Spring和SpringMVC框架,小伙伴们在学习的过程中大概也发现了这两个框架需要我们手动配置的地方非常多,不过做JavaEE开发的小伙伴们肯定也听说过“约定大于配置”这样一句话,就是说系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置,可是使用Spring或者SpringMVC的话依然有许多这样的东西需要我们进行配置...

weixin_30908941的博客 9896

VSCode玩转STM32:手把手教你配置EIDE插件与OpenOCD调试(附野火DAP配置文件详解)

本文详细介绍了如何在VSCode中配置EIDE插件与OpenOCD进行STM32开发,特别针对野火DAP调试器提供了配置文件详解。从基础环境搭建到深度调试技巧,帮助开发者高效完成STM32项目开发,实现现代化嵌入式开发工作流。

weixin_26905487的博客 553

【黑马-产品经理入门基础课笔记】01.认识产品经理

问题定义 ==> 可行性研究 ==> 需求分析。

2401_88466092的博客 1844

Spring初识(一)——准备工作

文章主要介绍使用Spring开发框架要做的准备工作

白手和3的博客 425

数字加网(一)— —概念及分色合成

由于大多数图像复制设备是二值设备,因此在图像复制过程中,必须先把连续调的灰度图像或彩色图像处理成二值的半色调图像,用单位面积的网点覆盖率来表现图像的颜色深浅变化。这个过程被称之为加网(Screening) 数字加网就是根据人眼视觉的空间混色特性,用人眼无法分辨的细小黑白点的单位覆盖面积来模拟灰度图像或彩色图像的层次变化,使得到

Sin_Geek成长の迹 8595

Spring学习之路——初识Spring

Spring学习之路——初识Spring 本篇文章将简单介绍Spring框架以及控制反转思想。本人新人小白一枚,此篇文章也相当于本人的一个小小的笔记,如有错误,欢迎大家指出。 一、简介 Spring的前身是由Rod Johnson创建的interface21框架。Spring在其基础上不断延申扩展,最终成为今天这个“航空母舰"。 ◆目的:解决企业应用开发的复杂性 ◆功能:使用基本的JavaB...

Zangjiji的博客 1664

CloudCompare点云变换保姆级教程:从平移、旋转到绕任意点旋转,一次搞定

本文提供CloudCompare点云变换的全面教程,涵盖从基础平移、旋转到绕任意点旋转的高级技巧。通过详细的操作步骤和实战案例,帮助用户掌握点云数据处理的核心技能,提升三维模型对齐和变换的效率与精度。

weixin_28717969的博客 291

【IPC】ONVIF Device Manager 测试工具

介绍onvif 协议测试工具

以实战经验介绍行业知识 1963

初识spring

Spring框架已发展成完整的开发生态圈,包含多个项目实现特定功能。主要学习内容包括核心的Spring Framework、快速开发的Spring Boot及微服务架构Spring Cloud。Spring家族发展历程丰富,现已成为Java领域主流技术栈。

jack_yang__的博客 219

从 ABAP 视角看 JSON :7.40 版本带来的那些改变

摘要:ABAP 对 JSON 的原生支持 随着企业系统与外部 API 的交互增多,ABAP 从 NetWeaver 7.40 开始原生支持 JSON 格式。通过复用现有 XML 基础设施,ABAP 团队引入 JSON-XML 概念,使用 sXML Library 和 IF_SXML=>CO_XT_JSON 常量处理 JSON 数据。开发人员可通过 CALL TRANSFORMATION 语句实现 ABAP 数据与 JSON 的双向转换,大幅简化了与外部系统的数据交互。这种标准化的 JSON 处理方式提

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 181

初识Spring———[SSM框架教程]

IoC、DI基础案例及分析

qq_63947426的博客 128

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring之初识

初识Spring Spring是java平台一个轻量级的解决方案,也就是说它是非侵入式的,即你的业务逻辑本身对spring框架没有依赖。但是spring也可以作为一站式的企业级解决方案,从最核心的依赖注入,到事务管理、AOP、ORM、web、消息、远程调用等都具有相应的模块,它被设计为模块化的,我们只需要选用我们需要的那些模块即可。 一、  依赖注入和控制反转 Spring的核心是依赖注入(

我的山水 1956

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Spring】初识Spring

初识Spring——简单易懂

潘潘的博客 390

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Spring】初识Spring MVC

Spring MVC是Java中十分常用的一个设计思想。其中的注解有多般变化,PostMapping是其中十分重要的注解。此外类注解和方法注解都有自己的标识。传递参数的方式有多种,需要仔细思考。源码Spring MVC。

Starc_的博客 1131

Spring——初识Spring

Spring——初识Spring 1.Spring简介 在我们之前使用的Servlet,JDBC,JSP进行JavaWeb开发的时候,有个著名的词叫做:“单体地狱”。代码量是相当的大,直到框架的出现才简化了Web开发。比如说我们之前学过的MyBatis,就是替代了JDBC的框架,让我们不去写复杂重复的JDBC代码。 后来又出现了开源框架:Spring(寓意着软件行业的春天),Spring 是一个轻...

qq_43411550的博客 329

Spring初识

一、什么是Spring框架? Spring框架是由于开发的复杂性而创建的,使用基本的JavaBean代替EJB; Spring框架还是一个轻量级的控制反转和面向切面的容器框架; Spring框架使用于包括服务器开发等的任何Java应用,使得Java程序更加便捷、高效、安全 二、什么是Spring容器或者叫SpringBean容器? Bean就是 Java对象,容器就是对Java对象的整个生命周期进行管理(包括创建、装配、销毁). 三、Spring的模块化组成结构 1. Core Container(核心容

nefss_的博客 788

初识Spring框架

目录1、为什么要学框架2、Servlet vs SpringBoot2.1 servlet框架步骤2.2 SpringBoot框架的步骤2.3 二者比较3、Spring核心与设计思想3.1 初识Spring3.2 什么是IoC?3.3什么是DI4、Spring创建与使用4.1 创建 Spring项目4.2 存储 Bean 对象4.3 获取并使用Bean对象4.3 总结学习框架相当于从”小作坊“到”工厂“的升级,小作坊什么都需要自己来完成,而框架就在一定意义上实现了自动化,框架更加易用、简单且高效。①首先创建

weixin_46972127的博客 600
上一篇: 冒泡,插入,选择排序
下一篇: 如何判断一个二叉树是否为平衡二叉树。
cst_code
博客等级 码龄10年 4粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值