Spring框架配置進階_自動裝配(XML和注解)

Spring配置進階

Spring 容器提供配置元數據有三種方式

  • XML配置文件。
  • 基于注解的配置。
  • 基于java的配置。

一、自動裝配

應用程序上下文為你找出依賴項的過程,Spring會在上下文中自動查找,并自動給bean裝配與其關聯的屬性

Spring中實現自動裝配的方式有兩種:

  • XML文件
  • 注解

(1)通過xml文件實現自動裝配

1、通過xml文件實現自動裝配

xml配置文件中的<bean>要配置autowire屬性

autowire屬性值:

模式描述
no這是默認的設置,它意味著沒有自動裝配,你應該使用顯式的bean引用來連線。你不用為了連線做特殊的事。,
byName由屬性名自動裝配。Spring 容器看到在 XML 配置文件中 bean 的自動裝配的屬性設置為 byName。然后嘗試匹配,并且將它的屬性與在配置文件中被定義為相同名稱的 beans 的屬性進行連接。
byType由屬性數據類型自動裝配。Spring 容器看到在 XML 配置文件中 bean 的自動裝配的屬性設置為 byType。然后如果它的類型匹配配置文件中的一個確切的 bean 名稱,它將嘗試匹配和連接屬性的類型。如果存在不止一個這樣的 bean,則一個致命的異常將會被拋出
constructor類似于 byType,但該類型適用于構造函數參數類型。如果在容器中沒有一個構造函數參數類型的 bean,則一個致命錯誤將會發生。
1)byName屬性值

Spring會根據class屬性找到實體類,然后查詢實體類中所有setter方法的名字,根據setter方法后面的名字,再到配置文件中尋找一個與該名字相同id的Bean,注入進來

autowire屬性賦值>>class找到對應類>>查詢對應setter方法>>對應id的Bean對象

<bean id="iDeptDao" class="org.example.dao.impl.DeptImpl" autowire="byName"/>
2)byType屬性值

Spring會自動尋找一個與該屬性類型相同的Bean,注入進來

<bean id="iDeptService" class="org.example.service.impl.DeptServiceImpl autowire="byType">

(2)通過注解實現自動裝配

二、Spring注解分類

1、使用注解前的準備:

//spring-config.xml文件配置數據

<!--    加入掃描包,配置根路徑,查找根路徑下使用的注解-->
<context:component-scan base-package="org.example"/>

以注解為主,XML為輔。

