最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java之Spring框架使用及說(shuō)明

 更新時(shí)間:2026年05月25日 10:03:36   作者:Vintanz  
Spring框架詳解,涵蓋IOC容器、依賴注入、AOP、事務(wù)管理及定時(shí)任務(wù)等簡(jiǎn)化企業(yè)級(jí)應(yīng)用開(kāi)發(fā),通過(guò)示例代碼展示Spring核心概念及實(shí)戰(zhàn)用法,助力開(kāi)發(fā)者提升開(kāi)發(fā)效率和代碼質(zhì)量

Spring框架作為Java開(kāi)發(fā)的主流框架,以其IOC(控制反轉(zhuǎn))和AOP(面向切面編程)為核心思想,極大簡(jiǎn)化了企業(yè)級(jí)應(yīng)用開(kāi)發(fā)。

本文將系統(tǒng)講解Spring的核心概念及實(shí)戰(zhàn)用法,包括IOC容器、依賴注入、AOP、事務(wù)管理和定時(shí)任務(wù)等,并對(duì)示例代碼進(jìn)行通用化處理,方便開(kāi)發(fā)者直接參考使用。

一、Spring框架簡(jiǎn)介

1.1 什么是Spring

Spring是一個(gè)開(kāi)源框架,旨在簡(jiǎn)化企業(yè)級(jí)應(yīng)用開(kāi)發(fā)。它以IOC(控制反轉(zhuǎn))AOP(面向切面編程) 為思想內(nèi)核,提供了從控制層到數(shù)據(jù)層的完整解決方案,并支持整合眾多第三方框架(如MyBatis、Hibernate等)。

Spring的優(yōu)勢(shì)在于:

  • 簡(jiǎn)化代碼,降低耦合度
  • 提供事務(wù)管理、日志等通用功能
  • 支持模塊化開(kāi)發(fā),按需選擇組件
  • 良好的兼容性和擴(kuò)展性

1.2 Spring 6版本特性

Spring 6是一次跨越式升級(jí),主要變化包括:

  • 最低支持JDK 17及以上版本
  • javax命名空間遷移到jakarta
  • 兼容Jakarta EE 9/10
  • 支持AOT( Ahead-of-Time)編譯技術(shù)

二、IOC容器:控制反轉(zhuǎn)思想

2.1 IOC核心思想

IOC(Inversion of Control)即控制反轉(zhuǎn),指將對(duì)象的創(chuàng)建權(quán)交給框架,而非由開(kāi)發(fā)者手動(dòng)創(chuàng)建。這一思想解決了傳統(tǒng)開(kāi)發(fā)中對(duì)象管理混亂、耦合度高的問(wèn)題。

