Tôi có một định nghĩa bean trong mùa xuân và đó là đối proxy đó có nghĩa là để được sử dụng ở khắp mọi nơi:ApplicationContext.getBean (Lớp clazz) không suôn sẻ với proxy
<bean name="my.Bean" class="org.springframework.aop.framework.ProxyFactoryBean" scope="prototype">
<property name="proxyInterfaces" value="my.Interface"/>
<property name="target" ref="my.BeanTarget"/>
<property name="interceptorNames">
<list>
<value>someInterceptor</value>
</list>
</property>
</bean>
<bean name="my.BeanTarget" class="my.InterfaceImpl" scope="prototype">
<property name="foo" ref="bar"/>
</bean>
bài này hoạt động tốt; và trong v3 thế giới trước mùa xuân Tôi đã sử dụng nó như
ApplicationContext ctx = ...;
my.Interface foo = (my.Interface) ctx.getBean("my.Bean"); // cast is necessary
Trong mùa xuân 3 nó đã trở thành có thể làm được loại tra cứu an toàn, ví dụ:
my.Interface foo = ctx.getBean(my.Interface.class);
Một lần nữa, điều này hoạt động tốt cho đậu bình thường trong khi cho đậu proxied Tôi đang nhận được my.BeanTarget
thay vì my.Bean
. Tôi đã cố gắng để inline my.BeanTarget
(như trong tài liệu hướng dẫn Spring) để làm cho nó ẩn, nhưng tất cả tôi nhận được
org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [my.Interface] is defined: expected single bean but found 0:
Vậy là nó có thể sử dụng loại tra cứu đậu an toàn với đậu proxy và nếu có - làm thế nào?
Bạn có thực sự cần tương tác trực tiếp với ngữ cảnh không? Hầu hết các ứng dụng của tôi chỉ cần khởi động nó và sau đó mọi thứ khác được xử lý với việc tiêm phụ thuộc (hoạt động cho các bean được proxied). Tôi đã thực hiện một số công cụ khung nơi tôi đã cần phải truy cập vào bối cảnh, nhưng, theo kinh nghiệm của tôi, nó rất hiếm. – SteveD
Hệ thống của chúng tôi khá rộng và một số bit và lớp không được sinh ra trong Spring (cũng không thể), vì vậy chúng phải sử dụng beanFactory/appCtx để nhận các phụ thuộc cần thiết. – mindas