#spring
#весенний
Вопрос:
Основной компонент в моем классе имеет объект, создание которого чрезвычайно дорого и, следовательно, должно быть создано только один раз, а затем передано различным утилитам, которым это может потребоваться.
public class DaemonBean implements InitializingBean
{
ReallyExpensiveToCreate obj;
public ReallyExpensiveToCreate getReallyExpensive() { return obj; }
@Override
public void afterPropertiesSet()
{
//initialize and build ReallyExpensiveToCreate
}
}
Этот объект требуется классу Util, который состоит из набора статических функций.
public class Util
{
public static ReallyExpensiveToCreate objRef = getReallyExpensiveObj();
private ReallyExpensiveToCreate getReallyExpensiveObj()
{
//Get Daemon obj from Spring and call daemonObj.getReallyExpensive();
}
public void func1() { //Use objRef in logic }
}
Как мне получить объект демона из Spring. Я не уверен, какой код вызывать, чтобы иметь возможность получить ссылку на объект демона. Я видел фрагменты кода, где использовался ApplicationContext, но я не уверен, как это будет использоваться.
Ответ №1:
Вы ищете шаблон Service-locator,
Реализация весной
Вы можете зарегистрироваться ApplicationContextAware
, получить ссылку на ApplicationContext
bean и статически обслуживать его
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext ctx;
private static final String USER_SERVICE = "userServiceBean";
@Override
public void setApplicationContext(ApplicationContext appContext)
throws BeansException {
ctx = appContext;
}
public static ApplicationContext getApplicationContext() {
return ctx;
}
public static UserService getUserService(){return ctx.getBean(USER_SERVICE);}
}
Ответ №2:
public class Util {
private static ReallyExpensiveToCreate objRef;
public void objectFunction() {
objRef.doSomething();
}
public static void staticFunction() {
objRef.doSomething();
}
@Autowired
public void setReallyExpensiveBeanToCreate(DaemonBean daemonBean) {
Util.objRef = daemonBean.getReallyExpensive();
}
}