Spring IoC容器与Bean管理

代码结构


spring01/
├── pom.xml
├── spring01.iml
└── src/├── main/│   ├── java/│   │   └── com/│   │       └── demo/│   │           ├── bean/│   │           │   ├── Demo.java│   │           │   ├── Emp1.java│   │           │   ├── Emp2.java│   │           │   └── User.java│   │           ├── dao/│   │           │   ├── UserDao.java│   │           │   └── impl/│   │           │       ├── MysqlUserDaoImpl.java│   │           │       └── OracleUserDaoImpl.java│   │           ├── factory/│   │           │   ├── Emp1Factory.java│   │           │   ├── Emp2Factory.java│   │           │   └── UserDaoFactory.java│   │           ├── service/│   │           │   ├── UserService.java│   │           │   └── impl/│   │           │       └── UserServiceImpl.java│   │           └── test/│   │               └── UserTest.java│   └── resources/│       ├── UserDao.properties│       ├── applicationContext-实例工厂创建Bean.xml│       ├── applicationContext-普通构建方法创建Bean.xml│       ├── applicationContext-静态工厂创建Bean.xml│       ├── applicationContext.xml│       └── logback.xml└── test/└── java/└── com/└── demo/├── LoggerTest.java├── TestDemo.java└── UserTest.java

该项目是一个Spring框架练习项目,主要围绕以下核心目标进行实践:

一、核心技术练习

  1. Spring IoC容器与Bean管理

    • 实现了多种Bean创建方式(普通构造方法、静态工厂、实例工厂)
    • 对应配置文件:applicationContext-*.xml系列文件
  2. 设计模式应用

    • 工厂模式:通过Emp1FactoryEmp2Factory等类实现对象创建封装
    • 接口编程:UserDao接口+Mysql/Oracle多实现类
  3. 分层架构实践

    com.demo
    ├── bean      // 数据模型层(User.java等实体类)
    ├── dao       // 数据访问层(数据库操作接口及实现)
    ├── service   // 业务逻辑层(服务接口及实现)
    └── factory   // 对象工厂层(创建Bean的工厂类)
    

二、功能模块说明

  • 数据访问:通过UserDao及实现类操作数据库,支持多数据库类型(MySQL/Oracle)
  • 依赖注入:使用Spring容器管理对象依赖关系
  • 日志系统:集成logback日志框架(logback.xml配置)
  • 配置管理:通过UserDao.properties实现配置外部化

三、测试覆盖

  • 单元测试LoggerTest(日志测试)、UserTest(用户功能测试)等测试类
  • 测试规范:遵循与主代码相同的包结构,确保测试代码可维护性

四、项目特点

  • 性质:通过多种配置文件和工厂类展示不同实现方式
  • 结构清晰:严格遵循Maven项目规范和分层架构设计
  • 可扩展性:通过接口和工厂模式预留功能扩展点

该项目适合初学者理解Spring核心概念、设计模式应用及企业级项目分层架构思想。

实体类 bean

