SPRING-SOURCE.RU

Простой пример использования

HelloWorld на Spring

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

                        
public interface GreetingService {
    void sayGreeting();
}

public class GreetingServiceImpl implements GreetingService {
    private String greeting;

    public GreetingServiceImpl(String greeting) {
        this.greeting = greeting;
    }
    public void sayGreeting() {
        System.out.println(greeting);
    }
    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }
}
		

Откуда в этом примере может взяться переменная greeting? Есть два варианта: либо она вводится через setter метод, либо через конструктор. Если так, то при смене кода программы нужно будет перекомпилировать весь проект.

Почему мы в нашем примере используем интерфейсы и их реализацию? Из-за того, что у интерфейсов можно делать много реализаций, следовательно мы можем делать разную реализацию и получать разную функциональность.

Изменять реализацию в Spring можно декларативно, то есть, конфигурацию интерфейса нужно определять в конфигурационном файле. Когда Spring запуститься он должен запустить реализацию. Давайте теперь посмотрим на наш конфигурационный файл:

HelloWorld конфигурация

                        
<?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-2.0.xsd">

<bean id="greetingService" class="com.example.GreetingServiceImpl">
         <property name="greeting" value="Превед!" />
</bean>
</beans>
		

                        
<bean id="greetingService" class=" com.example.GreetingServiceImpl">
         <constructor-arg value="Превед!" />
</bean>
		

Как видно, в первом случае мы определили значение бина через setter метод, а во втором в качестве оргумента в конструкторе. <property name="greeting" value="Превед!" /> в этой реализации у bean-а должен присутствовать конструктор по умолчанию.

HelloWorld запуск

                        
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class HelloApp {
    public static void main(String[] args) throws Exception {
         BeanFactory factory = new XmlBeanFactory(new FileSystemResource("hello.xml"));

         GreetingService greetingService = (GreetingService) factory.getBean("greetingService");

         greetingService.sayGreeting();
     }
}
		

GreetingService greetingService = (GreetingService) factory.getBean("greetingService") – этой строкой мы создаем фабрику, грубо говоря контейнер (это один из методов). Контейнер создается на основе конфигурационного файла. Имейте ввиду, что создание контейнера – долгая процедура, поэтому в приложении лучше делать всего один контейнер. Другое дело - Bean-ы, они легковесны и их можно создавать большое количество.

Какие выгоды мы получаем?