betacode

Руководство Spring для начинающих

  1. Введение
  2. Spring Framework
  3. Создать Maven project
  4. Объявить основные библиотеки Spring 
  5. Code Project
  6. Spring @Configuration & IoC
  7. Spring ApplicationContext
  8. Правило работы Spring
  9. Программирование веб приложения используя Spring Boot
  10. Аппендикс: Download библиотека Spring

1. Введение

Данная статья основана на:
  • Spring Framework 4.x

  • Eclipse 4.6 NEON (ok for Eclipse 4.5 MARS)

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

Maven это инструмент который помогает вам управлять библиотеками автоматически и эффективно, он стал распространенным, что каждый программист Java должен знать. Если вы не знаете про Maven вы можете уделить 10 минут и изучить про способ использования здесь:
В случае если вы хотите скачать Spring и объявить библиотеку традиционно, вы можете посмотреть аннотацию в конце статьи.

2. Spring Framework

Изображение ниже иллюстрирует структуру Spring Framework.
  • IoC Container: Это самая важная и самая основная часть, платформа Spring. Он играет роль конфигурации и управления жизненного цикла (Lifecycle) объектов java. В сегодняшней статье мы изучим эту часть.
  • DAO, ORM, AOP, WEB: Эти модули являются готовыми tool или framework интегрированные в Spring.
Inversion of Control & Dependency Injection
Чтобы понять эту ситуация рассмотрим некоторые классы ниже:
// Interface HelloWorld
public interface HelloWorld {
    public void sayHello();
}

// Class implements HelloWorld
public class SpringHelloWorld implements HelloWorld {
   public void sayHello()  {
           System.out.println("Spring say Hello!");
   }
}

// Other class implements HelloWorld
public class StrutsHelloWorld implements HelloWorld {
   public void sayHello()  {
           System.out.println("Struts say Hello!");
   }
}


// And Service class
public class HelloWorldService {
   
     // Field type HelloWorld
     private HelloWorld helloWorld;
   
     // Constructor HelloWorldService
     // It initializes the values ​​for the field 'helloWorld'
     public HelloWorldService()  {
           this.helloWorld = new StrutsHelloWorld();
     }

}
Можно увидеть что класс HelloWorldService управляет создание объекта HelloWorld.

- В случае выше когда объект HelloWorldService создан от его конструктора (constructor), объект HelloWorld так же создается, и он создается от StrutsHelloWorld.
Вопрос состоится в том, что вы хотите создать объект HelloWorldService одновременно создается объект HelloWorld, но он должен быть SpringHelloWorld.
Поэтому здесь HelloWorldService управляет "object creation" в HelloWorld. Почему мы не передаем создание HelloWorld третьей стороне для обработки вместо того, чтобы создавать его в HelloWorldService. У нас есть понятие "inversion of control" то есть"инверсия контроля" (IoC).
И IoC Container будет играть роль управяляющего создающего и HelloWorldService и HelloWorld.
IoC = Inversion of Control
IoC Container создает объект HelloWorldService и объект HelloWorld потом передает HelloWorld в HelloWorldService через setter. Работа, которую выполняет IoC Container это "внедрение зависимости" (Dependency Injection) в HelloWorldService . Зависимость здесь означает зависимость между объектами: HelloWorldService и HelloWorld.

Здесь мы можем ясно определить что такое IoC&DI. Давайте вместо выполним пример HelloWorld чтобы лучше понять.

3. Создать Maven project

  • File/New/Other...
Ввести:
  • Group Id: org.o7planning
  • Artifact Id: HelloSpringAnnotation
  • package: org.o7planning.spring
Ваш Project создан:
Удостоверьтесь что ваш Project build (построен) на Java 7 или новее. Нажмите на правую кнопку мыши на project выберите Properties.

4. Объявить основные библиотеки Spring 

Это пример HelloWorld Spring, поэтому мы будет использовать основную (Core) библиотеку Spring. Открыть файл pom.xml объявить библиотеку использования:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.o7planning</groupId>
  <artifactId>HelloSpringAnnotation</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>HelloSpringAnnotation</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <!-- Spring Core -->
        <!-- http://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>

        <!-- Spring Context -->
        <!-- http://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>

    </dependencies>
 
</project>

5. Code Project

Ниже является изображение структуры project:
Language.java
package org.o7planning.spring.lang;

// A Language
public interface Language {

    // Get a greeting
    public String getGreeting();

    // Get a bye
    public String getBye();

}
English.java
package org.o7planning.spring.lang.impl;

import org.o7planning.spring.lang.Language;

// English
public class English  implements Language {

 @Override
 public String getGreeting() {
     return "Hello";
 }

 @Override
 public String getBye() {
     return "Bye bye";
 }


}
Vietnamese.java
package org.o7planning.spring.lang.impl;

import org.o7planning.spring.lang.Language;

// Vietnamese
public class Vietnamese implements Language {

   @Override
   public String getGreeting() {
       return "Xin Chao";
   }

