我正在尝试访问一个bean,该bean使用@Component
注释并由Spring IoC初始化。我有一个抽象类,它应该在静态方法中返回正确的具体子类。
但我总是面对NoSuchBeanDefinitionException
。
我在我的一个@Autowired
类中测试了@Controller
我的OrderFactoryFinland,并且Spring IoC正确地初始化了所有DAO字段。
所以在我看来,应该以某种方式在静态方法中访问这个Singleton实例吗?
具体子类:
@Component
public class OrderFactoryFinland extends OrderFactory {
@Autowired private TenantDao<Material> materialDao;
}
抽象超类:
public abstract class OrderFactory {
@Autowired protected UserService userService;
public static OrderFactory getOrderFactory(Company company) throws Exception {
ApplicationContext context = ApplicationContextProvider.getApplicationContext();
Integer companyNumber = new Integer(company.getCompanyNumber());
if (companyNumber.equals(SystemGlobals.COMPANY_NUMBER_FINLAND)) {
return context.getBean(OrderFactoryFinland.class);
} else if () {
...
}
}
}
例外:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.xxx.yyy.order.fin.OrderFactoryFinland] is defined: expected single bean but found 0:
答案 0 :(得分:0)
您必须使用@Autowired
注释访问应用程序上下文,而不是使用实现ApplicationContextProvider
的自定义ApplicationContextAware
。
现在我已经接受了我所有的豆子。所以这似乎是一个时间问题。
private static ApplicationContext context;
@Autowired
public void setContext(ApplicationContext context) {
OrderFactory.context = context;
}
答案 1 :(得分:0)
正如NoSuchBeanDefinitionException
所示,错误发生是因为Spring无法找到OrderFactoryFinland
bean。由于它已使用@Component
进行注释,我猜您打算使用组件扫描来获取它?确保包含正确的包装。无论您使用的是基于XML的配置<context:component-scan ... >
还是基于Java的配置@ComponentScan(...)
,这都适用。
在更高级别上,所有Spring bean默认为Singelton Scope,这意味着Spring的应用程序上下文中只有一个共享实例可以获得依赖注入。 Springs执行此操作的方法基于对象实例,这意味着您应该为逻辑使用实例方法(而不是静态类方法)。这种方法的原因是,这允许Spring以简单,一致的方式出于各种原因(缓存,安全性等)添加代理。