解讀Spring配置與服務(wù)組件的關(guān)系和注入機(jī)制
1. 基本知識
使用 Spring 框架進(jìn)行開發(fā)時,理解配置類與服務(wù)組件之間的關(guān)系,以及如何通過依賴注入將它們串聯(lián)起來,是非常重要的
1.1 配置類(@Configuration)
配置類是 Spring 中用于定義 Bean 的地方
通常使用 @Configuration 注解標(biāo)記,表示這是一個配置類,Spring 將會掃描這些類并注冊其定義的 Bean
@Configuration
@ComponentScan(basePackages = "com.example.myapp")
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}基本的參數(shù)補(bǔ)充如下:
- 定義 Bean:通過 @Bean 注解的方法可以返回一個 Bean 對象,Spring 容器將會管理這個 Bean 的生命周期
- 包掃描:使用 @ComponentScan 注解可以指定掃描的包,自動發(fā)現(xiàn)并注冊 Spring 組件(例如 @Component, @Service, @Repository 等)
1.2 實(shí)現(xiàn)類(@Service)
通常使用 @Service 注解標(biāo)記,表示這是一個業(yè)務(wù)服務(wù)組件
通常實(shí)現(xiàn)一個接口,并在其內(nèi)部封裝了具體的業(yè)務(wù)邏輯
@Service
public class MyServiceImpl implements MyService {
private final MyRepository myRepository;
@Autowired
public MyServiceImpl(MyRepository myRepository) {
this.myRepository = myRepository;
}
@Override
public void performService() {
// 業(yè)務(wù)邏輯實(shí)現(xiàn)
}
}主要的功能如下:
- 業(yè)務(wù)邏輯實(shí)現(xiàn):服務(wù)類實(shí)現(xiàn)具體的業(yè)務(wù)邏輯
- 依賴注入:服務(wù)類通常會通過構(gòu)造函數(shù)或字段注入所需的依賴(例如其他服務(wù)、配置屬性等)
1.3 依賴注入(Dependency Injection)
允許將依賴對象(即其他 Bean)注入到目標(biāo) Bean 中,減少了對象間的耦合度
主要的方式有如下:
- 構(gòu)造函數(shù)注入:通過構(gòu)造函數(shù)將依賴注入到 Bean 中
- 這種方式通常是推薦的,因?yàn)樗梢源_保依賴在 Bean 創(chuàng)建時就被提供
@Service
public class MyService {
private final AnotherService anotherService;
@Autowired
public MyService(AnotherService anotherService) {
this.anotherService = anotherService;
}
}- 字段注入:通過直接將依賴注入到字段中
- 這種方式相對簡單,但不如構(gòu)造函數(shù)注入顯式
@Service
public class MyService {
@Autowired
private AnotherService anotherService;
}- 方法注入:通過特定的方法注入依賴,通常用于處理需要在運(yùn)行時決定的依賴
@Service
public class MyService {
private AnotherService anotherService;
@Autowired
public void setAnotherService(AnotherService anotherService) {
this.anotherService = anotherService;
}
}1.4 組件類(@Component)
可以被自動發(fā)現(xiàn)和注冊為 Spring 管理的 Bean
@Component
public class MyComponent {
// 組件邏輯
}用于標(biāo)記一個普通的組件類,可以是任意的類,不特定于服務(wù)、倉庫等特定角色
2. 實(shí)戰(zhàn)
為更好展示實(shí)戰(zhàn)項(xiàng)目中的運(yùn)用,結(jié)合上述的知識點(diǎn)給予案例
以下的Demo只列出代碼前半部分,主要是為了更好的說明
JmReportConfiguration配置了 manongServiceImpl 作為 BeanmanongServiceImpl實(shí)現(xiàn)了 manongServiceI 接口manongClient依賴于 manongServiceI,并通過 Spring 注入使用它
2.1 配置類
- 通過 @ComponentScan 注解掃描指定的包,自動發(fā)現(xiàn)和注冊 Spring 組件
- 使用 @Bean 注解定義一個名為 manongService 的 Bean,類型為 manongServiceI
- 此方法會創(chuàng)建 manongServiceImpl 的實(shí)例,并將其作為 Spring 容器中的 Bean
@Configuration(proxyBeanMethods = false)
@ComponentScan(basePackages = "org.jeecg.modules.jmreport") // 掃描積木報表的包
public class JmReportConfiguration {
@Bean
public manongServiceI manongService(A a, B b) {
return new manongServiceImpl(a, b);
}
}2.2 實(shí)現(xiàn)類
使用 @RequiredArgsConstructor 注解自動生成一個包含所有 final 字段的構(gòu)造函數(shù),
補(bǔ)充閱讀:詳細(xì)分析Java中@RequiredArgsConstructor注解的基本知識(附Demo)
@RequiredArgsConstructor
public class manongServiceImpl implements manongServiceI {
private final A a;
private final B b;
}2.3 接口類
這是一個接口,定義了服務(wù)的合同
public interface manongServiceI {
}2.4 組件類
負(fù)責(zé)與 manongServiceI 進(jìn)行交互
默認(rèn)構(gòu)造函數(shù),通過 Spring 的 @Autowired 注解注入依賴
@Component("manongClient")
public class manongClient {
@Autowired(required = false)
private manongServiceI jimuTokenService;
@Autowired(required = false)
private JmReportBaseConfig jmBaseConfig;
public manongClient() {
}
}總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java對象轉(zhuǎn)JSON時動態(tài)的增刪改查屬性詳解
這篇文章主要介紹了Java對象轉(zhuǎn)JSON時如何動態(tài)的增刪改查屬性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
一文詳解如何使用線程池來優(yōu)化我們的應(yīng)用程序
線程池是一種工具,但并不是適用于所有場景。在使用線程池時,我們需要根據(jù)應(yīng)用程序的性質(zhì)、計(jì)算資源的可用性和應(yīng)用程序的需求進(jìn)行適當(dāng)?shù)呐渲谩1疚闹饕榻B了如何使用線程池來優(yōu)化我們的應(yīng)用程序,需要的可以參考一下2023-04-04
JavaWeb-WebSocket瀏覽器服務(wù)器雙向通信方式
文章介紹了WebSocket協(xié)議的工作原理和應(yīng)用場景,包括與HTTP的對比,接著,詳細(xì)介紹了如何在Java中使用WebSocket,包括配置類、服務(wù)編寫和前端頁面的實(shí)現(xiàn)2025-02-02
springboot調(diào)用HTML文件注意事項(xiàng)及說明
這篇文章主要介紹了springboot調(diào)用HTML文件注意事項(xiàng)及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11