package com.demo.bean;import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;public class Demo {private List<String> list;private Set<String> set;private Map<String,String> map;private Properties properties;public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public Set<String> getSet() {return set;}public void setSet(Set<String> set) {this.set = set;}public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}public Properties getProperties() {return properties;}public void setProperties(Properties properties) {this.properties = properties;}
}
package com.demo.bean;public class Emp1 {public  void update1(){System.out.println("Emp1的update1()方法被调用。。。  。。。");}
}
package com.demo.bean;public class Emp2 {public  void update2(){System.out.println("Emp2的update2()方法被调用。。。  。。。");}
}
package com.demo.bean;public class User {private  Integer userId;private  String username;private  String password;public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"userId=" + userId +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

dao层


import com.demo.bean.User;public interface UserDao {public  boolean updateUser(User user);
}import com.demo.bean.User;
import com.demo.dao.UserDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MysqlUserDaoImpl implements UserDao {@Overridepublic boolean updateUser(User user) {Logger logger = LoggerFactory.getLogger(MysqlUserDaoImpl.class);logger.info("Mysql正在进行修改操作:updateUser();");return true;}
}import com.demo.bean.User;
import com.demo.dao.UserDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class OracleUserDaoImpl implements UserDao {@Overridepublic boolean updateUser(User user) {Logger logger = LoggerFactory.getLogger(OracleUserDaoImpl.class);logger.info("Oracle正在进行修改操作:updateUser();");return true;}
}

简单工厂模式


import com.demo.bean.Emp1;public class Emp1Factory {
public static Emp1 getInstance(){return new Emp1();
}
}package com.demo.factory;import com.demo.bean.Emp2;public class Emp2Factory {public Emp2 getInstance() {return new Emp2();}
}package com.demo.factory;import com.demo.dao.UserDao;import java.io.InputStream;
import java.util.Properties;public class UserDaoFactory {public  UserDao getInstance() {UserDao userDao = null;try {//读取属性文件Properties properties = new Properties();InputStream in = UserDaoFactory.class.getClassLoader().getResourceAsStream("UserDao.properties");properties.load(in);//通过key获取全名字符串String userDaoFullName = properties.getProperty("userDao");//通过反射获取类的实例对象userDao = (UserDao) Class.forName(userDaoFullName).newInstance();} catch (Exception e) {e.printStackTrace();}return userDao;}
}

service层

import com.demo.bean.User;public interface UserService {public boolean updateUser(User user);
}package com.demo.service.impl;import com.demo.bean.User;
import com.demo.dao.UserDao;
import com.demo.factory.UserDaoFactory;
import com.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** 1.UserDao 的实现类不由UserServiceImpl来决定,而是由UserDaoFactory来决定<第一种>* 2.控制权从UserServiceImpl转移到了UserDaoFactory,这就是控制反转IOC/DI*/
@Service
public class UserServiceImpl  implements UserService{/** <第一种>UserDaoFactory userDaoFactory=new UserDaoFactory();UserDao userDao=userDaoFactory.getInstance();*/@Autowiredprivate   UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}// private UserDao userDao=new UserDaoFactory.getInstance();//报错// private UserDao userDao=new MysqlUserDaoImpl();//private UserDao userDao=new OracleUserDaoImpl();@Overridepublic boolean updateUser(User user) {return userDao.updateUser(user);}
}

测试

日志测试

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LoggerTest {@Testpublic void loggerTest() {//System.out.println(LoggerFactory.getLogger("hello"));Logger logger = LoggerFactory.getLogger(LoggerTest.class);//slf4j日志的级别logger.trace("trace");logger.debug("debug");logger.info("info");logger.warn("warn");logger.error("error");//拼接logger.info("Welcome to {} {} ", "www.51zxw.net", "go!");}}
测试 applicationContext.xml 配置文件的配置
package com.demo;import com.demo.bean.Demo;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.*;public class TestDemo {Logger logger = LoggerFactory.getLogger(LoggerTest.class);@Testpublic void testDemo() {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Demo demo = (Demo) context.getBean("demo");List<String> list = demo.getList();logger.info("list----------------------");for (String s : list) {logger.info(s);}logger.info("set----------------------");Set<String> set = demo.getSet();for (String s : set) {logger.info(s);}logger.info("map----------------------");Map<String, String> map = demo.getMap();Set<String> keySet = map.keySet();Iterator<String> iterator = keySet.iterator();while (iterator.hasNext()) {String key = iterator.next();String value = map.get(key);logger.info(key + "  " + value);}logger.info("properties----------------------");Properties properties = demo.getProperties();String userId = properties.getProperty("userId");String username = properties.getProperty("username");String password = properties.getProperty("password");logger.info(userId);logger.info(username);logger.info(password);}
}
测试其他集中配置文件管理Bean
package com.demo;import com.demo.bean.Emp1;
import com.demo.bean.Emp2;
import com.demo.bean.User;
import com.demo.dao.UserDao;
import com.demo.service.UserService;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 1.从SpringIOC容器工厂中获取一个User对象* a。获取工厂BeanFactory* b。getBean()返回对象* 2.ApplicationContext是BeanFactory的子接口(实际上也是工厂)*/
public class UserTest {Logger logger = LoggerFactory.getLogger(LoggerTest.class);/*** 测试普通构造方法创建的Bean*/@Testpublic void userTest() {//获取BeanFactory的子接口,它是用来获得配置在SpringIOC容器的对象ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//从SpringIOC容器工厂中获取一个User对象User user = (User) context.getBean("user");if (null != user) {logger.info(user.toString());}}/*** 测试普通构造方法创建的Bean*/@Testpublic void userDaoTest() {//获取BeanFactory的子接口,它是用来获得配置在SpringIOC容器的对象ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-实例工厂创建Bean.xml");//从SpringIOC容器工厂中获取一个User对象UserDao userDao = (UserDao) context.getBean("userDao");if (null != userDao) {userDao.updateUser(null);}}/*** 静态工厂创建Bean*/@Testpublic void emp1Test() {//获取BeanFactory的子接口,它是用来获得配置在SpringIOC容器的对象ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-实例工厂创建Bean.xml");//从SpringIOC容器工厂中获取一个User对象Emp1 emp1 = (Emp1) context.getBean("emp1");if (null != emp1) {emp1.update1();}}/*** 实例工厂创建Bean*/@Testpublic void emp2Test() {//获取BeanFactory的子接口,它是用来获得配置在SpringIOC容器的对象ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-实例工厂创建Bean.xml");//从SpringIOC容器工厂中获取一个User对象Emp2 emp2 = (Emp2) context.getBean("emp2");if (null != emp2) {emp2.update2();}}@Testpublic void userServiceTest() {//获取BeanFactory的子接口,它是用来获得配置在SpringIOC容器的对象ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//从SpringIOC容器工厂中获取一个User对象UserService userService = (UserService) context.getBean("userService");if (null != userService) {userService.updateUser(null);}}
}
测试第一种被UserDaoFactory来决定实现的方式

要解开注解,UserServiceImpl代码改为

    UserDaoFactory userDaoFactory=new UserDaoFactory();UserDao userDao=userDaoFactory.getInstance();
//    @Autowired
//    private  UserDao userDao;
// 其余不变
package com.demo.test;import com.demo.bean.User;
import com.demo.service.UserService;
import com.demo.service.impl.UserServiceImpl;public class UserTest {public static void main(String[] args) {UserService userService=new UserServiceImpl();User user=new User();userService.updateUser(user);}
}

配置文件

applicationContext.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="user" class="com.demo.bean.User"><!--  为对象注入属性值   --><property name="userId" value="1"></property><property name="username" value="张三"></property><property name="password" value="123456"></property></bean><!-- 1.创建属性对象MysqlUserDaoImpl(如果是Besn类型)a.必须添加setter()方法注入属性;b.通过构造方法注入属性2.创建userService--><bean id="userDao" class="com.demo.dao.impl.MysqlUserDaoImpl"></bean><bean id="userService" class="com.demo.service.impl.UserServiceImpl"><!--    ref是通过引用userDao,然后找到实现类    --><property name="userDao" ref="userDao"></property></bean><!--集合属性的注入:list:添加list节点,然后如果集合中的数据是引用数据类型需要使用ref节点,如果是基本数据类型用valueset:添加set节点,然后如果集合中的数据是引用数据类型需要使用ref节点,如果是基本数据类型用valuemap:添加map节点,由于map中储存的是key和value键值对,需要添加一个entry节点对应key,如果数据是引用数据类型需要使用ref节点,如果是基本数据类型用value对应value,如果数据是引用数据类型需要使用ref节点,如果是基本数据类型用valueproperties:添加props节点,然后在添加prop--><bean id="demo" class="com.demo.bean.Demo"><property name="list"><list><value>乔丹</value><value>科比</value><!--<bean>ref的配置</bean>--><!--                <ref>如果是类类型,或者引用数据类型,需要ref</ref>--></list></property><property name="set"><set><value>姚明</value><value>易建联</value><value>王致和</value></set></property><property name="map"><map><entry><key><value>001</value></key><value>篮球</value></entry><entry><key><value>002</value></key><value>足球</value></entry><entry><key><value>003</value></key><value>乒乓球</value></entry></map></property><property name="properties"><props><prop key="userId">1</prop><prop key="username">test</prop><prop key="password">123456</prop></props></property></bean>
</beans>

applicationContext-实例工厂创建Bean.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"><!--采用实例工厂创建Bean1.创建Emp22.创建Emp2Factory静态工厂3.编写配置文件,注意和普通工厂对比,多两个属性配置factory-method="静态方法名"factory-bean属性的配置总结:相比普通构造方法创建Bean而言稍微麻烦一些,所以很少用--><bean id="emp2Factory" class="com.demo.factory.Emp2Factory"></bean><bean id="emp2" factory-bean="emp2Factory" factory-method="getInstance"></bean>
</beans>

applicationContext-普通构建方法创建Bean.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"><!--    Spring容器--><!--采用普通的构造方法来创建Bean--><bean id="userService" class="com.demo.service.impl.UserServiceImpl"></bean><bean id="userDao" class="com.demo.dao.impl.MysqlUserDaoImpl"></bean><!-- 采用普通的构建方法创建User--><bean id="user" class="com.demo.bean.User"></bean></beans>

applicationContext-静态工厂创建Bean.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
1.创建Emp1
2.创建Emp1Factory静态工厂
3.编写配置文件,注意和普通工厂对比,多一个属性配置factory-method="静态方法名"总结:相比普通构造方法创建Bean而言稍微麻烦一些,所以很少用
-->
<bean id="emp1" class="com.demo.factory.Emp1Factory" factory-method="getInstance"></bean></beans>

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--输出日志到控制台 appender追加--><appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"><!--负责把事件转成字符串,格式化日志信息的输出--><layout><pattern><!--%p是日志优先级%d是日期,%msg是日志消息%n换行-->[%p]%d-%msg%n</pattern></layout></appender><appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>debug</level><onMatch>DENY</onMatch></filter><encoder><pattern>[%p]%d-%msg%n</pattern></encoder><!-- 指定文件的输出位置--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern></fileNamePattern></rollingPolicy></appender>
<!-- 控制台可以输出的级别   --><root level="info"><appender-ref ref="consoleLog"></appender-ref><appender-ref ref="fileLog"></appender-ref></root>
</configuration>

UserDao.properties

userDao=com.demo.dao.impl.OracleUserDaoImpl

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

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

相关文章

【QT】概述

个人主页&#xff1a;Guiat 归属专栏&#xff1a;QT 文章目录1. Qt基础入门1.1 什么是Qt1.2 Qt的历史与发展1.3 Qt的核心特性2. Qt架构深度解析3. Qt开发环境搭建4. Qt应用开发实战4.1 项目结构4.2 设计用户界面4.3 实现功能逻辑4.4 数据持久化4.5 美化界面4.6 添加动画效果5. …

直播带货系统源码开发:山东布谷科技9年海内外电商直播研发技术深耕之路

在数字化浪潮的席卷下&#xff0c;电商行业历经多次变革&#xff0c;直播带货作为其中的新兴力量&#xff0c;已成为推动商品销售与品牌传播的关键引擎。山东布谷科技&#xff0c;凭借其在直播带货系统开发领域长达9年的深厚积淀&#xff0c;为电商直播带货系统源码定制开发提供…

20250731解决RK3588的AIOT参考设计刷机之后可以启动但是断电进MASKROM模式

20250731解决RK3588的AIOT参考设计刷机之后可以启动但是断电进MASKROM模式 2025/7/31 20:42缘起&#xff1a;编译RK3588原厂的Android14、buildroot(linux-6.1)的EVB7V11之后刷AIOT&#xff0c;可以启动。 但是通过命令关机之后&#xff1a;按POWER按键无法启动。 Android14 re…

永洪科技华西地区客户交流活动成功举办!以AI之力锚定增长确定性

在全球经济进入“慢周期”的背景下&#xff0c;企业对确定性增长工具的渴求达到前所未有的高度。近日&#xff0c;永洪科技在成都成功举办华西地区客户交流会&#xff0c;以“拥抱AI迈进数据智能时代”为主题&#xff0c;汇聚金融、制造、能源、消费品等领域的百余家头部企业代…

Electron 作品【AI聊天】桌面应用 —— 系列教程(含开源地址)

效果预览 开源地址 https://gitee.com/sunshine39/electron-vue3-AIchat 系列教程 Electron Forge【实战】桌面应用 —— AI聊天&#xff08;上&#xff09;Electron Forge【实战】桌面应用 —— AI聊天&#xff08;中&#xff09;Electron Forge【实战】桌面应用 —— AI聊天&…

JS--获取事件的子元素与父元素

原文网址&#xff1a;JS--获取事件的子元素与父元素-CSDN博客 简介 本文介绍JS如何获取事件的子元素与父元素。 情景描述 事件监听写在父元素上&#xff0c;我点击子元素时触发了事件&#xff0c;怎样通过事件获取子元素和这个父元素&#xff1f; 点击子元素时&#xff0c…

PPT自动化 python-pptx - 11 : 备注页 (Notes Slides)

在 PowerPoint 演示文稿的自动化处理中&#xff0c;备注页的操作常常被忽略&#xff0c;但实际上它在演讲者辅助、内容管理等场景中有着重要作用。本文将结合 python-pptx 库&#xff0c;详细讲解 PowerPoint 备注页的概念、与备注母版的关系&#xff0c;以及如何通过代码实现备…

【Python小工具】图片转PDF

文章目录0 前言1 主要功能的实现2 拖拽运行的实现3 检查细节【未成功实现】4 总结0 前言 不知道大家是否遇到过这种情况&#xff0c;提交材料时需要将多个图片材料整合到一个PDF中上传。这个时候我们需要找一个工具&#xff0c;其作用为接收我们给它的若干张图片&#xff0c;并…

零售消费行业研究系列报告

消费者洞察报告&#xff1a;即时零售美妆用户消费行为跃迁 食品饮料行业深度&#xff1a;新消费研究之三&#xff1a;即时零售应需而生&#xff0c;酒类品牌或迎新机遇 2025年上半年连锁零售门店发展蓝皮书 商贸零售行业新消费细分赛道投资机会梳理&#xff1a;新消费势能向…

Uniapp 验证 HTTPS 协议

Uniapp 中 验证 HTTPS协议的是示例代码<template><view class"content"><view style"margin-top: 20px;"><text>sslVerify : {{text}}</text></view><view><button click"testSslVerify">sslVe…

可视化图解算法57:字符串的排列

牛客网 面试笔试 TOP101 | LeetCode 3437. 全排列III 1. 题目 描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BA…

Go语言常量

目录 前言&#xff1a; 1、const声明常量 2、一次声明多个常量 前言&#xff1a; 这次来学习一下Go语言中的常量&#xff0c;在上一期中我学习了Go语言中的变量&#xff0c;如果有兴趣可以看看我往期的文章&#xff0c;或者点击Go语言声明变量。 相对于变量&#xff0c;常量的…

SelectDB:新一代实时数仓的核心引擎与应用实战

> 数据价值随时间流逝而衰减,而SelectDB让企业在数据洪流中抓住了每一秒的价值 在数字化转型浪潮中,企业数据呈现**爆发式增长**,传统数据仓库在实时性、查询效率和成本控制方面遭遇严峻挑战。中通快递的案例极具代表性——其原有架构处理分钟级查询时,资源消耗巨大,…

华为OD机考2025C卷 - 分配土地 (Java Python JS C++ C )

题目描述 从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。 某天集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡献的村民,请问此次分配土地,做出贡献的村民种最大会分配多大面积? 输入描述 第一行输入 m 和 n, m 代…

NetBSD notes

文章目录the introduce to NetBSDreferencesthe introduce to NetBSD NetBSD is a Unix-like Open Source operating system, which can run in many hardware platforms , and is advantageous to production and research.> boot hd0a:netbsd is used for booting NetBSD…

【数据迁移】Windows11 下将 Ubuntu 从 C 盘迁移到 D 盘

由于个人情况存在差异&#xff0c;请在参考本文进行数据迁移前后多方比对确认&#xff0c;确保无误后再谨慎操作&#xff01; 【2025-08-03补充】运行过程中发现实际上 docker 的迁移工作可能更为复杂&#xff01;强烈不推荐本文的 docker 迁移方法&#xff08;本文已翻车&…

Java面试(常考基础知识点)总结

1. 面向对象三大特性相关 1.1 三大特性 封装&#xff1a;对抽象的事物抽象化成一个对象&#xff0c;并对其对象的属性私有化&#xff0c;同时提供一些能被外界访问属性的方法&#xff1b;继承&#xff1a;子类扩展新的数据域或功能&#xff0c;并复用父类的属性与功能&#x…

[Shell编程] 零基础入门 Shell 编程:从概念到第一个脚本

目录 一、什么是 Shell&#xff1f;—— 连接用户与系统的 "桥梁" 二、常见的 Shell 类型 —— 不同系统的 "操作面板" 三、Shell 能做什么&#xff1f;—— 不止于 "输入命令" 1️⃣命令行操作&#xff1a;这是最基础的功能。通过ls&#x…

【数据结构】排序(sort) -- 插入排序

目录 一、插入排序 二、直接插入排序&#xff08;straight insertion sort&#xff09; 1. 思路介绍 2. 代码实现 3. 特性总结 三、希尔排序&#xff08;Shell sort&#xff09; 1. 思路介绍 2. 代码实现 3. 特性总结 四、总结 一、插入排序 常见的排序算法有&…

水面垃圾清扫船cad【6张】三维图+设计说明书

海洋吸尘器结构设计 摘 要 近年来&#xff0c;随着经济的快速发展&#xff0c;海洋产业及海上活动的增加&#xff0c;导致海洋漂浮垃圾越来越多&#xff0c;对沿岸的居民和海洋的生物的生命安全造成了很大的威胁&#xff0c;严重破坏海洋生态平衡。针对海洋垃圾污染这一主要问…