第一章:Spring 框架概述

1.1 Spring 框架的定义与背景

Spring 是一个开源的轻量级 Java 开发框架,于 2003 年由 Rod Johnson 创立,旨在解决企业级应用开发的复杂性。其核心设计思想是面向接口编程松耦合架构,通过分层设计(如表现层、业务层、数据访问层)实现各组件的独立复用,并通过 控制反转(IoC) 和 面向切面编程(AOP) 两大核心技术简化开发流程。

Spring 框架的定位是 Java SE/EE 全栈一站式框架,它不直接替代其他框架(如 MyBatis、Struts 等),而是通过集成机制整合各类技术,降低开发复杂度。

1.2 Spring 框架的核心优点
  1. 解耦与 IoC 管理
    • Spring 作为 “对象工厂”,负责创建和管理对象的生命周期及依赖关系,开发者无需手动创建对象,而是通过配置或注解让 Spring 注入依赖,大幅降低组件耦合度。
  2. AOP 编程支持
    • 通过切面编程,将横切关注点(如日志、事务、权限)与业务逻辑分离,避免代码冗余,提升可维护性。
  3. 声明式事务管理
    • 无需手动编写事务代码,通过注解或配置即可实现事务的提交、回滚,简化数据库操作。
  4. 便捷的测试支持
    • 集成 JUnit 4,通过注解(如 @RunWith(SpringJUnit4ClassRunner.class))可直接测试 Spring 管理的组件。
  5. 框架集成能力
    • 内置对主流框架(如 Hibernate、MyBatis、Spring MVC 等)的支持,通过配置即可完成整合。
  6. 简化 JavaEE API 调用
    • 对复杂的 JavaEE API(如 JDBC、JavaMail)进行封装,提供更简洁的接口,降低使用门槛。

第二章:Spring 的 IoC 核心技术

2.1 什么是 IoC(控制反转)

IoC(Inverse of Control)即 “控制反转”,指将对象的创建、初始化和依赖关系管理从应用代码中剥离,转由 Spring 容器负责。传统开发中,对象的生命周期由代码直接控制(如 new Object()),而 IoC 框架通过配置或注解 “反转” 了这种控制权,使应用代码仅需关注业务逻辑,无需关心对象创建细节。

2.2 IoC 解决的核心问题:降低程序耦合度
  • 传统开发的耦合问题
    若类 A 依赖类 B,则 A 内部需直接创建 B 的实例(如 B b = new B();),此时 A 与 B 强耦合,若 B 的实现类变更,A 的代码也需修改。
  • IoC 模式的改进
    通过 Spring 容器配置类 A 对类 B 的依赖,容器在创建 A 时自动注入 B 的实例(如通过构造器或 setter 方法)。此时 A 仅依赖 B 的接口,不关心具体实现,实现了接口与实现的解耦
2.3 IoC 的实现方式:依赖注入(DI)

IoC 的核心实现机制是 依赖注入(Dependency Injection,DI),即 Spring 容器在创建对象时,将其依赖的组件通过以下方式注入:

  1. 构造器注入
    • 通过类的构造方法传入依赖对象。
    • 示例(XML 配置):
      <bean id="userService" class="com.example.UserService"><constructor-arg ref="userDao" />
      </bean>
      
  2. Setter 方法注入
    • 通过类的 setter 方法传入依赖对象。
    • 示例(注解方式):
      @Service
      public class UserService {private UserDao userDao;@Autowiredpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}
      }
      
2.4 IoC 容器的核心接口
  • BeanFactory:Spring IoC 容器的基础接口,定义了加载、创建、管理 Bean 的基本功能。
  • ApplicationContext:BeanFactory 的子接口,扩展了国际化、事件发布、资源加载等功能,是 Spring 应用中常用的容器接口(如 AnnotationConfigApplicationContext)。
2.5 IOC的程序入门

创建Java工程,导入坐标依赖

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency></dependencies>

编写接口和实现类,编写具体的实现方法

