我的应用中有一个案例,我需要使用对象AccountsDao accountsDao
public class Account {
@Autowired
private AccountsDao accountsDao;
没有将属性@Component
放到Account
类(并且没有任何其他方法将其标记为弹簧bean)。
应用程序非常庞大,并且有一个客观原因,Account
必须不是Spring Bean,必须手动初始化。
我也知道这是一个案例,而且常见的结构还可以。
有办法吗?
答案 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/
答案 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);