@Component(組件),@Service(服務),@Controller(控制器),@Repository(*/r??pɑ?z?t??ri/*數據倉庫)

1、Spring類注解

@Component、@Repository、@Controller、@Service以及JavaEE6的@ManagedBean和@Named注解,都是添加在類上面的類級別注解

Spring容器根據注解的過濾規則掃描讀取注解Bean定義類,并將其注冊到Spring IoC容器中。

1、使用asm技術掃描.class文件,并將包含@Component、@Controller、@Service、@Repository或者其他自定義的的bean注冊到beanFactory中,

  • @Component : 通配
  • @Repository:用于聲明DAO層的
  • @Service:用于業務層
  • @Controller:用于控制器 (暫時先不用,后面接觸Spring MVC再使用)

2、然后spring在注冊處理器

3、實例化處理器,然后將其放到beanPostFactory中,然后我們就可以在類中進行使用了。

4、創建bean時,會自動調用相應的處理器進行處理。

2、類內部注解

@Autowire、@Value、@Resource注解等,都是添加在類內部的字段或者方法上的類內部注解。

SpringIoC容器通過Bean后置注解處理器解析Bean內部的注解,比如Spring實現@Autowire解析和注入的核心的類是通過AutowiredAnnotationBeanPostProcessor來實現的

//@Component("deptService"),
//@Service類注解Service層
@Service("deptService")
public class DeptServiceImpl implements IDeptService {@Autowired//Autowired類內部注解,可以注解變量或方法private IDeptMapper deptMapper;
}

三、注解實現自動裝配

2.使用注解(類內部注解)

  1. @Autowired注解

    只按照類型byType匹配, 默認情況匹配的Bean只有一個,匹配不到報錯BeanCreationException 異常

    • 可使用在變量和setter方法上, xml文件中注解autowrie刪除

    若要匹配多個類型, 引入:

    //1.注解在屬性上
    @Autowired
    @Qualifier("類型2")
    private IDeptMapper deptMapper;
    //2.注解setter方法上(同一變量的2種二選一)@Autowiredpublic void setiDeptDaoMapper(IDeptMapper iDeptMapper) {this.iDeptMapper = iDeptMapper;}
    
  2. @Qualifier注解(

    當ioc容器根據屬性類型去容器中找找到多個相同類型的組件,再將屬性的名稱作為組件(bean)的id去容器中查找找不到時就是用這兩個注解搭配,指定需要裝配的bean的id。

    和Autowired搭配使用

  3. @Resource注解

    • 可以寫在字段和setter方法上(2選1)

    默認按名稱進行裝配

    @Resource有兩個重要的屬性:name和type,而Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型

    • 默認按名字匹配

      @Resource
      private SqlSessionFactory sqlSessionFactory;
      
    • 按類型: 效果和@Autowired一樣

     @Resource(type = SqlSessionFactory.class)private SqlSessionFactory sqlSessionFactory;
    • 匹配順序

      同時name和type一致的bean對象>>指定的name>>指定type>>什么也沒指定name

3.基于注解聲明組件(類注解)

目前常用的組件有:@Component(組件),@Service(服務),@Controller(控制器),@Repository(數據倉庫)

1.@Component注解

通用的注解,可標注任意類為 Spring 組件(一個 Bean 不知道屬于哪個層時使用)

說明:如果一個類中有@Component,沒有指定名稱,那么這個組件名稱就是類名首字母小寫

//@Component //默認空指向deptMapperImpl
@Component("deptMapper")
public class DeptMapperImpl implements IDeptMapper {@Resourceprivate SqlSessionFactory sqlSessionFactory;
}

4.使用完類注解

刪除掉聲明的dao層的bean信息,以及service信息,只保留基礎配置信息

//bean標簽都刪除
<!--    <bean id="iDeptDao" class="org.example.dao.impl.DeptImpltowire="byName"> -->
<!--    <bean id="iDeptDao1" class="org.example.dao.impl.IDeptMapperImpl1 -->

四.JavaConfig

JavaConfig是指基于java配置的spring。傳統的Spring一般都是基本xml配置的,后來spring3.0新增了許多JavaConfig的注解

任何一個標注了@Configuration的Java類定義都是一個JavaConfig配置類

package org.example;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;import javax.annotation.Resource;
import javax.sql.DataSource;/*** @author Arran* @version 1.0* @description: 基于java配置的spring* @date 2024/07/06 上午 11:59*/
//在類上打上這一標簽,表示這個類是配置類
//表明該類是一個JavaConfig形式的Spring Ioc容器的配置類@Configuration//被該注解標識的類,
//讀取數據源
@PropertySource("classpath:source.properties")
public class Myconfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;//相當于spring.xml文件的bean對象@Beanpublic DataSource dataSource() {DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setDriverClassName(driver);druidDataSource.setUrl(url);druidDataSource.setUsername(username);druidDataSource.setPassword(password);return druidDataSource;}
}
注解說明
@Configuration在類上打上這一標簽,表示這個類是配置類
@ComponentScan相當于xml的<context:componentscan basepakage=>
@Beanbean的定義,相當于xml的<bean id="objectMapper" class="org.it.map.ObjectMapper" />
@EnableWebMvc相當于xml的<mvc:annotation-driven>,springMVC階段涉及
@ImportResource相當于xml的 <import resource="applicationContext-cache.xml">
@PropertySourcespring 3.1開始引入,它是基于java config的注解,用于讀取properties文件
@Profilespring3.1開始引入,一般用于多環境配置,激活時可用@ActiveProfiles注解,@ActiveProfiles(“dev”)
@Value讀取外部配置文件對應的property

xml和java配置的區別

1.表達形式層面(二者區別)
  • 基于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-3.0.xsd”> </beans>

  • 而基于JavaConfig的配置方式是這樣:

    @Configuration
    public class MockConfiguration{
    //bean定義
    }

2.注冊bean定義層面
  • 基于XML的配置形式是這樣:

    <bean id=“mockService” class=“…MockServiceImpl”>

    </bean>

  • 而基于JavaConfig的配置形式是這樣的:

    @Configuration
    public class MockConfiguration{
    @Bean
    public MockService mockService(){
    return new MockServiceImpl();
    }
    }

    任何一個標注了@Bean的方法,其返回值將作為一個bean定義注冊到Spring的IoC容器,方法名將默認成該bean定義的id。

    @Bean一般用在使用第三方類來生成對象注入到spring容器的情況下使用

