示例:spring xml+注解混合配置

以下是一個 Spring XML + 注解的混合配置示例,結合了 XML 的基礎設施配置(如數據源、事務管理器)和注解的便捷性(如依賴注入、事務聲明)。所有業務層代碼通過注解簡化,但核心配置仍通過 XML 管理。


1. 項目結構

src/main/java
├── com.example.dao
│   └── UserDao.java           # DAO 接口
│   └── impl
│       └── UserDaoImpl.java   # DAO 實現類(注解驅動)
├── com.example.service
│   ├── UserService.java       # Service 接口
│   └── impl
│       └── UserServiceImpl.java # Service 實現類(@Service + @Transactional)
└── com.example.controller└── UserController.java    # Controller 類(@Controller)
resources
├── applicationContext.xml     # Spring 主配置文件
└── db.properties              # 數據庫配置文件

2. XML 配置 (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"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 1. 啟用組件掃描(自動發現 @Component, @Service, @Repository, @Controller) --><context:component-scan base-package="com.example"/><!-- 2. 數據源配置(通過 properties 文件注入) --><context:property-placeholder location="classpath:db.properties"/><bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"><property name="jdbcUrl" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!-- 3. JdbcTemplate 配置(用于 DAO 層) --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean><!-- 4. 事務管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 5. 啟用注解驅動的事務管理(@Transactional) --><tx:annotation-driven transaction-manager="transactionManager"/></beans>

3. DAO 層(注解驅動)

接口 (UserDao.java)
package com.example.dao;import com.example.model.User;
import org.springframework.stereotype.Repository;@Repository // 標記為 DAO 組件,自動被組件掃描發現
public interface UserDao {User findById(int id);
}
實現類 (UserDaoImpl.java)
package com.example.dao.impl;import com.example.dao.UserDao;
import com.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;@Repository // 替代 XML 中的 <bean> 定義
public class UserDaoImpl implements UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic User findById(int id) {String sql = "SELECT * FROM users WHERE id = ?";return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) ->new User(rs.getInt("id"), rs.getString("name")));}
}

4. Service 層(注解驅動 + 事務)

接口 (UserService.java)
package com.example.service;import com.example.model.User;public interface UserService {User getUserById(int id);
}
實現類 (UserServiceImpl.java)
package com.example.service.impl;import com.example.dao.UserDao;
import com.example.model.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; // 聲明事務@Service // 替代 XML 中的 <bean> 定義
@Transactional // 默認事務配置(REQUIRED 傳播行為)
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic User getUserById(int id) {return userDao.findById(id);}
}

5. Controller 層(注解驅動)

類 (UserController.java)
package com.example.controller;import com.example.model.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController // 替代 XML 中的 <bean> 定義
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users/{id}")public User getUser(@PathVariable int id) {return userService.getUserById(id);}
}

6. 模型類 (User.java)

package com.example.model;public class User {private int id;private String name;public User(int id, String name) {this.id = id;this.name = name;}// Getter 和 Setter 省略
}

7. 數據庫配置 (db.properties)

jdbc.url=jdbc:mysql://localhost:3306/testdb
jdbc.username=root
jdbc.password=secret

8. 啟動應用

