【Spring】IoC容器 控制反轉 與 DI依賴注入 配置類實現版本 第四期

文章目錄

  • 基于 配置類 方式管理 Bean
  • 一、 配置類和掃描注解
  • 二、@Bean定義組件
  • 三、高級特性:@Bean注解細節
  • 四、高級特性:@Import擴展
  • 五、基于注解+配置類方式整合三層架構組件
  • 總結


基于 配置類 方式管理 Bean

  • Spring 完全注解配置(Fully Annotation-based Configuration)是指通過 Java配置類 代碼來配置 Spring 應用程序,使用注解來替代原本在 XML 配置文件中的配置。
  • 相對于 XML 配置,完全注解配置具有更強的類型安全性和更好的可讀性。

從 xml 到 完全注解 配置!
1

一、 配置類和掃描注解

1

//使用注解讀取外部配置,替代 <context:property-placeholder標簽
@PropertySource("classpath:jdbc.properties")
//使用@ComponentScan注解,可以配置掃描包,替代<context:component-scan標簽
@ComponentScan("com.doug.ioc01")
//標注當前類是配置類,替代application.xml 
@Configuration
public class javaConfiguration {/**  1. 添加@Configuration 標識為配置類*  2. 包掃描注解配置:*       2.1 @ComponentScan({"com.doug.ioc01","com.doug.ioc02"}) 多個包 中括號+逗號分割*       2.2 引用外部配置文件  *       2.3 聲明第三方依賴的bean組件* */
}

