2015-04-10 13 views
13

Tôi có một mô-đun/bình mà tôi đã tạo và đang sử dụng làm thư viện số util. Tôi tạo ra một dịch vụ trong đó như sau:Làm thế nào tôi có thể @Autowire một bean mùa xuân đã được tạo ra từ một bình bên ngoài?

@Service 
public class PermissionsService { ... } 

... nơi này nằm trong một gói ở đây: com.inin.architect.permissions và trong ứng dụng chính của tôi, tôi tham khảo/tải jar này (tức là thiết lập như là một sự phụ thuộc trong maven tập tin pom.xml cho ứng dụng) như sau:

<dependency> 
     <groupId>com.inin.architect</groupId> 
     <artifactId>permissions</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </dependency> 

và trong ứng dụng tôi muốn sử dụng dịch vụ như:

@Autowired 
PermissionsService permissions 

Trong thiết lập mùa xuân của ứng dụng, tôi đã nhận điều này:

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "com.inin.generator", "com.inin.architect.permissions" }) 
public class WebConfig extends WebMvcConfigurerAdapter implements ServletContextAware { } 

Tuy nhiên khi tôi chạy ứng dụng của tôi dưới tomcat, nó than phiền rằng không có một bean cho PermissionsService: "org.springframework.beans .factory.NoSuchBeanDefinitionException: Không có loại đậu đủ điều kiện ... "

Vì vậy, làm cách nào tôi có thể chuyển đậu từ thư viện lib vào ứng dụng của mình? Chắc chắn có một cách. Bạn có phải thiết lập thư viện như là một ứng dụng MVC mùa xuân thổi đầy đủ để điều này có thể làm việc? tức là bạn có phải thiết lập @Configuration và @ComponentScan trong thư mục lib không?

+1

Điều này chắc chắn có thể xảy ra. Điều đầu tiên cần kiểm tra là liệu tệp jar bên ngoài của bạn có đang được triển khai với tomcat cùng với mọi thứ khác không. Đôi khi nó xuống theo cách bạn đang triển khai, chứ không phải là mùa xuân autowiring. –

+1

Gói có chứa bean này được quét bởi Spring không? Tại sao bạn không cung cấp mã và cấu hình có liên quan? –

+0

Nếu đây là tên thật, bạn nên tuân thủ các quy ước đặt tên thông thường, tức là tên lớp bắt đầu bằng chữ hoa. – dunni

Trả lời

26

Bạn phải quét ít nhất gói có chứa lớp bạn muốn tiêm. Ví dụ: với chú thích Spring 4:

@Configuration 
@ComponentScan("com.package.where.my.class.is") 
class Config { 
... 
} 

Nguyên tắc tương tự cho cấu hình XML.

+0

Đây thực sự là vấn đề của tôi. Cảm ơn câu trả lời (Chấp nhận câu trả lời này). Trong ứng dụng của tôi đang kéo trong thư viện, tôi phải chắc chắn bao gồm gói của lib trong @ComponentScan(). Tôi không hoàn toàn đúng, và sau khi kiểm tra kỹ, tôi đã làm đúng. Cảm ơn một lần nữa! – BrianP

+1

bạn được chào đón :) –

+1

Thực ra, tôi đã thêm '@ EntityScan' &' @ ComponentScan' vào lớp '@ Configuration', với tất cả các tên gói phù hợp, nhưng có vẻ như bình bên ngoài của tôi vẫn không thể tự động tạo giao diện dịch vụ đang triển khai lớp '@ Service'. Có lẽ vấn đề đến từ chính thư viện bên ngoài nên chú thích giao diện? – Alex

15

Chỉ cần lưu ý về điều này, nhưng bạn có thể tách rời sự phụ thuộc của bạn từ mùa xuân. Trong lớp học @Configuration tạo

@Bean public PermissionsService permissionsService(){ 
    return new PermissionsService() 
} 

Điều này cũng sẽ cho phép nó được tiêm. Không phải là bạn phải loại bỏ chú thích mùa xuân của mình, chỉ là một tùy chọn làm cho nó có khả năng sử dụng được bên ngoài mùa xuân.

+0

Vâng, sau khi tôi đã tìm ra những gì đang diễn ra và chơi đùa với nó nhiều hơn một chút, tôi nhận thấy mình có thể tạo ra cái đậu như thế. – BrianP

+0

Điều này sẽ không hoạt động nếu bạn đang cố gắng tự động phát một giao diện. – jDub9

1

Bạn có thể nhập tệp ứng dụng context.xml cho com.inin.architect.permissions theo cách sau trong ứng dụng chính của bạn.

<import resource="classpath:/permissionApplicationContext.xml" /> 

này sẽ cho phép bạn autowire đậu từ com.inin.architect.permissions mà bạn đã xác định.

Các vấn đề liên quan