   @Override
   public String getBye() {
       return "Tam Biet";
   }

}
@Service это annotation, который используется для аннотации на одном классе чтобы сказать Spring, что этот класс является Spring BEAN.

@Autowired аннотирован на поле (field) чтобы сказать Spring что нужно вколоть (inject) значение в это поле. Примечание: вколоть здесь означает наподобии прикреплении значения этому полю.
GreetingService.java
package org.o7planning.spring.bean;

import org.o7planning.spring.lang.Language;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class GreetingService {

   @Autowired
   private Language language;

   public GreetingService() {

   }

   public void sayGreeting() {
       
       String greeting = language.getGreeting();

       System.out.println("Greeting: " + greeting);
   }

}
@Repository это annotation, который используется для аннотации на классе чтобы сказать Spring что этот класс является Spring BEAN.
MyRepository.java
package org.o7planning.spring.bean;

import java.util.Date;

import org.springframework.stereotype.Repository;

@Repository
public class MyRepository {

    public String getAppName() {
        return "Hello Spring App";
    }

    public Date getSystemDateTime() {
        return new Date();
    }
    
    
}
@Component это annotation, который используется для аннотации на классе чтобы сказать Spring что этот класс является Spring BEAN.

@Autowired аннотирован на поле (field) чтобы сказать Spring что нужно вколоть (inject) значение в это поле. Примечание: вколоть здесь означает наподобии прикреплении значения этому полю.
MyComponent
package org.o7planning.spring.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {
   
    @Autowired
    private MyRepository repository;

    public void showAppInfo() {
        System.out.println("Now is: "+ repository.getSystemDateTime());
        System.out.println("App Name: "+ repository.getAppName());
    }

}
Нет разницы в способе использования @Service, @Component и @Repository, вы можете использовать для аннотации на вашем классе, который соответствует значению и контексту приложения.

6. Spring @Configuration & IoC

@Configuration это annotation, который аннотируется на классе, этот класс определяет Spring BEAN.

@ComponentScan - Говорит Spring про пакеты для поиска других Spring BEAN, Spring сканирует (scan) эти пакеты для поиска.
AppConfiguration.java
package org.o7planning.spring.config;

import org.o7planning.spring.lang.Language;
import org.o7planning.spring.lang.impl.Vietnamese;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan({"org.o7planning.spring.bean"})
public class AppConfiguration {

    @Bean(name ="language")
    public Language getLanguage() {

        return new Vietnamese();
    }
     
}
Созданные Spring BEAN будут управляемы в Spring IoC Container (Контейнер Spring IoC).

7. Spring ApplicationContext

MainProgram.java
package org.o7planning.spring;

import org.o7planning.spring.bean.GreetingService;
import org.o7planning.spring.bean.MyComponent;
import org.o7planning.spring.config.AppConfiguration;
import org.o7planning.spring.lang.Language;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainProgram {

   public static void main(String[] args) {

       // Creating a Context Application object by reading
       // the configuration of the 'AppConfiguration' class.
       ApplicationContext context = new AnnotationConfigApplicationContext(AppConfiguration.class);

       System.out.println("----------");
       Language language = (Language) context.getBean("language");
     
       System.out.println("Bean Language: "+ language);
       System.out.println("Call language.sayBye(): "+ language.getBye());
     
       System.out.println("----------");
     
       GreetingService service = (GreetingService) context.getBean("greetingService");
 

       service.sayGreeting();
 
       System.out.println("----------");
     
       MyComponent myComponent = (MyComponent) context.getBean("myComponent");
     
       myComponent.showAppInfo();
     
   }
 
}
Запустите класс MainProgram
Результаты:

8. Правило работы Spring

Вы создаете объект ApplicationContext читая конфигурацию в классе AppConfiguration, как в коде ниже.
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfiguration.class);
Spring создает Spring BEAN, в соответствии с определениями в классе AppConfiguration, (Примечание: Класс AppConfiguration должен быть аннотирован с помощью @Configuration).
Далее, Spring ищет в пакете "org.o7planning.spring.bean" чтобы создать другие Spring BEAN, (Создать объекты из класса аннотированные с помощью @Service, @Component или @Repository).
Теперь Spring BEAN созданы и содержатся в Spring IoC. Поля Spring BEAN аннотированые с @Autowired значения будут введены, как в изображении ниже:
Вернемся к вопросу "Что такое IoC?".
По традиционному способу объект создан из класса, его поля (field) будут иметь значения прикрепленные изнутри этого класса. Spring сделал обратное традиционному способу, объекты созданы и некоторые его поля имеют значения, которые вкололи снаружи, так называемым IoC.

IoC это аббревиатура "Inversion of Control" - Значит "Инверсия управления".

IoC Container это контейнер содержащий все Spring BEAN используемые приложением.

9. Программирование веб приложения используя Spring Boot

Далее вы можете узнать про программирование веб приложения с Spring Boot:

10. Аппендикс: Download библиотека Spring

Вы можете скачать Spring по ссылке:
Извлеки скачанный файл zip в папку жесткого диска:

Руководства Spring MVC

Show More

Руководства Spring Boot

Show More