Руководство 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.
  1. IoC Container: Это самая важная и самая основная часть, платформа Spring. Он играет роль конфигурации и управления жизненного цикла (Lifecycle) объектов java. В сегодняшней статье мы изучим эту часть.
  2. DAO, ORM, AOP, WEB: Эти модули являются готовыми tool или framework интегрированные в Spring.

2.1- 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 MVC

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

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

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

View more categories: