解讀Spring配置與服務組件的關系和注入機制
1. 基本知識
使用 Spring 框架進行開發(fā)時,理解配置類與服務組件之間的關系,以及如何通過依賴注入將它們串聯(lián)起來,是非常重要的
1.1 配置類(@Configuration)
配置類是 Spring 中用于定義 Bean 的地方
通常使用 @Configuration 注解標記,表示這是一個配置類,Spring 將會掃描這些類并注冊其定義的 Bean
@Configuration @ComponentScan(basePackages = "com.example.myapp") public class AppConfig { @Bean public MyService myService() { return new MyServiceImpl(); } }
基本的參數(shù)補充如下:
- 定義 Bean:通過 @Bean 注解的方法可以返回一個 Bean 對象,Spring 容器將會管理這個 Bean 的生命周期
- 包掃描:使用 @ComponentScan 注解可以指定掃描的包,自動發(fā)現(xiàn)并注冊 Spring 組件(例如 @Component, @Service, @Repository 等)
1.2 實現(xiàn)類(@Service)
通常使用 @Service 注解標記,表示這是一個業(yè)務服務組件
通常實現(xiàn)一個接口,并在其內(nèi)部封裝了具體的業(yè)務邏輯
@Service public class MyServiceImpl implements MyService { private final MyRepository myRepository; @Autowired public MyServiceImpl(MyRepository myRepository) { this.myRepository = myRepository; } @Override public void performService() { // 業(yè)務邏輯實現(xiàn) } }
主要的功能如下:
- 業(yè)務邏輯實現(xiàn):服務類實現(xiàn)具體的業(yè)務邏輯
- 依賴注入:服務類通常會通過構造函數(shù)或字段注入所需的依賴(例如其他服務、配置屬性等)
1.3 依賴注入(Dependency Injection)
允許將依賴對象(即其他 Bean)注入到目標 Bean 中,減少了對象間的耦合度
主要的方式有如下:
- 構造函數(shù)注入:通過構造函數(shù)將依賴注入到 Bean 中
- 這種方式通常是推薦的,因為它可以確保依賴在 Bean 創(chuàng)建時就被提供
@Service public class MyService { private final AnotherService anotherService; @Autowired public MyService(AnotherService anotherService) { this.anotherService = anotherService; } }
- 字段注入:通過直接將依賴注入到字段中
- 這種方式相對簡單,但不如構造函數(shù)注入顯式
@Service public class MyService { @Autowired private AnotherService anotherService; }
- 方法注入:通過特定的方法注入依賴,通常用于處理需要在運行時決定的依賴
@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 { // 組件邏輯 }
用于標記一個普通的組件類,可以是任意的類,不特定于服務、倉庫等特定角色
2. 實戰(zhàn)
為更好展示實戰(zhàn)項目中的運用,結合上述的知識點給予案例
以下的Demo只列出代碼前半部分,主要是為了更好的說明
JmReportConfiguration
配置了 manongServiceImpl 作為 BeanmanongServiceImpl
實現(xiàn)了 manongServiceI 接口manongClient
依賴于 manongServiceI,并通過 Spring 注入使用它
2.1 配置類
- 通過 @ComponentScan 注解掃描指定的包,自動發(fā)現(xiàn)和注冊 Spring 組件
- 使用 @Bean 注解定義一個名為 manongService 的 Bean,類型為 manongServiceI
- 此方法會創(chuàng)建 manongServiceImpl 的實例,并將其作為 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 實現(xiàn)類
使用 @RequiredArgsConstructor 注解自動生成一個包含所有 final 字段的構造函數(shù),
補充閱讀:詳細分析Java中@RequiredArgsConstructor注解的基本知識(附Demo)
@RequiredArgsConstructor public class manongServiceImpl implements manongServiceI { private final A a; private final B b; }
2.3 接口類
這是一個接口,定義了服務的合同
public interface manongServiceI { }
2.4 組件類
負責與 manongServiceI 進行交互
默認構造函數(shù),通過 Spring 的 @Autowired 注解注入依賴
@Component("manongClient") public class manongClient { @Autowired(required = false) private manongServiceI jimuTokenService; @Autowired(required = false) private JmReportBaseConfig jmBaseConfig; public manongClient() { } }
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。