1

我有一个这样的服务类:

@Service
public class CompanyServiceImpl implements CompanyService {

    @Autowired
    private CompanyDAO companyDAO;

    @Transactional
    public void addOrUpdateCompany(Company company) {
        companyDAO.addOrUpdateCompany(company);
    }

}

通常,我可以通过以下方式从 Spring 获得 CompanyService 的实例:

@Autowired
CompanyService companyService;

但是,在某些情况下,我想在没有 @Autowired 的情况下创建/获取 CompanyService 的安装,如下所示:

CompanyService companyService  = XXX.getxxx("CompanyService");

有什么方法可以做到这一点吗?

4

3 回答 3

2

如果我理解正确,您的意思是像 - ServiceLocatorFactoryBean 这样的东西,您可以调用类似MyService getService(String id)).

另一种方法是实现某种控制器服务,它将所有其他服务自动连接到它,并将保存从它们的字符串 id 到实际实例的映射。

在我看来,第二种选择更好,因为它更易于管理和清晰。

希望对您有所帮助。

于 2012-04-06T11:33:20.463 回答
2

另一种方式是


@Component
public class ContextHolder implements ApplicationContextAware {
    private static ApplicationContext CONTEXT;

    public void setApplicationContext(ApplicationContext applicationContext) {
        CONTEXT = applicationContext;
    }

    public static ApplicationContext getContext() {
        return CONTEXT;
    }
}

进而

CompanyService service = ContextHolder.getContext().getBean(CompanyService.class);
于 2012-04-06T11:55:50.127 回答
1

你能行的。您需要实例化应用程序上下文,然后继续。

Resource res = new FileSystemResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);

或者

ClassPathResource res = new ClassPathResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);

或者

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
    new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
// of course, an ApplicationContext is just a BeanFactory
BeanFactory factory = (BeanFactory) appContext;

并使用:

MyObject my = (MyObject)factory.getBean(NAME_OF_YOUR_BEAN);
于 2012-04-06T11:35:08.107 回答