spring 加載java類_在Spring中基于Java類進行配置的完整步驟

在Spring中基于Java類進行配置的完整步驟

發布于 2020-7-7|

復制鏈接

基于Java配置選項,可以編寫大多數的Spring不用配置XML,下面

前言JavaConfig 原來是 Spring 的一個子項目,它通過 Java 類的方式提供 Bean 的定義信息,在 Spring4 的版本, JavaConfig 已正式成為 Spring4 的核心功能 。本文將詳細介紹關于Spring中基于Java類進行配置的相關內容,下面話不多說了,來一起看看詳細的介紹吧1 定義 Bean普通的 POJO 只要標注了 @Configuration 注解,就可以為 Spring 容器提供 Bean 的定義信息。

```java

@Configuration

public class SystemConfig {

/**

* 定義 Bean,并實例化

*

* @return

*/

@Bean

public UserDao userDao() {

return new UserDao();

}

@Bean

public DeptDao deptDao() {

return new DeptDao();

}

/**

* 定義 UserService,并把之前定義的 UserDao 與 DeptDao 注入進來

*

* @return

*/

@Bean

public UserService userService() {

UserService service = new UserService();

service.setUserDao(userDao());

service.setDeptDao(deptDao());

return service;

}

}

```

這個類的方法標注了 @Bean 注解,即為定義 Bean, Bean 的類型由方法返回值的類型決定,名稱默認和方法名同名,也可以通過入參顯示指定 Bean 名稱,比如 @Bean(name=”xxx”)。 @Bean 所標注的方法體提供了 實例化 Bean 的邏輯 。以上配置和下面的 xml 是等效的:

```java

```

基于 Java 類的配置方式和基于 XML 或者基于注解的配置方式相比——

Java 類的配置方式通過代碼編程的方式,可以更加靈活地實例化 Bean 和裝配 Bean 之間的關系。

XML 或者基于注解的方式都是通過聲明來定義配置的,所以靈活性上要遜一些,但在配置上更簡單 。

因為 @Configuration 注解類本身已經標注了 @Component,所以這些類可以像那些普通的 Bean 一樣被注入到其他的 Bean 中。

```java

@Configuration

public class ApplicationConfig {

@Autowired

private SystemConfig systemConfig;

@Bean

public AuthorityService authorityService() {

AuthorityService service = new AuthorityService();

service.setUserDao(systemConfig.userDao());

service.setDeptDao(systemConfig.deptDao());

return service;

}

}

```

Spring 會對配置類中所有標注了 @Bean 的方法使用 AOP 增強,引入 Bean 的生命周期管理邏輯。比如上面的 systemConfig.userDao(),它返回的是對應 Bean 的單例。在 @Bean 中,我們還可以通過標注 @Scope 注解來控制 Bean 的作用范圍:

```java

@Scope("prototype")

@Bean

public DeptDao deptDao() {

return new DeptDao();

}

```

這樣每次調用 deptDao() 方法都會返回一個新的實例:

```java

assertNotSame(authorityService.getDeptDao().hashCode(),authorityService

.getDeptDao().hashCode());

```

注意: 使用基于 Java 類進行配置,類路徑下必須有 Spring AOP 與 CGLib 庫。2 啟動 Spring 容器2.1 只使用 @Configuration 類可以使用 AnnotationConfigApplicationContext 類的構造函數傳入標注了 @Configuration 的 Java 類來啟動 Spring 容器 。

```java

ApplicationContext context=new AnnotationConfigApplicationContext(SystemConfig

.class);

UserService userService= (UserService) context.getBean("userService");

assertNotNull(userService);

```

如果存在多個 @Configuration 配置類,那么可以 AnnotationConfigApplicationContext 中注冊它們,然后再通過刷新容器應用這些配置類:

```java

AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();

//注冊多個配置類

context.register(SystemConfig.class);

context.register(ApplicationConfig.class);

//刷新容器(應用這些配置類)

context.refresh();

ApplicationConfig config=context.getBean(ApplicationConfig.class);

assertNotNull(config);

```

也可以通過 @Import 將多個配置類組裝到一個配置類中,然后僅需注冊這個組裝好的配置類 ,即可啟動容器:

```java

@Configuration

@Import(SystemConfig.class)

public class ApplicationConfig2 {

@Autowired

private SystemConfig systemConfig;

@Bean

public AuthorityService authorityService() {

AuthorityService service = new AuthorityService();

service.setUserDao(systemConfig.userDao());

service.setDeptDao(systemConfig.deptDao());

return service;

}

}

```

