2017-07-21 74 views
1

我有一個彈簧啓動應用程序,它有一個mongo存儲庫並使用彈簧數據連接到它。這意味着有一個「實體」類,然後是一個「存儲庫」類。用於訪問數據對象的Spring Boot程序結構

但是,要實際使用存儲庫,我需要彈出@Autowire我的repo到另一個類中的變量(我們稱之爲X),它可能想要使用它。但是,如果X類本身不是Spring bean,它只是一個普通的pojo,它由某個地方的「new X」創建,然後它不能使用Autowiring,因此不能使用repo。

這看起來像是一個展示塞......沒有人可以在一些非常特殊的情況之外使用回購,例如直接從RestController調用回購或者沒有任何干預邏輯的回收。但我相信人們正在使用它。

所以我的問題是如何構造代碼,以便它可以使用?我是否需要做一堆處理,然後返回到控制器與數據庫進行交互?有沒有辦法創建某種其他「中間助手bean」來調解連接?應該是什麼樣子?

免責聲明:我是相當新的春天

+0

你可以考慮用'Provider'而不是'new'實例化'X'嗎? –

回答

1

也許我可以發表一些可以澄清你的情況的摘錄。

@Repository 
public class MyRepositoryImpl implements MyRepository { 
    //CRUD implementation or whatever 
} 

在不同的包:

@Service 
public class MyServiceImpl implements MyService { 

    @Autowired //constructor-injection 
    public MyService(MyRepository myRepository) { 
     this.myRepository = myRepository; 
    } 

    private final MyRepository myRepository; 

    public void myBusinessLogic() { 
     MyPojo pojo = new MyPojo(); //not dependent on Spring 
     myRepository.doSomething(); 
     //place calls to X here as needed 
    } 
} 

最後:

@Controller 
public class MyController { 

    @Autowired 
    public MyController(MyService myService) { 
     this.myService = myService; 
    } 

    private final MyService myService; 

    @GetMapping("/myPage") 
    public String doIt() { 
     myService.myBusinessLogic(); 
     return "myPage"; 
    } 
} 

MyRepositoryMyService一個

//nothing spring specific 
public class MyPojo { 
    //properties 
} 
在不同包

這些接口將包含各自實現的合約。

單一職責原則

主要一點要注意的是,你的POJO是不會「使用回購」,你在你的問題提了。它代表一個實體,不應該關心任何特定的存儲庫。這似乎與你的問題有關 - POJO不應該調用存儲庫(在這種情況下是你的「X」類)。似乎應該重新審視設計,如果是這樣的話。

+0

我想我理解,我認爲這是有道理的。謝謝 – MichaelB

+0

當然,讓我知道你是否希望我澄清任何事情。堅持下去 - 它變得更容易! – bphilipnyc

1

就像你說的,你只能在對象自動裝配領域本身是自動裝配。這是豆注入所固有的。您應該使用@Component來註釋X,並將其注入需要的地方。

+0

但是X有其他依賴於被類調用「new」(請求,其他服務調用等)的類所捕獲的東西的字段,當構造函數需要知道這些時,如何創建@Component事情呢? – MichaelB