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

Данная статья основана на:
-
Spring Framework 4.x
-
Eclipse 4.6 NEON (ok for Eclipse 4.5 MARS)
В этой статье я использую Maven чтобы объявить библиотеки Spring которые буду использовать,вместо того чтобы скачать Spring и объявлять библиотку обычным способом.
Maven это инструмент который помогает вам управлять библиотеками автоматически и эффективно, он стал распространенным, что каждый программист Java должен знать. Если вы не знаете про Maven вы можете уделить 10 минут и изучить про способ использования здесь:
Maven это инструмент который помогает вам управлять библиотеками автоматически и эффективно, он стал распространенным, что каждый программист Java должен знать. Если вы не знаете про Maven вы можете уделить 10 минут и изучить про способ использования здесь:
В случае если вы хотите скачать Spring и объявить библиотеку традиционно, вы можете посмотреть аннотацию в конце статьи.
Изображение ниже иллюстрирует структуру Spring Framework.

- IoC Container: Это самая важная и самая основная часть, платформа Spring. Он играет роль конфигурации и управления жизненного цикла (Lifecycle) объектов java. В сегодняшней статье мы изучим эту часть.
- DAO, ORM, AOP, WEB: Эти модули являются готовыми tool или framework интегрированные в Spring.
Чтобы понять эту ситуация рассмотрим некоторые классы ниже:
// 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 создан от его конструктора (constructor), объект HelloWorld так же создается, и он создается от StrutsHelloWorld.
Вопрос состоится в том, что вы хотите создать объект HelloWorldService одновременно создается объект HelloWorld, но он должен быть SpringHelloWorld.
Поэтому здесь HelloWorldService управляет "object creation" в HelloWorld. Почему мы не передаем создание HelloWorld третьей стороне для обработки вместо того, чтобы создавать его в HelloWorldService. У нас есть понятие "inversion of control" то есть"инверсия контроля" (IoC).
Поэтому здесь 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 чтобы лучше понять.
Здесь мы можем ясно определить что такое IoC&DI. Давайте вместо выполним пример HelloWorld чтобы лучше понять.
- File/New/Other...



Ввести:
- Group Id: org.o7planning
- Artifact Id: HelloSpringAnnotation
- package: org.o7planning.spring

Ваш Project создан:

Удостоверьтесь что ваш Project build (построен) на Java 7 или новее. Нажмите на правую кнопку мыши на project выберите Properties.


Это пример 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>
Ниже является изображение структуры 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) значение в это поле. Примечание: вколоть здесь означает наподобии прикреплении значения этому полю.
@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) значение в это поле. Примечание: вколоть здесь означает наподобии прикреплении значения этому полю.
@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, вы можете использовать для аннотации на вашем классе, который соответствует значению и контексту приложения.

@Configuration это annotation, который аннотируется на классе, этот класс определяет Spring BEAN.
@ComponentScan - Говорит Spring про пакеты для поиска других Spring BEAN, Spring сканирует (scan) эти пакеты для поиска.
@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).

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

Результаты:

Вы создаете объект 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 используемые приложением.
Далее вы можете узнать про программирование веб приложения с Spring Boot:
Вы можете скачать Spring по ссылке:

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