單元測試:

```java

AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(ApplicationConfig2.class);

ApplicationConfig2 config=context.getBean(ApplicationConfig2.class);

assertNotNull(config);

final AuthorityService authorityService = config.authorityService();

assertNotNull(authorityService.getDeptDao());

assertNotSame(authorityService.getDeptDao().hashCode(),authorityService

.getDeptDao().hashCode());

```

2.2 使用 XML 文件引用 @Configuration 類的配置標注了 @Configuration 的配置類也是一個 Bean,所以它也可以被 Spring 的 掃描到 。 因此如果希望將配置類組裝到 XML 的配置文件中,并通過 XML 的配置文件啟動 Spring,那么僅需要在 XML 中通過 掃描到相應的配置類即可 。

```java

```

2.3 在 @Configuration 類中引用 XML 文件的配置在 @Configuration 配置類中可以直接通過 @ImportResource 引入 XML 的配置文件,這樣就可以直接通過 @Autowired 引用 xml 配置文件中定義的 Bean。配置文件:

```xml

```

@Configuration 類:

```java

@ImportResource("classpath:beans5-11.xml")

@Configuration

public class ServiceConfig {

@Bean

@Autowired

public RelationService relationService(GroupDao groupDao,RoleDao roleDao){

RelationService service=new RelationService();

service.setGroupDao(groupDao);

service.setRoleDao(roleDao);

return service;

}

}

```

單元測試:

```java

AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext

(ServiceConfig.class);

ServiceConfig config=context.getBean(ServiceConfig.class);

assertNotNull(config);

RelationService service=config.relationService((GroupDao) context.getBean

("groupDao"),

(RoleDao) context

.getBean

("roleDao"));

assertNotNull(service.getRoleDao());

```

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

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

相關文章

2021 年最值得了解的 Node.js 工具(下)

大家好,我是若川,誠邀你加群長期交流。今天分享一篇用得上的 node 庫。下篇。鏈接地址:https://github.com/huaize2020/awesome-nodejs。上篇是:2021 年最值得了解的 Node.js 工具?前言:前端時間分享了這些node開源工…

技術點

前端所用技術 后臺頁面 感謝 H-ui、FlatLab 提供靜態頁面支持Ztree:jQuery樹插件DataTables:jQuery表格插件Layer:web彈層組件Distpicker:中國省市區地址三級聯動插件KindEditor:富文本編輯器 簡潔方便 沒UEditor那么多…

掃描java類文件_java遞歸與非遞歸實現掃描文件夾下文件的實例代碼

java遞歸與非遞歸實現掃描文件夾下所有文件java掃描指定文件夾下面的所有文件,供大家參考,具體內容如下掃描一個文件夾下面的所有文件,因為文件夾的層數沒有限制可能多達幾十層幾百層,通常會采用兩種方式來遍歷指定文件夾下面的所…

【阿里內部應用】基于Blink為新商業調控打造實時大數據交互查詢服務

基于Blink為新商業調控打造實時大數據交互查詢服務 案例與解決方案匯總頁:阿里云實時計算產品案例&解決方案匯總從IT到DT、從電商到新商業,阿里巴巴的每個細胞都存在大數據的DNA,如何挖掘大數據的價值成為搶占未來先機的金鑰匙&#xff0…

Vite 的好與壞

大家好,我是若川,誠邀你進群交流學習。今天分享一篇關于Vite的文章。學習源碼系列、面試、年度總結、JS基礎系列。全文 3000 字,歡迎點贊關注轉發一、Vite 是什么2020年4月,尤大大發了這么一個推:隨后,2021…

Windows phone 7新開發工具發布

春節假期已經接近尾聲. 馬上第一個工作日就要來臨. 春節真的不再是一個簡簡單單的節日. 有時讓人感到欣喜 這意味這一年的忙碌都會因為這個節日的到來而畫上一個終止符.面臨一個不長也不短的假期.眼下的一年翻過去 新的一年即將到來. 似乎一切都可以重新開始. 有時又令人感到無…

opentaps mysql_opentaps 1.4 聯接 mysql 筆記

opentaps 1.4 連接 mysql 筆記一、安裝 MySQ 略...二、創建MySQL Database opentaps ERP CRM1.mysql -u root -h 127.0.0.1 -p 2.mysql>create database opentaps default CHARACTER SET utf8 COLLATE utf8_general_ci;3.mysql>create user opentaps;4.mysql>grant …