3.表達依賴注入關系層面
  • 為了表達bean與bean之間的依賴關系,在XML形式中一般是這樣:

    <bean id=“dependencyService” class=“DependencyServiceImpl”></bean>

    <bean id=“mockService” class=“…MockServiceImpl”>
    <propery name =“dependencyService” ref=“dependencyService” />
    </bean>

  • 而基于JavaConfig的配置形式是這樣的:

    @Configuration
    public class MockConfiguration{
    @Bean
    public DependencyService dependencyService(){
    return new DependencyServiceImpl();
    }

如果一個bean的定義依賴其他bean,則直接調用對應的JavaConfig類中依賴bean的創建方法就可以了。

五MapperScannerConfigurer配置

MyBatis中可以使用SqlSession的getMapper(Class type)方法,根據指定的映射器和映射文件直接生成實現類,這樣不必自行編寫映射器的實現類,就可以調用映射器的方法進行功能實現。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property><property name="basePackage" value="mapper路徑"></property>
</bean>
  1. basePackage屬性中可以包含多個包名,多個包含之間使用逗號或分號隔開。
  2. MapperScannerConfigurer會為所有又它創建的映射器實現開啟自動裝配,也就是MapperScannerConfigurer創建的所有映射器實現都會被自動注入SqlSessionFactory例,因此在如上示例中配置DAO組件時無需顯示注入SqlSessionFactory實例
  3. 映射器被注冊到Spring容器時,Spring會根據其接口名稱為其命名,默認規則是首字母小寫的非完全限定類名。例如EmpMapper類型的組件會被默認命名為empMapper

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

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

相關文章

26-ARM常用匯編指令

匯編格式&#xff1a; label&#xff1a;instruction comment label&#xff1a;標號instruction&#xff1a;具體匯編指令comment&#xff1a;注釋內容 常用段名&#xff1a; .text&#xff1a;代碼段.data&#xff1a;初始化的數據段.bss&#xff1a;未初始化的數據段.ro…

Spring Boot+Vue項目從零入手

Spring BootVue項目從零入手 一、前期準備 在搭建spring bootvue項目前&#xff0c;我們首先要準備好開發環境&#xff0c;所需相關環境和軟件如下&#xff1a; 1、node.js 檢測安裝成功的方法&#xff1a;node -v 2、vue 檢測安裝成功的方法&#xff1a;vue -V 3、Visu…

JSP WEB開發(一) JSP語言基礎

目錄 JSP JSP簡介&#xff1a; JSP頁面 JSP運行原理 JSP腳本元素 JAVA程序片 局部變量 全局變量和方法的聲明 全局變量 方法的聲明 程序片執行特點 synchronized關鍵字 表達式 JSP指令標記 page指令 include指令 JSP動作標記 JSP動作元素include和include指令的…

Docker在人工智能領域的應用與實戰

摘要 人工智能&#xff08;AI&#xff09;技術的快速發展帶來了對高效開發和部署工具的需求。Docker作為一個創新的容器化平臺&#xff0c;為AI領域提供了強大的支持。本文詳細介紹了Docker在AI模型開發、訓練、部署以及服務器集群管理等方面的應用&#xff0c;并探討了其在數…

AcWing 1550:完全二叉搜索樹

【題目來源】https://www.acwing.com/problem/content/1552/【題目描述】二叉搜索樹 (BST) 遞歸定義為具有以下屬性的二叉樹&#xff1a; &#xff08;1&#xff09;若它的左子樹不空&#xff0c;則左子樹上所有結點的值均小于它的根結點的值 &#xff08;2&#xff09;若它的右…

大數據平臺之數據同步

數據同步也成為CDC (Chanage Data Capture) 。Change Data Capture (CDC) 是一種用于跟蹤和捕獲數據庫中數據變更的技術&#xff0c;它可以在數據發生變化時實時地將這些變更捕獲并傳遞到下游系統。以下是一些常用的開源 CDC 方案&#xff1a; 1. Flink CDC Flink CDC 是基于 …

快速上手LangChain:構建強大的語言模型應用

引言 在人工智能和自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;構建高效且強大的語言模型應用變得越來越重要。LangChain 是一個專為開發者設計的框架&#xff0c;它簡化了語言模型應用的構建流程。本文將詳細介紹LangChain的功能和使用方法&#xff0c;幫助讀者…

76 4G模組 境外撥號入網注意

1 引言 最近朋友把國內的設備拿到新加坡了&#xff0c;然后發現原本國內可以使用的設備無法在異國他鄉聯網&#xff0c;所以就叫我來看看&#xff0c;發現是附網返回狀態、入網APN發生了改變導致的。另外&#xff0c;如果在境外使用國產4G模組撥號入網&#xff0c;也需要關注4G…

Windows安裝超好用的截圖工具——Snipaste

1、下載 官網&#xff1a;https://zh.snipaste.com/ 2、安裝 &#xff08;1&#xff09;解壓下載的壓縮包 &#xff08;2&#xff09;選中Snipaste.exe文件&#xff0c;右鍵發送到 -- > 桌面快捷方式 &#xff08;3&#xff09;雙擊桌面Snipaste圖標&#xff0c;桌面右下…

linux 服務器數據備份 和 mysql 數據遷移

查看域名ip 查看程序所處文件位置 list open files 1、 lsof -i :port 查看端口獲取進程 pid 2、lsof -i pid 1、scp 下載服務器文件到本地 security copy protocol 2、導出服務器 mysql 數據庫&#xff08;表&#xff09;到本地 mysqldump是MySQL自帶的一個實用程序&…

解析Java中1000個常用類:Date類,你學會了嗎?

在線工具站 推薦一個程序員在線工具站:程序員常用工具(http://cxytools.com),有時間戳、JSON格式化、文本對比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。程序員資料站 推薦一個程序員編程資料站:程序員的成長之路(http://cxyroad.com),收錄了一些列的技術教程…

Git 完整的提交規范教程

約定式提交規范 本文中的關鍵詞 “必須&#xff08;MUST&#xff09;”、“禁止&#xff08;MUST NOT&#xff09;”、“必要&#xff08;REQUIRED&#xff09;”、“應當&#xff08;SHALL&#xff09;”、“不應當&#xff08;SHALL NOT&#xff09;”、“應該&#xff08;S…

云計算【第一階段(24)】Linux文件系統與日志分析

一、文件與存儲系統的inode與block 1.1、硬盤存儲 最小存儲單位&#xff1a;扇區(sector) 每個扇區大小&#xff1a;512字節 1.2、文件存取 最小存取單位&#xff1a;塊(block)連續八個扇區組成&#xff1a;塊(block) 每個塊大小&#xff1a;4K文件數據&#xff1a;實際數據…

Leetcode1115 交替打印 FooBar及其測試

題目描述 相關標簽 相關企業 給你一個類&#xff1a; class FooBar { public void foo() { for (int i 0; i < n; i) { print(“foo”); } } public void bar() { for (int i 0; i < n; i) { print(“bar”); } } } 兩個不同的線程將會共用一個 FooBar 實例&#xf…

Java面試八股之如何提高MySQL的insert性能

如何提高MySQL的insert性能 提高MySQL的INSERT性能可以通過多種策略實現&#xff0c;以下是一些常見的優化技巧&#xff1a; 批量插入&#xff1a; 而不是逐條插入&#xff0c;可以使用單個INSERT語句插入多行數據。例如&#xff1a; INSERT INTO table_name (col1, col2) V…

正則表達式-使用筆記

正則表達式使用不當&#xff0c;會導致CPU飆升&#xff1b; 二、相關參考 正則表達式 – 語法 | 菜鳥教程 sparksql 正則匹配總結 三、回溯原理 導致性能下降最主要原因&#xff1a; .* 會導致大量回溯| 分支操作 https://zhuanlan.zhihu.com/p/27417442 四、常用工具 regex…

OpenSNN推文:科技前沿動態速覽:六七月份的技術革新與行業進展

隨著夏季的到來&#xff0c;科技界的熱度也如同氣溫一般持續攀升。在這個充滿活力的季節里&#xff0c;從量子計算的深邃世界到腦機接口的未來探索&#xff0c;從人工智能的智慧躍升到大數據的海洋遨游&#xff0c;再到運營策略的精妙布局和設計領域的創新火花&#xff0c;以及…

2024第三屆中國醫療機器人大會第一輪通知

2024第三屆中國醫療機器人大會第一輪通知 大會背景 醫療機器人技術正以前所未有的速度在主流醫學領域取得卓越進展&#xff0c;新應用、新技術不斷涌現&#xff0c;使得該領域在過去一年中取得了令人驚嘆的增長。然而&#xff0c;這僅僅是冰山一角&#xff0c;未來的發展空間仍…

Docker:一、安裝與卸載、配置阿里云加速器(Ubuntu)

目錄 &#x1f341;安裝docker&#x1f332;1、環境準備&#x1f332;2、安裝docker Engine&#x1f9ca;1、卸載舊版、任何沖突的包&#x1f9ca;2、使用存儲庫安裝&#x1f9ca;3、安裝 Docker 包。&#x1f9ca;4、查詢是否安裝成功&#x1f9ca;5、運行hello-world鏡像&…

柯橋小語種學校成人生活口語學習|西班牙語中H為什么不發音…

01 H en el alfabeto espaol 西語字母表中的h 字母H是唯一一個在標準西班牙語中不再代表任何音素的字母。盡管在它單獨出現時被叫做HACHE&#xff0c;但在大多數單詞拼寫中&#xff0c;它只是一個沒有聲音對應關系的字母&#xff0c;因此RAE稱其為“無聲的H”&#xff08;hac…