packagecom.qcbyjy.service;​publicinterfaceUserService{​publicvoidhello();​}​​packagecom.qcbyjy.service;​publicclassUserServiceImplimplementsUserService{@Overridepublicvoidhello(){System.out.println("HelloIOC!!");}}

编写Spring核心的配置文件,在src目录下创建applicationContext.xml的配置 文件,名称是可以任意的,但是一般都会使用默认名称。

<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--IOC管理bean--><beanid="userService"class="com.qcbyjy.service.UserServiceImpl"/></beans>

为什么class是impl而不是,userservice?

因为 ioc管理bean ,bean是类。必须要可以实例化才行。

怎么确认他是配置文件的?

通过最顶部的配置信息确认 

把log4j.properties的配置文件拷贝到resources目录下,做为log4j的日志配置 文件。 编写测试方法。

packagecom.qcbyjy.test;​importcom.qcbyjy.service.UserService;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;​publicclassDemo1{​/***入门程序
*/@Testpublicvoidrun1(){//使用Spring的工厂
ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");//通过工厂获得类:UserServiceuserService=(UserService)applicationContext.getBean("userService");userService.hello();}​}

2.6  IOC技术总结

ApplicationContext接口,工厂的接口,使用该接口可以获取到具体的Bean对 象。该接口下有两个具体的实现类。springCould配置中心 ClassPathXmlApplicationContext,加载类路径下的Spring配置文件。 FileSystemXmlApplicationContext,加载本地磁盘下的Spring配置文件。

    @Testpublic void run0(){ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService=context.getBean("userService",UserService.class);userService.hello();}@Testpublic void  run1(){ApplicationContext context=new FileSystemXmlApplicationContext("D:\\Spring627\\src\\main\\resources\\applicationContext.xml");UserService userService=context.getBean("userService",UserService.class);userService.hello();}

 2.7 Spring框架的Bean管理的配置文件方式

 id属性,Bean起个名字,在约束中采用ID的约束,唯一,取值要求:必须以字 母开始,可以使用字母、数字、连字符、下划线、句话、冒号id:不能出现特殊 字符。

class属性,Bean 对象的全路径。
scope属性,scope属性代表Bean 的作用范围。
singleton单例(默认值),最常用的方式。
prototype 多例

request应用在Web项目中,每次HTTP请求都会创建一个新的 Bean
session应用在Web项目中,同一个HTTP Session 共享一个 BeanBean对象的创建和销毁的两个属性配置
说明:Spring初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean 的时候调用 bean 的两个生命周期方法
init-method,当bean 被载入到容器的时候调用 init-method 属性指定的方法destroy-method,当bean 从容器中删除的时候调用 destroy-method 属性指定的方法

<bean id="userService" class="com.qcby.service.UserServiceImpl" scope="prototype" init-method="init" destroy-method="destory"/>

 singleton单例

   @Testpublic void run2(){ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService=context.getBean("userService",UserService.class);UserService userService1=context.getBean("userService",UserService.class);System.out.println(userService);System.out.println(userService1);}

prototype 多例

2.8 实例化Bean对象的三种方式

默认是无参数的构造方法(默认方式,基本上使用)

<bean id="us" class="com.qcbyjy.service.UserServiceImpl" />

静态工厂实例化方式

package com.qcbyjy.demo1;​import com.qcbyjy.service.UserService;import com.qcbyjy.service.UserServiceImpl;​/*** 静态工厂方式
*/public class StaticFactory {​// 静态工厂方式
public static UserService createUs(){System.out.println("通过静态工厂的方式创建UserServiceImpl对
象...");// 编写很多业务逻辑 权限校验
returnnewUserServiceImpl();}​}​<beanid="us"class="com.qcbyjy.demo1.StaticFactory"factory-method="createUs"/>

实例工厂实例化方式

packagecom.qcbyjy.demo1;​importcom.qcbyjy.service.UserService;importcom.qcbyjy.service.UserServiceImpl;​/****动态工厂方式
**/publicclassDfactory{​publicUserServicecreateUs(){System.out.println("实例化工厂的方式...");returnnewUserServiceImpl();}​}​<beanid="dfactory"class="com.qcbyjy.demo1.Dfactory"/><beanid="us"factory-bean="dfactory"factory-method="createUs"/>

 第三章:DI依赖注入

3.1依赖注入的概述

IOC和DI的概念 IOC:InverseofControl,控制反转,将对象的创建权反转给Spring!! DI:DependencyInjection,依赖注入,在Spring框架负责创建Bean对象时, 动态的将依赖对象注入到Bean组件中!!

3.2属性的set方法注入值

编写属性,提供该属性对应的set方法,编写配置文件完成属性值的注入

packagecom.qcbyjy.service;​importcom.qcbyjy.dao.OrderDao;​publicclassOrderServiceImplimplementsOrderService{​//编写成员属性,一定需要提供该属性的set方法
privateOrderDaoorderDao;//一定需要提供该属性的set方法,IOC容器底层就通过属性的set方法方式注
入值
publicvoidsetOrderDao(OrderDaoorderDao){this.orderDao=orderDao;}​//消息
privateStringmsg;//年龄
privateintage;​publicvoidsetMsg(Stringmsg){this.msg=msg;}​publicvoidsetAge(intage){this.age=age;}​@OverridepublicvoidsaveOrder(){System.out.println("业务层:保存订单..."+msg+"-"+age);//调用
orderDao.saveOrder();}​}​​packagecom.qcbyjy.dao;
​publicclassOrderDaoImplimplementsOrderDao{​@OverridepublicvoidsaveOrder(){System.out.println("持久层:保存订单...");}​}​​<!--DI:依赖注入--><beanid="os"class="com.qcbyjy.service.OrderServiceImpl"><propertyname="orderDao"ref="od"/><propertyname="msg"value="你好"/><propertyname="age"value="30"/></bean><beanid="od"class="com.qcbyjy.dao.OrderDaoImpl"></bean>
3.3 属性构造方法方式注入值

对于类成员变量,构造函数注入。

packagecom.qcbyjy.demo2;​publicclassCar{​//名称
privateStringcname;//金额
privateDoublemoney;​publicCar(Stringcname,Doublemoney){this.cname=cname;this.money=money;}​@OverridepublicStringtoString(){return"Car{"+"cname='"+cname+'\''+",money="+money+
'}';}​}​<beanid="car"class="com.qcbyjy.demo2.Car"><constructor-argname="cname"value="大奔"/><constructor-argname="money"value="400000"/></bean>

 3.4  数组,集合(List,Set,Map),Properties 等的注入

packagecom.qcbyjy.demo3;​importjava.util.Arrays;importjava.util.List;importjava.util.Map;importjava.util.Properties;​publicclassCollectionBean{​//数组
privateString[]strs;publicvoidsetStrs(String[]strs){this.strs=strs;}​privateList<String>list;publicvoidsetList(List<String>list){this.list=list;}​privateMap<String,String>map;publicvoidsetMap(Map<String,String>map){this.map=map;}​privatePropertiesproperties;publicvoidsetProperties(Propertiesproperties){this.properties=properties;
}​@OverridepublicStringtoString(){return"CollectionBean{"+"strs="+Arrays.toString(strs)+",list="+list+",map="+map+",properties="+properties+'}';}}​<!--给集合属性注入值--><beanid="collectionBean"class="com.qcbyjy.demo3.CollectionBean"><propertyname="strs"><array><value>美美</value><value>小凤</value></array></property><propertyname="list"><list><value>熊大</value><value>熊二</value></list></property><propertyname="map"><map><entrykey="aaa"value="老王"/><entrykey="bbb"value="小王"/></map></property><propertyname="properties"><props><propkey="username">root</prop><propkey="password">123456</prop></props></property></bean>

第四章:多配置文件方式

4.1  多配置文件的加载方式

在src的目录下又多创建了一个配置文件,现在是两个核心的配置文件,那么加 载这两个配置文件的方式有两种!

主配置文件中包含其他的配置文件:<importresource="applicationContext2.xml"/>​
工厂创建的时候直接加载多个配置文件:ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");

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

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

相关文章

RabitQ 量化:既省内存又提性能

突破高维向量内存瓶颈:Mlivus Cloud RaBitQ量化技术的工程实践与调优指南 作为大禹智库高级研究员,拥有三十余年向量数据库与AI系统架构经验的我发现,在当今多模态AI落地的核心场景中,高维向量引发的内存资源消耗问题已成为制约系统规模化部署的“卡脖子”因素。特别是在大…

创客匠人:创始人 IP 打造的得力助手

在当今竞争激烈的商业环境中&#xff0c;创始人 IP 的打造对于企业的发展愈发重要。一个鲜明且具有影响力的创始人 IP&#xff0c;能够为企业带来独特的竞争优势&#xff0c;提升品牌知名度与美誉度。创客匠人在创始人 IP 打造过程中扮演着不可或缺的角色&#xff0c;为创始人提…

如何为虚拟机上的 Manjaro Linux启用 VMware 拖放功能

如果你的Manjaro 发行版本是安装在 VMware Workstation Player 上使用的 &#xff0c;而且希望可以通过拖放功能将文件或文件夹从宿主机复制到客户端的Manjaro 里面&#xff0c;那么可以按照以下的步骤进行操作&#xff0c;开启拖放功能。 在 VMware 虚拟机上安装 Manjaro 后&…

【C/C++】单元测试实战:Stub与Mock框架解析

C 单元测试中的 Stub/Mock 框架详解 在单元测试中&#xff0c;Stub&#xff08;打桩&#xff09;和Mock都是替代真实依赖以简化测试的技术。通常&#xff0c;Stub&#xff08;或 Fake&#xff09;提供了一个简化实现&#xff0c;用于替代生产代码中的真实对象&#xff08;例如…

工厂 + 策略设计模式(实战教程)

在软件开发中&#xff0c;设计模式是解决特定问题的通用方案&#xff0c;而工厂模式与策略模式的结合使用&#xff0c;能在特定业务场景下发挥强大的威力。本文将基于新增题目&#xff08;题目类型有单选、多选、判断、解答&#xff09;这一业务场景&#xff0c;详细阐述如何运…

Nuxt3中使用 Ant-Design-Vue 的BackTop 组件实现自动返回页面顶部

在现代 Web 应用中&#xff0c;提供一个方便用户返回页面顶部的功能是非常重要的。Ant Design Vue 提供了 BackTop 组件&#xff0c;可以轻松实现这一功能。本文将详细介绍如何在 Nuxt 3 项目中使用 <a-back-top/> 组件&#xff0c;并通过按需引入的方式加载组件及其样式…

在统信UOS(Linux)中构建SQLite3桌面应用笔记

目录 1 下载lazarus 2 下载sqlite3源码编译生成库文件 3 新建项目 4 设置并编译 一次极简单的测试&#xff0c;记录一下。 操作系统&#xff1a;统信UOS&#xff0c; 内核&#xff1a;4.19.0-arm64-desktop 处理器&#xff1a;D3000 整个流程难点是生成so库文件并正确加…

Host ‘db01‘ is not allowed to connect to this MariaDB server 怎么解决?

出现错误 ERROR 1130 (HY000): Host db01 is not allowed to connect to this MariaDB server&#xff0c;表示当前用户 test 没有足够的权限从主机 db01 连接到 MariaDB 服务器。以下是逐步解决方案&#xff1a; 1. 检查用户权限 登录 MariaDB 服务器&#xff08;需本地或通过…

打造高可用的大模型推理服务:基于 DeepSeek 的企业级部署实战

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;从“能部署”到“可用、好用、能扩展” 近年来&#xff0c;随着 DeepSeek、Qwen、Yi 等开源大模型的持续发…

Spring Boot 使用 ElasticSearch

第一步&#xff0c;开启本地的 ElasticSearch 启动 elasticSearch.bat npm run start (head 插件) 第二步&#xff0c;在 Spring Boot 项目中引入依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-hig…

软件开发的“中庸之道”:因势而为,心中有数

【软件工程】软件开发的“中庸之道”&#xff1a;因势而为&#xff0c;心中有数 在软件开发的方法论讨论中&#xff0c;我们常常陷入非此即彼的二元对立&#xff1a;要么追求极致的规范化和流程化&#xff0c;严格遵循软件工程的各项标准&#xff1b;要么完全摒弃方法论&#x…

Go和Elixir极简HTTP服务对比

Go 和 Elixir 都是我非常喜欢的编程语言&#xff0c;这次来对比下它们实现一个原生极简 HTTP 服务的过程。 Go 语言标准库自带了网络服务库&#xff0c;只需要简单几行代码就可以实现一个网络服务&#xff0c;这也是一开始它吸引我的一个方面。而 Elixir 标准库本身没有网络服…

为何要学习Objective-C?从环境搭建开始

目录 前言 Swift时代为何还要学Objective-C&#xff1f; 开发环境搭建 1. 安装Xcode 2. 创建第一个Command Line Tool项目 初识Objective-C代码 编写"Hello, Objective-C!" 编译运行程序 为什么Objective-C中的NSLog和NSString前面都有"NS"前缀&a…

ubuntu18.04安装 gcc 9以及2019版本tbb

一、安装gcc 9 ubuntu18.04默认是用的gcc7.5 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt-get install gcc-9 g-9 下面是配置优先用哪个版本的gcc和g &#xff0c;后面带的值越大越优先用谁&#xff0c;并且配置完全局生效不仅仅是在当…

JdbcUtils的三个版本以及sql注入问题

JDBC的工具类 1.0版本 JDBC的工具类 2.0版本&#xff08;智能一些&#xff09;&#xff0c;编写properties属性文件&#xff0c;程序就可以读取属性文件 JDBC的工具类 3.0版本&#xff0c;加入连接池对象 我们封装jdbc工具类是为了减少代码重复&#xff0c;方便开发&#xff0…

AS32系列MCU芯片I2C模块性能解析与调试

国科安芯推出的AS32X601内置的I2C模块提供了符合工业标准的两线串行制接口&#xff0c;可用于MCU和外部IIC设备的通讯。IIC总线使用两条串行线&#xff1a;串行数据线SDA和串行时钟线SCL。 IIC接口模块实现了IIC协议的标准模式和快速模式&#xff0c;支持多主机IIC总线架构。其…

钉钉小程序开发实战:打造一个简约风格的登录页面

在上一篇文章中&#xff0c;我们已经介绍了如何搭建钉钉小程序的基础环境&#xff0c;并完成了项目的初始化配置。本文将继续深入&#xff0c;手把手带你实现一个简约风格的登录页面&#xff0c;这是大多数企业级应用不可或缺的一部分。 钉钉小程序基于前端 Web 技术栈&#x…

论文研读2-1:多GNSS双历元纯相位定位-模型建立与误差分析

后续文章: 论文研读2-2&#xff1a;多GNSS双历元纯相位定位-固定模糊度精度增益 论文研读2-3&#xff1a;多GNSS双历元纯相位定位-定位精度分析 仅相位定位中的模糊度解算问题 在卫星导航定位中&#xff0c;载波相位测量是实现高精度定位的基础&#xff0c;但如果仅使用相位测…

Python----OpenCV(图像増强——图像平滑、均值滤波、高斯滤波、中值滤波、双边滤波)

Python----计算机视觉处理&#xff08;Opencv&#xff1a;图像噪点消除&#xff1a;滤波算法&#xff0c;噪点消除&#xff09; 一、图像平滑 图像平滑处理&#xff08;Smoothing Images&#xff09;&#xff0c;也称为图像模糊处理、图像滤波&#xff08;Images Filtering&am…

笔记:使用EasyExcel导入csv文件出现编码问题,导致导入数据全为null的解决方法

笔记&#xff1a;使用EasyExcel导入csv文件出现编码问题&#xff0c;导致导入数据全为null的解决方法 通常情况下&#xff0c;我们使用excel导入&#xff0c;但是部分情况下或者领导要求&#xff0c;我们需要使用csv导入文件&#xff0c;但是csv文件模板下载之后会变成系统当前…