javascript
将Spring Bean注入非托管对象
依賴注入帶來的好處可能會上癮。 使用注入配置應用程序結構比手動完成所有解析要容易得多。 當我們有一些在容器外部實例化的非托管類時,例如在Vaadin UI組件或JPA實體等其他框架中,它們是很難被退出的。 當我們使用域驅動設計時,后者尤其重要。 在Slawek Sobotka主持的 DDD培訓期間,我們正在討論消除骨料工廠中“不良耦合”的選項。 我相信您會承認,最好有一種通用機制能夠通過@Inject注釋定義的依賴關系來“激發(fā)”對象,而不是將所有必要的依賴關系注入特定的工廠,然后通過構造函數(shù),構建器或簡單的方法將它們傳遞給對象二傳手。
Spring框架為我們帶來了兩種不同的解決方案來實現(xiàn)這一要求。 我現(xiàn)在將對它們兩個進行描述。 讓我們從簡單的一個開始。
當我們使用通用存儲庫,前面提到的聚合工廠或什至任何其他工廠這樣的案例時,它僅在確保我們的代碼中只有很少的地方可以實例化容器外部的對象時,此功能特別強大。 在這種情況下,我們可以使用AutowireCapableBeanFactory類。 特別是,我們將對兩種方法感興趣:
- 無效的autowireBean(Object existingBean)
- 對象initializeBean(對象existingBean,字符串beanName)
第一個只是不使用特定的后處理器(例如@PostConstruct等)填充我們的bean。 第二種方法另外還應用了工廠回調,例如setBeanName和setBeanFactory,以及帶有@PostConstruct的任何其他后期處理程序。 在我們的代碼中,它將如下所示:
public abstract class GenericFactory<T> {@Autowiredprivate AutowireCapableBeanFactory autowireBeanFactory;public T createBean() {// creation logicautowireBeanFactory.autowireBean(createdBean);return createdBean;} }簡單而強大-我最喜歡的作品。
但是,當我們在代碼中有很多地方出生對象時,我們該怎么辦? 例如在Spring Web應用程序中構建Vaadin布局的情況。 注入調用autowireBean方法的自定義bean配置器對象不會達到生產力的頂峰。 幸運的是,Spring開發(fā)人員為我們帶來了@Configurable批注。 與方面相關聯(lián)的此注釋將配置每個帶注釋的對象,即使我們將使用new運算符在容器外部創(chuàng)建它也是如此。 與其他方面一樣,我們可以在
- 浪費時間(LTW)
- 建立時間浪費(BTW)。
第一個更易于配置,但是(由于檢測)我們依賴于應用程序服務器,在某些情況下這是不可取的。 要使用它,我們需要通過@EnableLoadTimeWeaving注釋@Configuration類(或者,如果您喜歡Flintstones和XML配置,則添加<context:load-time-weaver />標記)。完成配置后,只需通過@Configurable注釋類:
@Configurable public class MyCustomButton extends Button {@Autowiredprivate MyAwesomeService myAwesomeService;// handlers making use of injected service }第二個選項的設置稍微復雜一些,但是此后運行時會輕很多。 因為現(xiàn)在我們要加載方面直到編譯,所以我們必須將Aspectj編譯器集成到我們的構建中。 在Maven中,您需要添加一些依賴項:
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.7.3</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>3.2.4.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>3.2.4.RELEASE</version> </dependency> <dependency><groupId>javax.persistence</groupId><artifactId>persistence-api</artifactId><version>1.0</version><scope>provided</scope> </dependency>我希望您很好奇為什么在上面可以看到persistence-api。 當我看到在AspectJ編譯期間出現(xiàn)“無法確定缺少類型為javax.persistence.Entity的注釋”錯誤時,這對我來說也很奇怪。 答案可以在SpringFramework JIRA的SPR-6819中找到 。 當您在aspectj-maven-plugin中將spring-aspects配置為aspectLibrary時,會發(fā)生這種情況。 該問題三年多未解決,因此請更好地習慣。 我們需要做的最后一件事是將上述插件包含在我們的插件部分中。
<plugin><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><version>1.5</version><configuration><source>1.7</source><target>1.7</target><complianceLevel>1.7</complianceLevel><showWeaveInfo>true</showWeaveInfo><aspectLibraries><aspectLibrary><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId></aspectLibrary></aspectLibraries></configuration><executions><execution><goals><goal>compile</goal></goals></execution></executions> </plugin> 這就是所有人!
翻譯自: https://www.javacodegeeks.com/2013/09/injecting-spring-beans-into-non-managed-objects.html
總結
以上是生活随笔為你收集整理的将Spring Bean注入非托管对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (linux window)
- 下一篇: 使用Spring 3.2的Deferre