Я только начинаю работать с концепцией Spring IOC. Я часто вижу, что большинство примеров, найденных в Интернете, используют код для получения объекта.
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Hello hello = (Hello) appContext.getBean("hello");
В качестве ссылки на эти вопросы 1 и 2 в stackoverflow. Я сделал вывод, что использовать appContext.getBean («привет») в коде необязательно, что считается плохой практикой. Кроме того, больше не рекомендуется. Поправьте меня прямо здесь, если мой вывод неверен.
Принимая это во внимание, я внес соответствующие изменения в свой проект. Вот мой 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>
Мой код класса contextProvider
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();
Чтобы получить объект DUtils в классе A, избегая использования ApplicationContext.getBean()
в любом месте моего кода.
Предположим, если у меня есть 10 классов, и мой класс A зависит от всех из них, чьи объекты должны быть созданы и доступны без использования ApplicationContext.getBean()
. В этом случае также, как было сделано выше, я подумал о создании свойств класса ContextProvider, за которым следуют установщики и получатели этого свойства, где get<PropertyName>
является статическим. Так что я могу использовать его везде, где мне нужен объект, например этот
ContextProvider.get<PropertyName>;
Вот мой краткий вопрос. Во-первых, верен ли мой подход? Если это правильно, загрузка всех компонентов при запуске, разве это не убивает производительность? Как бы вы сделали это в своих приложениях, не вызывая getBean хотя бы более одного раза?
Если бы вам нужно было разработать веб-приложение и реализовать Spring IOC, не используя ApplicationContext.getBean()
ни в одном коде. Как бы Вы это сделали?
Примечание. Что касается других вопросов, отмеченных выше
Вызов ApplicationContext.getBean () не является инверсией управления!
ApplicationContext
. В идеале он будет вызываться только один раз, и это будет объект начальной загрузки ... - person nicholas.hauschild   schedule 27.02.2013