Я только начинаю с концепции Spring IOC. Я часто вижу, что большинство примеров, найденных в Интернете, используют код для получения объекта.
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Hello hello = (Hello) appContext.getBean("hello");
Как ссылка на эти вопросы 1 и 2 в stackoverflow. Я предположил, что нет необходимости использовать appContext.getBean( "hello" ) в коде, который считается плохой практикой. Кроме того, больше не рекомендуется. Исправьте меня прямо здесь, если мои выводы ошибочны.
Учитывая это, я внес изменения в свой проект. Здесь мой applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="utilClassRef" class="org.hd.derbyops.DUtils" lazy-init="false" />
<bean id="appContext" class="org.hd.derbyops.ContextProvider" lazy-init="false">
<property name="utils" ref="utilClassRef" />
</bean>
</beans>
Мой код класса CodeProvider
public class ContextProvider implements ApplicationContextAware {
private static ApplicationContext ctx;
/**
* Objects as properties
*/
private static DUtils utils;
public void setApplicationContext(ApplicationContext appContext)
throws BeansException {
ctx = appContext;
}
public static ApplicationContext getApplicationContext() {
return ctx;
}
public static DUtils getUtils() {
return utils;
}
public void setUtils(DUtils dUtilsRef) {
utils = dUtilsRef;
}
}
Например, рассмотрим класс A, который зависит от org.hd.derbyops.DUtils. Я использую следующую строку кода
ContextProvider.getUtils();
inorder, чтобы получить объект DUtils в классе A, тем самым избегая использования ApplicationContext.getBean()
в любом месте моего кода.
Предположим, что если у меня есть 10 классов, а мой класс A зависит от всех из них, чьи объекты должны быть созданы и доступны без использования ApplicationContext.getBean()
. В этом случае, как было сделано выше, я подумал о создании свойств класса ContextProvider, за которыми следуют setter и getter этого свойства, где в get<PropertyName>
статично. Таким образом, я могу использовать его везде, где мне нужен объект, вроде этого
ContextProvider.get<PropertyName>;
Вот мой краткий вопрос. Во-первых, верно ли мой подход? Если это так, загрузите все beans при запуске, не будет ли это убийцей производительности? Как бы вы это делали в своих приложениях, не вызывая getBean по крайней мере один раз?
Если вы должны были создать веб-приложение, и вы должны были реализовать Spring IOC, не используя ApplicationContext.getBean()
в любом из кода. Как бы Вы это сделали?
Примечание: со ссылкой на другие теги, отмеченные выше
Вызов ApplicationContext.getBean() не является инверсией управления!