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
英文地址,請注明出處:http://en.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;嚴重破壞海洋生態平衡。針對海洋垃圾污染這一主要問…