在 Spring Boot 專案中,我們通過靜態方法訪問我們的非托管 DAO 類:
MyDao myDao = DaoProvider.getMyDao();
我們在 Spring 托管@Service類中使用它:
@Service
public class MyService {
public void foo() {
MyDao myDao = DaoProvider.getMyDao();
myDao.bar();
....
}
}
這使得撰寫單元測驗變得困難。靜態模擬是沒有選擇的,因為它們會減慢我們的構建管道。
我們寧愿有一個具有@Autowired或建構式依賴項和某種配置的解決方案,它決定要注入哪個類:
@Service
public class MyService {
@Autowired
MyDao myDao;
public void foo() {
myDao.bar();
....
}
}
顯然,必須有人告訴 Spring 要注入什么類,因為MyDao沒有 Spring 托管 bean。有沒有辦法這樣做?:
@Configuration
public class NonManagedSpringInjectionConfiguration {
@Bean
MyDao getMyDao() {
return DaoProvider.getMyDao();
}
}
uj5u.com熱心網友回復:
選項1
如果您不想將您的MyDaoBean 變成 Spring 管理的 Bean,那么更簡單且可能是最好的選擇是以MyService編程方式創建Spring 管理的 Bean,而不是依賴于@Service注解。首先,剛取出@Service的MyService,調整它的建構式接受MyDao:
public class MyService {
MyDao myDao;
public MyService(MyDao myDao) {
this.myDao = myDao;
}
public void foo() {
myDao.bar();
....
}
}
現在你只需要在 Configuration 類中注冊一個MyServicebean @Bean,如下所示:
@Configuration
public class WhateverConfiguration {
@Bean
MyService myService() {
return new MyService(DaoProvider.getMyDao());
}
}
選項 2
相反,如果有可能制作MyDao一個 Spring 管理的 Bean,那么就保持NonManagedSpringInjectionConfiguration原樣:
@Configuration
public class NonManagedSpringInjectionConfiguration {
@Bean
MyDao getMyDao() {
return DaoProvider.getMyDao();
}
}
但是然后依靠建構式注入而不是 on @Autowired。它使MyService單元測驗更容易,并且還明確定義了正常作業MyDao所必需的MyService。在這種情況下,您將保留@Service并依賴 Spring 來實體化它:
@Service
public class MyService {
MyDao myDao;
public MyService(MyDao myDao) {
this.myDao = myDao;
}
public void foo() {
myDao.bar();
....
}
}
uj5u.com熱心網友回復:
您只需要指定組態檔,例如:
@Configuration
public class NonManagedSpringInjectionConfiguration {
@Bean
@Profile("dev")
MyDao getMyDao() {
return DaoProvider.getMyDao();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/377913.html
