访问由IoC初始化的@Component Beans

时间:2014-04-16 10:51:02

标签: java spring spring-mvc autowired

我正在尝试访问一个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: 

2 个答案:

答案 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以简单,一致的方式出于各种原因(缓存,安全性等)添加代理。