2010-09-28 27 views
94

Hãy nói rằng chúng tôi có một lớp:Làm thế nào để tiêm phụ thuộc vào một đối tượng tự khởi tạo trong mùa xuân?

public class MyClass { 
    @Autowired private AnotherBean anotherBean; 
} 

Sau đó, chúng tôi tạo ra một đối tượng của lớp này (hoặc một số khuôn khổ khác đã tạo ra các thể hiện của lớp này).

MyClass obj = new MyClass(); 

Vẫn có thể tiêm phụ thuộc? Một cái gì đó như:

applicationContext.injectDependencies(obj); 

(Tôi nghĩ rằng Google Guice có một cái gì đó như thế này)

Trả lời

141

Bạn có thể thực hiện việc này bằng cách sử dụng phương thức autowireBean() của AutowireCapableBeanFactory. Bạn truyền cho nó một đối tượng tùy ý, và Spring sẽ xử lý nó như một thứ gì đó mà nó tạo ra, và sẽ áp dụng các bit và các phần tự động khác nhau.

Để có được giữ của AutowireCapableBeanFactory, chỉ autowire rằng:

private @Autowired AutowireCapableBeanFactory beanFactory; 

public void doStuff() { 
    MyBean obj = new MyBean(); 
    beanFactory.autowireBean(obj); 
    // obj will now have its dependencies autowired. 
} 
+0

Câu trả lời hay (+1). Ngoài ra còn có một phương pháp thứ hai, nơi bạn có thể ảnh hưởng đến cách tự động xảy ra: http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html# autowireBeanProperties% 28java.lang.Object,% 20int,% 20boolean% 29 –

+0

Nhưng nếu tôi có hai đối tượng và thứ tự autowires thứ hai. Làm thế nào autowire nhà máy đậu giao dịch với phụ thuộc trong trường hợp? –

+2

Đây thực sự là một mẫu xấu. Nếu đây là cách bạn thực sự sử dụng MyBean tại sao không chỉ có constructor với AnotherBean làm tham số. Một cái gì đó như: 'code' private @Autowired AnotherBean bean; public void doStuff() {MyBean obj = new MyBean (đậu); } 'code'. Dường như giống với tất cả các chú thích này, mọi người trở nên thực sự bối rối và không sử dụng mẫu cơ bản trong java SDK kể từ ngày 1. :( – Denis

-6

Không phải không có cách giải quyết một số, như mùa xuân không biết gì về trường hợp này.

Câu hỏi thực sự là: tại sao bạn tạo các thể hiện của một lớp mà bạn muốn phụ thuộc được chèn vào theo cách thủ công, thay vì để Spring kiểm soát nó? Tại sao lớp học không sử dụng MyClass nhận được MyClass được tiêm vào đó?

+12

Câu trả lời của bạn không chính xác và "câu hỏi thực sự" là nhận xét chứ không phải là câu trả lời. –

13

Bạn cũng có thể đánh dấu MyClass của bạn với chú thích @Configurable:

@Configurable 
public class MyClass { 
    @Autowired private AnotherClass instance 
} 

Sau đó, vào thời điểm tạo ra nó sẽ tự động tiêm phụ thuộc của nó . Bạn cũng nên có <context:spring-configured/> trong ngữ cảnh ứng dụng của mình xml.

+2

Galz666, phương pháp của bạn trông sạch sẽ hơn cho những gì tôi muốn làm. Tuy nhiên tôi không thể làm cho nó hoạt động. Tôi không có tệp xml và đang sử dụng cấu hình Java hoàn toàn. Có tương đương với '' không? – masstroy

+0

xem http://stackoverflow.com/a/4703781/404615 –

+0

Đây là giải pháp sạch, nhưng đòi hỏi nhiều nỗ lực hơn một chút: Bạn nên sử dụng thời gian tải dệt như iimuhin hiển thị ở trên hoặc thêm trình biên dịch AspectJ vào dự án. Thời gian tải như tên đề xuất sẽ gây ra chi phí bổ sung khi chạy. – jsosnowski

0

Chỉ cần có cùng nhu cầu và trong trường hợp của tôi, nó đã là logic bên trong lớp java không thể quản lý mùa xuân có quyền truy cập vào ApplicationContext. Lấy cảm hứng từ scaffman. Được giải quyết bởi:

AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory(); 
factory.autowireBean(manuallyCreatedInstance); 
Các vấn đề liên quan