Spring在@Component中不使用@Autowired字段

时间:2016-07-12 10:10:48

标签: java spring spring-mvc

我的应用中有一个案例,我需要使用对象AccountsDao accountsDao

public class Account {

    @Autowired
    private AccountsDao accountsDao;

没有将属性@Component放到Account类(并且没有任何其他方法将其标记为弹簧bean)。

应用程序非常庞大,并且有一个客观原因,Account必须不是Spring Bean,必须手动初始化。

我也知道这是一个案例,而且常见的结构还可以。

有办法吗?

4 个答案:

答案 0 :(得分:1)

你不应该这样做,尤其是没有BeanUtils(绝对反模式),并且有理由,为什么默认情况下不支持这种情况。如果您确实需要DAO,请执行类似

的操作
public class Account {
  public void doSomethingWithDao(AccountDao accountDao) {
    // TODO do somthing with dao, but do not store it in a field
  }
} 

编辑:这是你怎么称呼它:

@Component
public class MyBusinessLogicClass {
  @Autowired
  private AccountDao accountDao;

  public void doMyBusinessLogic(Account account) {
    account.doSomethingWithDao(accountDao);
  }
}

答案 1 :(得分:0)

您可以通过programmaticaly获取spring context,并从中获取AccountsDoa。您可以在Account构造函数中执行此操作。 Spring get current ApplicationContext 第二个回应。

答案 2 :(得分:0)

如果AccountsDao的构建时间Account可用,您可以自己进行构造函数注入。

public class Account {

    private final AccountsDao accountsDao;

    public Account(AccountsDao accountsDao) {
        this.accountsDa = accountsDao;
    }
}

除此之外还有@Configurable,但据我所知,这需要AspectJ。

http://olivergierke.de/2009/05/using-springs-configurable-in-three-easy-steps/

Spring autowiring using @Configurable

答案 3 :(得分:0)

添加SpringUtils.java

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

@Component
public class SpringUtils implements BeanFactoryPostProcessor {

    private static ConfigurableListableBeanFactory beanFactory;

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
        // TODO Auto-generated method stub
        SpringUtils.beanFactory = arg0;
    }

    public static <T> T getBean(Class<T> clz) throws BeansException {
        T result = (T) beanFactory.getBean(clz);
        return result;
    }

}

使用

AccountsDao accountsDao = SpringUtils.getBean(AccountsDao.class);