測試:

    @Testpublic void testIoc_01(){// AnnotationConfigApplicationContext 根據配置類創建 IOC 容器對象AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(javaConfiguration.class);StuController bean = context.getBean(StuController.class);bean.show();}

也可以使用 no-arg 構造函數實例化 AnnotationConfigApplicationContext ,然后使用 register() 方法對其進行配置。

// AnnotationConfigApplicationContext-IOC容器對象
ApplicationContext iocContainerAnnotation = 
new AnnotationConfigApplicationContext();
//外部設置配置類
iocContainerAnnotation.register(MyConfiguration.class);
//刷新后方可生效!!
iocContainerAnnotation.refresh();
  • @Configuration指定一個類為配置類,可以添加配置注解,替代配置xml文件
  • @ComponentScan(basePackages = {“包”,“包”}) 替代<context:component-scan標簽實現注解掃描
  • @PropertySource(“classpath:配置文件地址”) 替代 <context:property-placeholder標簽
  • 配合IoC/DI注解,可以進行完整注解開發!

二、@Bean定義組件

`

屬性只在當前方法使用,直接寫成形參

//標注當前類是配置類,替代application.xml    
@Configuration
//引入jdbc.properties文件
@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})
@ComponentScan(basePackages = {"com.doug.components"})
public class MyConfiguration {//如果第三方類進行IoC管理,無法直接使用@Component相關注解//解決方案: xml方式可以使用<bean標簽//解決方案: 配置類方式,可以使用方法返回值+@Bean注解@Beanpublic DataSource createDataSource(@Value("${jdbc.user}") String username,@Value("${jdbc.password}")String password,@Value("${jdbc.url}")String url,@Value("${jdbc.driver}")String driverClassName){//使用Java代碼實例化DruidDataSource dataSource = new DruidDataSource();dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setUrl(url);dataSource.setDriverClassName(driverClassName);//返回結果即可return dataSource;}
}

三、高級特性:@Bean注解細節

    /** @Bean會真正讓配置類的方法創建的組件存儲到IOC容器** 1. beanName*       默認:方法名*       指定:name/value 屬性起名字,覆蓋方法名** 2. 周期方法指定*       原有注解方法:PostConstruct + PreDestroy*       bean屬性指定:initMethod / destroyMethod** 3.作用域*       @Scope 默認單例** 4.如何引用其他ioc組件*       直接調用對方的bean方法*       直接形參變量引入,要就必須有對應組件,如有多個,形參名 = 組件id標識 即可* */@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)@Bean(name = "dataSource",initMethod = "",destroyMethod = "")public DataSource createDataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(driver);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}@Bean(name = "dougSource")public DataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(driver);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}/*** 方法一:*   直接把方法引入* @return*/@Beanpublic JdbcTemplate jdbcTemplate(){JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(createDataSource());return jdbcTemplate;}/*** 方法二:*   使用形參的方式,IOC容器會自動裝配,可以一個或多個* @return*/@Beanpublic JdbcTemplate jdbcTemplate2(DataSource dataSource){JdbcTemplate jdbcTemplate = new JdbcTemplate();//使用形參的方法,就必須要有這個類型的參數已經被注入了,// 就是上面的createDataSource方法被@Bean注解標識了(沒有標注是會報錯的)jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}/*** 如果是多個形參的情況,根據傳入參數的名字對應bean設置的name,選擇*/@Beanpublic JdbcTemplate jdbcTemplate3(DataSource dataSource,DataSource dougSource){JdbcTemplate jdbcTemplate = new JdbcTemplate();//使用形參的方法,就必須要有這個類型的參數已經被注入了,// 就是上面的createDataSource方法被@Bean注解標識了(沒有標注是會報錯的)// 如果是多個形參的情況,根據傳入參數的名字對應bean設置的name,選擇jdbcTemplate.setDataSource(dougSource);return jdbcTemplate;}

四、高級特性:@Import擴展

@Import 注釋允許從另一個配置類加載 @Bean 定義
也就是 :
當有A B兩個配置類, A中引入@ImportB
在實例化配置類時 , 只要引入A就可以,B會跟著一起。

@Configuration
public class ConfigA {@Beanpublic A a() {return new A();}
}@Configuration
@Import(ConfigA.class)
public class ConfigB {@Beanpublic B b() {return new B();}
}

容器實例化只需要引入 ConfigB.class (但是AB都可以用);

在實例化上下文時不需要同時指定 ConfigA.classConfigB.class ,只需顯式提供 ConfigB

public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);// now both beans A and B will be available...A a = ctx.getBean(A.class);B b = ctx.getBean(B.class);
}

此方法簡化了容器實例化,因為只需要處理一個類,而不是要求在構造期間記住可能大量的 @Configuration 類。

五、基于注解+配置類方式整合三層架構組件

將原xml 配置第三方類 都使用 配置類來寫,其余用都用注解,也就是完全注解開發,舍棄了在xml里面配置

配置類:

@PropertySource("classpath:jdbc.properties")
@ComponentScan("com.doug")
@Configuration
public class MyConfiguration {@Beanpublic DataSource dataSource(@Value("${doug.url}") String url, @Value("${doug.driver}") String driver,@Value("${doug.username}") String username, @Value("${doug.password}") String password) {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(driver);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}
}

1


總結

1
注解+配置類 IoC方式總結

  1. 完全摒棄了XML配置文件
  2. 自定義類使用IoC和DI注解標記
  3. 第三方類使用配置類聲明方法+@Bean方式處理
  4. 完全注解方式(配置類+注解)是現在主流配置方式

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

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

相關文章

Kotlin學習 6

1.接口 interface Movable {var maxSpeed: Intvar wheels: Intfun move(movable: Movable): String}class Car(var name: String, override var wheels: Int 4, _maxSpeed: Int) : Movable {override var maxSpeed: Int _maxSpeedget() fieldset(value) {field value}overr…

C語言讀取 ini 配置文件,修改/添加鍵值對

C語言讀取 ini 配置文件&#xff0c;修改/添加鍵值對 C語言讀取 ini 配置文件&#xff0c;對section中的鍵值對進行修改/添加&#xff0c;如果section不存在&#xff0c;則在末尾將新的section/key/value 添加進去。 一、了解什么是INI文件&#xff1f; ini 文件是Initializ…

【大數據】Flink 之部署篇

Flink 之部署篇 1.概述和參考架構2.可重復的資源清理3.部署模式3.1 Application 模式3.2 Per-Job 模式&#xff08;已廢棄&#xff09;3.3 Session 模式 Flink 是一個多用途框架&#xff0c;支持多種不同的混合部署方案。下面&#xff0c;我們將簡要介紹 Flink 集群的構建模塊、…

流動資金貸款管理辦法

流動資金貸款管理辦法 (2024年1月30日國家金融監督管理總局令2024年第2號公布 自2024年7月1日起施行) 第一章 總 則 第一條 為規范銀行業金融機構流動資金貸款業務經營行為&#xff0c;加強流動資金貸款審慎經營管理&#xff0c;促進流動資金貸款業務健康發展&#xff0c;依…

【html學習筆記】3.表單元素

1.文本框 1.1 語法 <input type "text">表示文本框。且只能寫一行 1.2 屬性 使用屬性size 設置文本框大小 <input type"text" size"10">2. 使用屬性value 來設置文本框的默認文字 <input type"text" size"…

Vue狀態管理庫-Pinia

一、Pinia是什么&#xff1f; Pinia 是 Vue 的專屬狀態管理庫&#xff0c;它允許支持跨組件或頁面共享狀態&#xff0c;即共享數據&#xff0c;他的初始設計目的是設計一個支持組合式API的 Vue 狀態管理庫&#xff08;因為vue3一個很大的改變就是組合式API&#xff09;,當然這…

PFA三角燒瓶實驗室PFA錐形瓶本底純凈耐腐蝕性強

PFA三角燒瓶外觀呈平底圓錐狀&#xff0c;下闊上狹&#xff0c;有一圓柱形頸部&#xff0c;上方有一較頸部闊的開口&#xff0c;可用塞子封閉。PFA三角燒瓶也稱PFA錐形瓶&#xff0c;PFA反應瓶&#xff0c;PFA三角燒瓶、PFA依氏燒瓶、PFA錐形燒瓶&#xff0c;PFA鄂倫麥爾瓶等。…

普中51單片機學習(串口通信)

串口通信 原理 計算機通信是將計算機技術和通信技術的相結合&#xff0c;完成計算機與外部設備或計算機與計算機之間的信息交換 。可以分為兩大類&#xff1a;并行通信與串行通信。并行通信通常是將數據字節的各位用多條數據線同時進行傳送 。控制簡單、傳輸速度快&#xff1…

【大模型】finetune 百川2

使用官網例子finetune百川2&#xff0c;微調腳本如下 模型為baichuan_chat_13B_v1 export CUDA_VISIBLE_DEVICES1 hostfile"" deepspeed --hostfile$hostfile baichuan_fineturn/fine-tune/fine-tune.py \--report_to "none" \--data_path "baichu…

2.22號qt

1.使用信號和槽實現多個界面跳轉 1.1準備兩個界面 1.2第一個界面準備signal 1.3第二個界面準備slot 1.4將第一個界面的信號和槽進行連接 2.qss登錄界面升級優化 2.1概念 Qss是Qt程序界面中用來設置控件的背景圖片、大小、字體顏色、字體類型、按鈕狀態變化等屬性&#xff…

【Python】Python實現串口通信(Python+Stm32)

&#x1f389;歡迎來到Python專欄~Python實現串口通信 ☆* o(≧▽≦)o *☆嗨~我是小夏與酒&#x1f379; ?博客主頁&#xff1a;小夏與酒的博客 &#x1f388;該系列文章專欄&#xff1a;Python學習專欄 文章作者技術和水平有限&#xff0c;如果文中出現錯誤&#xff0c;希望…

springboot208基于springboot物流管理系統

基于spring boot物流管理系統設計與實現 摘 要 社會發展日新月異&#xff0c;用計算機應用實現數據管理功能已經算是很完善的了&#xff0c;但是隨著移動互聯網的到來&#xff0c;處理信息不再受制于地理位置的限制&#xff0c;處理信息及時高效&#xff0c;備受人們的喜愛。…

jax可微分編程的筆記

jax可微分編程的筆記 1.1.1 求導的基本概念 所謂的導數是一個從集合F到自身的映射. 有時,我們也將一個從函數到函數的映射稱為一個操作, 這里的操作在物理學中也被稱作一個算符. 但在計算機中的操作符相當于數學中的一個函數,而非從 函數到函數的映射. 應該指出的是,如果我們…

vue小記——this(2)

在Vue的方法中使用普通函數作為回調函數&#xff0c;那么在該回調函數中&#xff0c;this將不會指向Vue實例&#xff0c;而是指向全局對象&#xff08;在瀏覽器中是window&#xff09;。 錯誤 &#xff1a; export default { data() { return { message: Hello Vue! }; …

npm 包發布

name publish必填項&#xff08;version,nameverson構成唯一標識&#xff09;&#xff0c;唯一&#xff0c;所以publish前驗證庫里是否存在該名稱&#xff0c;方式npm info xxx npm ERR! 404 cy_test is not in the npm registry.可以使用。規則&#xff1a;不能以.或者_開頭…

maven工程打包引入本地jar包

1、通過maven生成本地區倉庫包 mvn install:install-file --settings D:\lkx\download\apache-maven-3.6.3\conf\settings.xml -Dfileaspose-cad-21.8.jar -DartifactIdaspose-cad -DgroupIdsystem.core -Dversion21.8 -Dpackagingjar -DgeneratePomtrue # --settings&#xf…

進程線程間的通信:2024/2/22

作業1&#xff1a;代碼實現線程互斥機制 代碼&#xff1a; #include <myhead.h>//臨界資源 int num10;//創建一個互斥鎖 pthread_mutex_t mutex;//任務一 void *task1(void *arg) {//獲取鎖資源pthread_mutex_lock(&mutex);num123;sleep(3);printf("task1:num…

PacketSender-用于發送/接收 TCP、UDP、SSL、HTTP 的網絡實用程序

PacketSender-用于發送/接收 TCP、UDP、SSL、HTTP 的網絡實用程序 PacketSender是一款開源的用于發送/接收 TCP、UDP、SSL、HTTP 的網絡實用程序&#xff0c;作者為dannagle。 其官網地址為&#xff1a;https://packetsender.com/&#xff0c;Github源代碼地址&#xff1a;htt…

【AI繪畫工具分別有哪些?】

目前有許多AI繪畫工具可供選擇&#xff0c;以下列舉了一些常見的AI繪畫工具&#xff1a; 1. DeepArt.io&#xff1a;該工具使用深度學習算法生成藝術風格的圖像&#xff0c;并可以將輸入圖像與指定的藝術風格進行合并。 2. Prisma&#xff1a;這是一款非常流行的AI繪畫應用&a…

SQL Server —— While語句循環

一&#xff1a;簡介 while 循環是有條件的循環控制語句。滿足條件后&#xff0c;再執行循環體中的SQL語句。 while: break, 如果有多條語句可以在while后面添加begin-end。關于while的語法 while(條件) -- begin -- 語句1 -- 語句2 -- break 根據情況是否添加break -- end 二…