Новое весной: загрузить контекст приложения

Я новичок в весне.

До сих пор в моем приложении каждый раз, когда мне нужно использовать бин, я загружаю XML.

ApplicationContext context = new ClassPathXmlApplicationContext ("applicationContext.xml");

Таким образом, в каждом классе, где мне нужно загрузить определенный компонент, я использую приведенную выше строку.

С точки зрения эффективности или правильного использования, я хотел бы знать, является ли это правильным использованием (я подозреваю, что это не так) или контекст должен передаваться в качестве параметра каждый раз, когда это требуется одному классу.

Спасибо

3 ответа

Я предполагаю, что вы используете Spring в не-веб-приложении.

Если вы создаете новый контекст приложения каждый раз, когда вам нужно получить объект EJB, это действительно не правильное решение. Вы должны создать контекст приложения один раз для каждого приложения.

Таким образом, решение будет таким, как вы предлагаете передать экземпляр контекста приложения нужным классам или иным образом гарантировать, что вы используете тот же экземпляр в своем приложении.

Одной из многих проблем, с которыми вы можете столкнуться при текущей настройке, является проблема с областью действия компонента. В Spring есть синглтон-бины, но это синглтоны только в одном контексте приложения. Поэтому, если вы извлекаете bean-компонент, являющийся одноэлементным, из двух разных контекстов приложения, они не будут одним и тем же экземпляром. Другие проблемы будут связаны с производительностью, потому что создание контекста приложения будет дорогой операцией.

Просто загрузите файл XML и создайте объект контекста приложения. Пока загружен XML, Spring будет внедрять все зависимости объекта.

Таким образом, вам не нужно загружать или создавать объект контекста приложения снова и снова. Просто проверьте вашу консоль с приведенным ниже примером, вы поймете это.

Пример: в методе main вы пишете только эту строку кода.

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

interface IParent {
    public void whoAreYou();
}

class ChildA implements IParent {

    public ChildA (IParent ChildB) {
        super();
        System.err.println("Constructor ChildA ");
        ChildB.whoAreYou();
    }

    public ChildA (){
        System.err.println("Constructor ChildA ");
    }

    @Override
    public void whoAreYou() {
        System.err.println("ChildA ");
    }

}

class ChildB implements IParent {

    public ChildB (){
        System.err.println("Constructor ChildB");
    }

    @Override
    public void whoAreYou() {
        System.err.println("ChildB");

    }
}

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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">


   <context:annotation-config/>

   <bean id="childA" class="com.spring.xmlbased.config.ChildA">
       <constructor-arg>
           <bean id="ChildB" class="com.spring.xmlbased.config.ChildB"/>
       </constructor-arg>
   </bean>
</beans>

Пожалуйста, дайте мне знать, если вам нужны дополнительные разъяснения.

Если вы используете весну, то вы должны использовать ее везде. Поэтому вместо передачи контекста приложения поместите туда каждый компонент и позвольте Spring соединить точки для вас.

В двух словах, никогда не звони new сам. Вместо этого спросите у Spring боб. Если у компонента есть зависимости, используйте инжектор конструктора.

Таким образом, Spring может создать все компоненты для вас, подключить их и вернуть полностью рабочие экземпляры, не беспокоясь о том, откуда что-то происходит.

Вы также должны прочитать статьи о конфигурации контейнера на основе Java.

Статьи по Теме:

Другие вопросы по тегам