這10道springboot常見面試題你需要了解下

1、什么是Spring Boot?多年來,隨著新功能的增加,spring變得越來越復雜。只需訪問https://spring.io/projects頁面,我們就會看到可以在我們的應用程序中使用的所有Spring項目的不同功能。如果必須啟動一個新的Spring項目&#xff0…

Silverlight中使用MIRIA進行觸屏編程

Silverlight for Windows phone7中可以使用XNA提供的功能進行觸屏編程,不過暫時還沒有網頁Silverlight的XNA移植。經過搜索發現MIRIA這個開源項目http://miria.codeplex.com/ 可以在Silverlight中實現Touch、Gesture的功能。 用法如下: 1、項目中引用MIG…

React 核心開發者 Dan Abramov 訪談實錄

大家好,我是若川。面試、學習源碼系列、年度總結、JS基礎系列譯者注:本譯文是在「在線對話 React.js 核心開發者」一個半小時直播的基礎上進行的原文翻譯,包括了直播中的所有問答內容,盡可能保留了 Dan 回答的中心語義&#xff0c…

python ev3圖形化編程軟件下載_mPython(圖形化編程軟件)

mPython是盛思技術團隊在BBC官方原版PythonEditor基礎上、拓展開發的應用軟件。可以進行可視化代碼編程,有hex、python、blockly三種代碼讀寫等功能。功能介紹1、不依賴網絡,可離線安裝使用2、支持hex、python、blockly三種代碼的讀寫3、blockly模式下支…

02-15 GUCCI 我喜歡的

我覺得,GUCCI是低調的奢華,價格不是很高,容易接近,符合我的風格,是現階段我的選擇 樣式我喜歡 希望我的生活質量步步高升,將來不再為追求物質生活而奮斗。 轉載于:https://www.cnblogs.com/yd1227/archive/…

php 批量修改mysql 數據表,字段 字符集編碼

$sql"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA 數據庫名稱";$r$pdo->query($sql,2);foreach($r as $v){//if($v[TABLE_NAME]!monxin_index_user){continue;} 代碼來源 夢行云軟件$sql"alter table ".$v[TABLE_NAME]." conver…

python如何安裝panda數據庫_在Pycharm中安裝Pandas庫方法(簡單易懂)

開發環境的搭建是一件入門比較頭疼的事情,在上期的文稿基礎上,增加一項Anaconda的安裝介紹。Anaconda是Python的一個發行版本,安裝好了Anaconda就相當于安裝好了Python,并且里面還集成了很多Python科學計算的第三方庫。比如我們需…

譯文 | Vue 在哪些方面做的比 React 更好?

大家好,我是若川。在過去的五年中,我一直是一名 React 工程師。我愛React。我喜歡開發 React 應用程序。我認為它是目前最好的UI框架之一。但是,在這個領域有一些競爭對手。其中最大的是 Vue.js 。我以前玩過一些 Vue.js,但我認為…

表單提交中Get和Post方式的區別及EncType表明提交數據的格式詳解

表單提交中Get和Post方式的區別1. get是從服務器上獲取數據,post是向服務器傳送數據。2. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP post機制,將表單…

web mp4第一幀_Web成幀器就在這里!

web mp4第一幀The Framer Team is pulling up it’s pants. I sniffed something cooking when they announced a public beta for Framer for web… FRAMER FOR WEB? Yes, I don’t know how they did it, but their powerful set of tools, plugins and animation controls …

Lucene學習總結之三:Lucene的索引文件格式(2)

2019獨角獸企業重金招聘Python工程師標準>>> 四、具體格式 上面曾經交代過,Lucene保存了從Index到Segment到Document到Field一直到Term的正向信息,也包括了從Term到Document映射的反向信息,還有其他一些Lucene特有的信息。下面對這…

JavaScript 數組 API 全解析

在編程世界中,數組是指元素的集合。數組將數據作為元素進行存儲,并在需要時將其取出。在支持數組的編程語言中廣泛地采用了這個數據結構。這個手冊會介紹 JavaScript 數組的所有知識。你將會學到復雜數據處理、解構、常用數組方法等內容。我為什么寫這篇…

Spoken English(001)

if he wants to make any changes,minor alternations can be made thenis there any way of ensuring well have enough time for our talks?so our evenings will be quite full then?We’ll leave some evenings free,that is, if it is all right with you.We’d have to…