主類 (Application.java)
package com.example;import com.example.controller.UserController;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Application {public static void main(String[] args) {// 初始化 Spring 上下文(僅加載 XML 配置)ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 通過組件掃描自動發現 UserControllerUserController userController = context.getBean(UserController.class);User user = userController.getUser(1);System.out.println("User: " + user.getName());// 關閉上下文context.close();}
}

關鍵點說明

  1. 混合配置的優勢

    • XML:管理數據源、事務管理器等基礎設施。
    • 注解:簡化業務層的依賴注入(@Autowired)和事務聲明(@Transactional)。
  2. 組件掃描

    • <context:component-scan> 自動發現 @Component@Service@Repository@Controller 注解的類,無需 XML 定義 Bean。
  3. 事務管理

    • <tx:annotation-driven> 啟用 @Transactional 注解,替代 XML 中的 AOP 事務配置。
  4. 依賴注入

    • 所有依賴通過 @Autowired 注入,無需 XML 中的 <property> 標簽。

常見問題排查

  1. Bean 未找到

    • 檢查 <context:component-scan> 的包路徑是否包含所有組件。
    • 確保類上有正確的注解(如 @Service@Repository)。
  2. 事務不生效

    • 檢查 @Transactional 是否添加到 public 方法。
    • 確保 <tx:annotation-driven> 已配置且事務管理器正確。
  3. 數據庫連接失敗

    • 檢查 db.properties 中的 URL、用戶名和密碼。
    • 確保數據庫驅動已添加到依賴(如 MySQL 的 mysql-connector-java)。

通過這種混合模式,既能享受 XML 的集中式基礎設施配置,又能利用注解簡化業務層代碼,是傳統 Spring 項目的推薦實踐。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902532.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902532.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902532.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Crawl4AI:打破數據孤島,開啟大語言模型的實時智能新時代

當大語言模型遇見數據饑渴癥 在人工智能的競技場上&#xff0c;大語言模型&#xff08;LLMs&#xff09;正以驚人的速度進化&#xff0c;但其認知能力的躍升始終面臨一個根本性挑戰——如何持續獲取新鮮、結構化、高相關性的數據。傳統數據供給方式如同輸血式營養支持&#xff…

【機器學習-周總結】-第4周

以下是本周學習內容的整理總結&#xff0c;從技術學習、實戰應用到科研輔助技能三個方面歸納&#xff1a; 文章目錄 &#x1f4d8; 一、技術學習模塊&#xff1a;TCN 基礎知識與結構理解&#x1f539; 博客1&#xff1a;【時序預測05】– TCN&#xff08;Temporal Convolutiona…

Mysql--基礎知識點--79.1--雙主架構如何避免回環復制

1 避免回環過程 在MySQL雙主架構中&#xff0c;GTID&#xff08;全局事務標識符&#xff09;通過以下流程避免數據回環&#xff1a; 1 事務提交與GTID生成 在Master1節點&#xff0c;事務提交時生成一個全局唯一的GTID&#xff08;如3E11FA47-71CA-11E1-9E33-C80AA9429562:2…

安寶特科技 | AR眼鏡在安保與安防領域的創新應用及前景

隨著科技的不斷進步&#xff0c;增強現實&#xff08;AR&#xff09;技術逐漸在多個領域展現出其獨特的優勢&#xff0c;尤其是在安保和安防方面。AR眼鏡憑借其先進的功能&#xff0c;在機場、車站、海關、港口、工廠、園區、消防局和警察局等行業中為安保人員提供了更為高效、…

Linux第十講:進程間通信IPC

Linux第十講&#xff1a;進程間通信IPC 1.進程間通信介紹1.1什么是進程間通信1.2為什么要進程間通信1.3怎么進行進程間通信 2.管道2.1理解管道2.2匿名管道的實現代碼2.3管道的五種特性2.3.1匿名管道&#xff0c;只能用來進行具有血緣關系的進程進行通信(通常是父子)2.3.2管道文…

微信小程序通過mqtt控制esp32

目錄 1.注冊巴法云 2.設備連接mqtt 3.微信小程序 備注 本文esp32用的是MicroPython固件&#xff0c;MQTT服務用的是巴法云。 本文參考巴法云官方教程&#xff1a;https://bemfa.blog.csdn.net/article/details/115282152 1.注冊巴法云 注冊登陸并新建一個topic&#xff…

SQLMesh隔離系統深度實踐指南:動態模式映射與跨環境計算復用

在數據安全與開發效率的雙重壓力下&#xff0c;SQLMesh通過動態模式映射、跨環境計算復用和元數據隔離機制三大核心技術&#xff0c;完美解決了生產與非生產環境的數據壁壘問題。本文提供從環境配置到生產部署的完整實施框架&#xff0c;助您構建安全、高效、可擴展的數據工程體…

Spring Data詳解:簡化數據訪問層的開發實踐

1. 什么是Spring Data&#xff1f; Spring Data 是Spring生態中用于簡化數據訪問層&#xff08;DAO&#xff09;開發的核心模塊&#xff0c;其目標是提供統一的編程模型&#xff0c;支持關系型數據庫&#xff08;如MySQL&#xff09;、NoSQL&#xff08;如MongoDB&#xff09;…

15 nginx 中默認的 proxy_buffering 導致基于 http 的流式響應存在 buffer, 以 4kb 一批次返回

前言 這也是最近碰到的一個問題 直連 流式 http 服務, 發現 流式響應正常, 0.1 秒接收到一個響應 但是 經過 nginx 代理一層之后, 就發現了 類似于緩沖的效果, 1秒接收到 10個響應 最終 調試 發現是 nginx 的 proxy_buffering 配置引起的 然后 更新 proxy_buffering 為…

源超長視頻生成模型:FramePack

FramePack 是一種下一幀&#xff08;下一幀部分&#xff09;預測神經網絡結構&#xff0c;可以逐步生成視頻。 FramePack 將輸入上下文壓縮為固定長度&#xff0c;使得生成工作量與視頻長度無關。即使在筆記本電腦的 GPU 上&#xff0c;FramePack 也能處理大量幀&#xff0c;甚…

第6次課 貪心算法 A

向日葵朝著太陽轉動&#xff0c;時刻追求自身成長的最大可能。 貪心策略在一輪輪的簡單選擇中&#xff0c;逐步導向最佳答案。 課堂學習 引入 貪心算法&#xff08;英語&#xff1a;greedy algorithm&#xff09;&#xff0c;是用計算機來模擬一個「貪心」的人做出決策的過程…

Windows使用SonarQube時啟動腳本自動關閉

一、解決的問題 Windows使用SonarQube時啟動腳本自動關閉&#xff0c;并發生報錯&#xff1a; ERROR: Elasticsearch did not exit normally - check the logs at E:\Inori_Code\Year3\SE\sonarqube-25.2.0.102705\sonarqube-25.2.0.102705\logs\sonarqube.log ERROR: Elastic…

人機共跑,馬拉松人型機器人同跑

馬拉松比賽對人形機器人來說&#xff0c;是一場對硬件極限的測試&#xff0c;涉及機械、傳感器、能源管理等多個方面。用戶問的是硬件方面的考察和改進&#xff0c;這意味著我的回答需要聚焦于硬件性能&#xff0c;而不是算法或軟件的優化。 對人形機器人硬件的考研 機械結構與…

Ubuntu Linux 中文輸入法默認使用英文標點

先ubuntu從wayland切換到x11, sudo nano /etc/gdm3/custom.conf WaylandEnablefalse #取消注釋 sudo systemctl restart gdm3 #使設置生效然后安裝fcitx(是fcitx4版本)和 fcitx-googlepinyin, sudo apt install fcitx fcitx-googlepinyin 再sudo dpkg -i 安裝百度輸入法deb…

[論文閱讀]ConfusedPilot: Confused Deputy Risks in RAG-based LLMs

ConfusedPilot: Confused Deputy Risks in RAG-based LLMs [2408.04870] ConfusedPilot: Confused Deputy Risks in RAG-based LLMs DEFCON AI Village 2024 文章是針對Copilot這樣一個RAG服務提供平臺的攻擊 在企業環境中整合人工智能工具&#xff08;如 RAG&#xff09;會…

前端做模糊查詢(含AI版)

文章目錄 前言代碼實現AI個人 總結 前言 因為table需要編輯&#xff0c;所以如果從后端拿數據&#xff0c;編輯后篩選數據就會丟失。這時候就需要前端一次性拿到所有數據進行過濾&#xff0c;數據進行淺拷貝&#xff0c;以便過濾后的數據修改之后&#xff0c;同步修改總數居&a…

Mujoco xml < sensor>

< sensor> jointposjointveljointactuatorfrcframequatgyroaccelerometerframeposframelinveltouchobjtype"site" objname"imu" 和site"imu"的區別python中與sensor有關的寫法傳感器名字索引第幾個idid索引傳感器名字傳感器數量sensor中的…

Python爬蟲從入門到實戰詳細版教程

Python爬蟲從入門到實戰詳細版教程 文章目錄 Python爬蟲從入門到實戰詳細版教程書籍大綱與內容概覽第一部分:爬蟲基礎與核心技術1. 第1章:[爬蟲概述](https://blog.csdn.net/qq_37360300/article/details/147431708?spm=1001.2014.3001.5501)2. 第2章:HTTP協議與Requests庫…

ubuntu--漢字、中文輸入

兩種輸入框架的安裝 ibus 鏈接 (這種方式安裝的中文輸入法不是很智能&#xff0c;不好用)。 Fcitx 鏈接這種輸入法要好用些。 簡體中文檢查 fcitx下載和配置 注意&#xff1a;第一次打開fcitx-config-qt或者fcitx configuration可能沒有“簡體中文”&#xff0c;需要把勾…

Java 數據庫性能優化:SQL 查詢的 10 個關鍵點

Java 數據庫性能優化&#xff1a;SQL 查詢的 10 個關鍵點 在 Java 開發中&#xff0c;數據庫操作是必不可少的一環。然而&#xff0c;隨著數據量的增加&#xff0c;數據庫性能問題往往會成為系統性能的瓶頸。而 SQL 查詢的優化&#xff0c;是提高數據庫性能的重要手段。本文將…