傳統(tǒng)方式vs IOC方式

  • 傳統(tǒng)方式:調(diào)用者主動(dòng)創(chuàng)建依賴對(duì)象(如new UserDaoImpl()
  • IOC方式:框架根據(jù)配置自動(dòng)創(chuàng)建并管理對(duì)象,開(kāi)發(fā)者只需從容器中獲取

2.2 Spring容器類型

Spring提供了多種容器實(shí)現(xiàn),核心接口為BeanFactoryApplicationContext

容器類型特點(diǎn)
BeanFactory頂層接口,提供基本的Bean管理功能
ApplicationContext繼承BeanFactory,增加國(guó)際化、事件傳播等功能,是開(kāi)發(fā)的首選
ClassPathXmlApplicationContext從類路徑加載XML配置文件
FileSystemXmlApplicationContext從磁盤路徑加載XML配置文件
AnnotationConfigApplicationContext基于注解配置的容器,無(wú)需XML

示例:創(chuàng)建ApplicationContext容器

// 從類路徑加載XML配置
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

// 從注解配置類加載
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

三、依賴注入(DI)詳解

依賴注入(Dependency Injection)是IOC思想的具體實(shí)現(xiàn),指框架自動(dòng)為對(duì)象的屬性賦值,無(wú)需手動(dòng)set或構(gòu)造方法初始化。

3.1 注入方式

(1)Setter注入

通過(guò)setter方法注入屬性,XML配置如下:

<bean id="userService" class="com.example.service.UserService">
  <!-- name:屬性名,ref:引用的Bean ID -->
  <property name="userDao" ref="userDao"/>
</bean>

<bean id="userDao" class="com.example.dao.UserDaoImpl"/>

對(duì)應(yīng)的Service類需提供setter方法:

public class UserService {
    private UserDao userDao;
    
    // 必須提供setter方法
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

(2)構(gòu)造方法注入

通過(guò)構(gòu)造方法注入屬性,XML配置如下:

<bean id="userService" class="com.example.service.UserService">
  <constructor-arg name="userDao" ref="userDao"/>
</bean>

對(duì)應(yīng)的Service類需包含帶參構(gòu)造:

public class UserService {
    private UserDao userDao;
    
    // 帶參構(gòu)造方法
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}

(3)自動(dòng)注入

通過(guò)autowire屬性自動(dòng)匹配注入,無(wú)需手動(dòng)指定依賴:

<!-- byName:按屬性名匹配Bean ID;byType:按類型匹配 -->
<bean id="userService" class="com.example.service.UserService" autowire="byType"/>

3.2 注入不同類型屬性

Spring支持注入多種類型的屬性,包括基本類型、集合、對(duì)象等:

<bean id="student" class="com.example.domain.Student">
  <!-- 基本類型 -->
  <property name="id" value="1"/>
  <property name="name" value="張三"/>
  
  <!-- List集合 -->
  <property name="hobbies">
    <list>
      <value>讀書</value>
      <value>運(yùn)動(dòng)</value>
    </list>
  </property>
  
  <!-- Map集合 -->
  <property name="scores">
    <map>
      <entry key="數(shù)學(xué)" value="90"/>
      <entry key="英語(yǔ)" value="85"/>
    </map>
  </property>
  
  <!-- 引用對(duì)象 -->
  <property name="address" ref="address"/>
</bean>

<bean id="address" class="com.example.domain.Address">
  <property name="city" value="北京"/>
</bean>

四、基于注解的配置

注解配置可替代XML,簡(jiǎn)化開(kāi)發(fā)流程,常用注解如下:

4.1 組件掃描

通過(guò)@ComponentScan指定掃描包路徑,自動(dòng)注冊(cè)標(biāo)注了@Component及其衍生注解的類:

@Configuration
@ComponentScan("com.example") // 掃描com.example包下的所有組件
public class SpringConfig {
}

4.2 常用組件注解

注解作用適用場(chǎng)景
@Component標(biāo)識(shí)組件,放入Spring容器通用組件
@Service標(biāo)識(shí)服務(wù)層組件Service類
@Repository標(biāo)識(shí)數(shù)據(jù)訪問(wèn)層組件Dao接口實(shí)現(xiàn)類
@Controller標(biāo)識(shí)控制層組件Controller類
@Scope指定Bean的作用域單例/多例控制

示例:Service層組件

@Service // 標(biāo)識(shí)為服務(wù)層組件
@Scope("singleton") // 單例模式(默認(rèn))
public class UserService {
    // 業(yè)務(wù)邏輯...
}

4.3 依賴注入注解

  • @Autowired:按類型自動(dòng)注入
  • @Qualifier:配合@Autowired按名稱注入
  • @Value:注入基本類型和字符串
@Service
public class UserService {
    // 按類型注入Dao
    @Autowired
    @Qualifier("userDaoImpl") // 指定Bean名稱(當(dāng)存在多個(gè)實(shí)現(xiàn)類時(shí))
    private UserDao userDao;
    
    // 注入配置文件中的屬性
    @Value("${app.name}")
    private String appName;
}

五、AOP(面向切面編程)

AOP(Aspect Oriented Programming)是Spring的另一核心思想,用于在不修改源碼的情況下增強(qiáng)方法 功能(如日志、權(quán)限校驗(yàn)等)。

5.1 AOP核心術(shù)語(yǔ)

  • 連接點(diǎn)(Joinpoint):可被增強(qiáng)的方法(Spring中僅支持方法)
  • 切點(diǎn)(Pointcut):需要增強(qiáng)的具體方法(通過(guò)表達(dá)式指定)
  • 通知(Advice):增強(qiáng)的邏輯(如前置通知、后置通知等)
  • 切面(Aspect):切點(diǎn) + 通知的組合
  • 織入(Weaving):將通知應(yīng)用到切點(diǎn)的過(guò)程

5.2 通知類型

Spring AOP支持5種通知類型:

通知類型作用
前置通知方法執(zhí)行前執(zhí)行
后置通知方法正常執(zhí)行后執(zhí)行
異常通知方法拋出異常時(shí)執(zhí)行
最終通知無(wú)論是否異常,方法執(zhí)行后必執(zhí)行
環(huán)繞通知方法執(zhí)行前后均可增強(qiáng)

5.3 AOP實(shí)戰(zhàn)示例

(1)基于注解的AOP配置

// 1. 定義切面類
@Aspect // 標(biāo)識(shí)為切面
@Component
public class LogAspect {
    // 2. 定義切點(diǎn)(匹配com.example.service包下的所有方法)
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void servicePointcut() {}
    
    // 3. 定義通知
    @Before("servicePointcut()") // 前置通知
    public void beforeAdvice(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("方法" + methodName + "開(kāi)始執(zhí)行...");
    }
    
    @AfterReturning("servicePointcut()") // 后置通知
    public void afterReturningAdvice() {
        System.out.println("方法執(zhí)行成功");
    }
}

// 4. 開(kāi)啟AOP支持(在配置類中)
@Configuration
@ComponentScan("com.example")
@EnableAspectJAutoProxy // 開(kāi)啟AOP注解支持
public class SpringConfig {
}

(2)切點(diǎn)表達(dá)式

切點(diǎn)表達(dá)式用于精確匹配需要增強(qiáng)的方法,語(yǔ)法如下:

execution(訪問(wèn)修飾符 返回值 包名.類名.方法名(參數(shù)列表))

常用通配符:

  • *:匹配任意字符(如任意返回值、任意方法名)
  • ..:匹配任意層級(jí)的包或任意個(gè)數(shù)的參數(shù)

示例:

// 匹配com.example.service包下所有類的public方法
execution(public * com.example.service.*.*(..))

// 匹配com.example.dao包及其子包中所有類的save開(kāi)頭的方法
execution(* com.example.dao..* .save*(..))

六、事務(wù)管理

事務(wù)管理是企業(yè)級(jí)應(yīng)用的核心需求,Spring提供了聲明式事務(wù)管理,基于AOP實(shí)現(xiàn),無(wú)需手動(dòng)編寫事務(wù)代碼。

6.1 事務(wù)的ACID特性

  • 原子性(Atomicity):事務(wù)是不可分割的單位
  • 一致性(Consistency):事務(wù)前后數(shù)據(jù)狀態(tài)一致
  • 隔離性(Isolation):并發(fā)事務(wù)互不干擾
  • 持久性(Durability):事務(wù)提交后數(shù)據(jù)永久生效

6.2 聲明式事務(wù)配置

(1)XML配置方式

<!-- 1. 配置事務(wù)管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 2. 配置事務(wù)屬性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <!-- 所有方法使用默認(rèn)事務(wù)配置 -->
    <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT"/>
    <!-- 查詢方法設(shè)置為只讀 -->
    <tx:method name="get*" read-only="true"/>
  </tx:attributes>
</tx:advice>
<!-- 3. 配置切面(將事務(wù)應(yīng)用到Service層) -->
<aop:config>
  <aop:pointcut id="servicePointcut" expression="execution(* com.example.service.*.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/>
</aop:config>

(2)注解配置方式

// 1. 開(kāi)啟事務(wù)注解支持
@Configuration
@EnableTransactionManagement
public class SpringConfig {
    // 配置事務(wù)管理器...
}

// 2. 在Service類或方法上添加事務(wù)注解
@Service
@Transactional // 類級(jí)別事務(wù)配置
public class OrderService {
    // 方法級(jí)別事務(wù)(覆蓋類配置)
    @Transactional(propagation = Propagation.REQUIRED)
    public void createOrder() {
        // 業(yè)務(wù)邏輯...
    }
}

6.3 事務(wù)傳播行為

事務(wù)傳播行為定義了多事務(wù)方法間的調(diào)用規(guī)則,常用類型:

  • REQUIRED:默認(rèn)值,若當(dāng)前有事務(wù)則加入,否則新建
  • REQUIRES_NEW:無(wú)論當(dāng)前是否有事務(wù),均新建事務(wù)
  • SUPPORTS:支持當(dāng)前事務(wù),若無(wú)則以非事務(wù)方式執(zhí)行
  • MANDATORY:必須在事務(wù)中執(zhí)行,否則拋異常

七、Spring Task定時(shí)任務(wù)

Spring Task是輕量級(jí)的定時(shí)任務(wù)框架,可替代Quartz實(shí)現(xiàn)定時(shí)調(diào)度功能。

7.1 定時(shí)任務(wù)配置

(1)XML配置方式

<!-- 1. 掃描組件 -->
<context:component-scan base-package="com.example.task"/>

<!-- 2. 配置定時(shí)任務(wù) -->
<task:scheduled-tasks>
  <!-- 每5秒執(zhí)行一次 -->
  <task:scheduled ref="myTask" method="execute" cron="0/5 * * * * ?"/>
</task:scheduled-tasks>

<!-- 任務(wù)類 -->
@Component
public class MyTask {
    public void execute() {
        System.out.println("定時(shí)任務(wù)執(zhí)行:" + new Date());
    }
}

(2)注解配置方式

// 1. 開(kāi)啟定時(shí)任務(wù)支持
@Configuration
@ComponentScan("com.example.task")
@EnableScheduling
public class TaskConfig {
}

// 2. 定義定時(shí)任務(wù)
@Component
public class MyTask {
    // 每5秒執(zhí)行一次
    @Scheduled(cron = "0/5 * * * * ?")
    public void execute() {
        System.out.println("定時(shí)任務(wù)執(zhí)行:" + new Date());
    }
}

7.2 Cron表達(dá)式

Cron表達(dá)式用于定義定時(shí)規(guī)則,格式為:秒 分 時(shí) 日 月 周 [年],常用通配符:

  • *:匹配任意值
  • ?:不指定值(用于日和周)
  • /:遞增觸發(fā)(如0/5表示每5秒)
  • -:范圍(如10-12表示10到12點(diǎn))
  • ,:枚舉(如MON,FRI表示周一和周五)

示例:

  • 0 0 8 * * ?:每天8點(diǎn)執(zhí)行
  • 0 0/30 9-18 * * ?:9點(diǎn)到18點(diǎn)每30分鐘執(zhí)行
  • 0 0 12 ? * SAT:每周六12點(diǎn)執(zhí)行

八、總結(jié)

本文涵蓋了Spring框架的核心知識(shí)點(diǎn),從IOC容器到定時(shí)任務(wù),通過(guò)通用化的代碼示例展示了Spring的實(shí)戰(zhàn)用法。Spring的優(yōu)勢(shì)在于其松耦合的設(shè)計(jì)理念,通過(guò)IOC和AOP大幅簡(jiǎn)化了開(kāi)發(fā)流程,同時(shí)提供了豐富的企業(yè)級(jí)特性(如事務(wù)管理、定時(shí)任務(wù)等)。

在實(shí)際開(kāi)發(fā)中,建議根據(jù)項(xiàng)目需求選擇XML或注解配置,合理運(yùn)用AOP和事務(wù)管理,提高代碼的可維護(hù)性和擴(kuò)展性。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis引用其他文件中的sql片段的實(shí)現(xiàn)

    mybatis引用其他文件中的sql片段的實(shí)現(xiàn)

    Mybatis中也是支持引用其他Mapper文件中的SQL片段的,本文就來(lái)介紹一下如何使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Go Java算法之解碼方法示例詳解

    Go Java算法之解碼方法示例詳解

    這篇文章主要為大家介紹了Go Java算法之解碼方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 初步認(rèn)識(shí)JVM的體系結(jié)構(gòu)

    初步認(rèn)識(shí)JVM的體系結(jié)構(gòu)

    大家都知道,Java中JVM的重要性,學(xué)習(xí)了JVM你對(duì)Java的運(yùn)行機(jī)制、編譯過(guò)程和如何對(duì)Java程序進(jìn)行調(diào)優(yōu)相信都會(huì)有一個(gè)很好的認(rèn)知.在面試中JVM也是非常重要的一部分,比如JVM調(diào)優(yōu),JVM對(duì)象分配規(guī)則,內(nèi)存模型、方法區(qū),還有種要GC等,需要的朋友可以參考下
    2021-06-06
  • MyBatis入門之增刪改查+數(shù)據(jù)庫(kù)字段和實(shí)體字段不一致問(wèn)題處理方法

    MyBatis入門之增刪改查+數(shù)據(jù)庫(kù)字段和實(shí)體字段不一致問(wèn)題處理方法

    這篇文章主要介紹了MyBatis入門之增刪改查+數(shù)據(jù)庫(kù)字段和實(shí)體字段不一致問(wèn)題處理方法,需要的朋友可以參考下
    2017-05-05
  • Spring Boot 對(duì)接深度求索接口實(shí)現(xiàn)知識(shí)問(wèn)答功能

    Spring Boot 對(duì)接深度求索接口實(shí)現(xiàn)知識(shí)問(wèn)答功能

    本文詳細(xì)介紹了如何使用 Spring Boot 對(duì)接深度求索接口,實(shí)現(xiàn)知識(shí)問(wèn)答功能,通過(guò)整合深度求索 API,我們可以輕松地在 Spring Boot 項(xiàng)目中實(shí)現(xiàn)智能問(wèn)答功能,
    2025-02-02
  • SpringBoot整合SpringAI配置多平臺(tái)API密鑰的解決方案

    SpringBoot整合SpringAI配置多平臺(tái)API密鑰的解決方案

    本文介紹了如何在SpringBoot項(xiàng)目中整合SpringAI配置平臺(tái)API密鑰,包括添加依賴、配置文件、配置屬性類及核心配置類等,通過(guò)動(dòng)態(tài)切換不同AI平臺(tái),實(shí)現(xiàn)統(tǒng)一接口調(diào)用,此外,支持YAML配置和環(huán)境變量,便于靈活配置和擴(kuò)展新平臺(tái),需要的朋友可以參考下
    2026-05-05
  • Java中StringRedisTemplate和RedisTemplate的區(qū)別及使用方法

    Java中StringRedisTemplate和RedisTemplate的區(qū)別及使用方法

    本文主要介紹了Java中StringRedisTemplate和RedisTemplate的區(qū)別及使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Spring Security 強(qiáng)制退出指定用戶的方法

    Spring Security 強(qiáng)制退出指定用戶的方法

    本篇文章主要介紹了Spring Security 強(qiáng)制退出指定用戶的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Java并發(fā)編程變量可見(jiàn)性避免指令重排使用詳解

    Java并發(fā)編程變量可見(jiàn)性避免指令重排使用詳解

    這篇文章主要為大家介紹了Java并發(fā)編程變量可見(jiàn)性避免指令重排使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • JAVA發(fā)送http get/post請(qǐng)求,調(diào)用http接口、方法詳解

    JAVA發(fā)送http get/post請(qǐng)求,調(diào)用http接口、方法詳解

    這篇文章主要介紹了Java發(fā)送http get/post請(qǐng)求調(diào)用接口/方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

监利县| 育儿| 淄博市| 沙雅县| 阜新市| 晋宁县| 文山县| 蓬莱市| 南开区| 潜江市| 治多县| 高邮市| 禹城市| 文水县| 苍溪县| 固阳县| 靖西县| 江山市| 泾川县| 玉环县| 南安市| 南开区| 温州市| 南宁市| 台东市| 进贤县| 百色市| 淳化县| 邯郸县| 隆昌县| 绥宁县| 金寨县| 上高县| 阜平县| 庄浪县| 康定县| 新干县| 通渭县| 岑溪市| 普洱| 济源市|