Учебники

Spring — конфигурация на основе Java

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

Опция конфигурации на основе Java позволяет вам писать большую часть конфигурации Spring без XML, но с помощью нескольких аннотаций на основе Java, описанных в этой главе.

@ Конфигурация и аннотации @Bean

Аннотирование класса с помощью @Configuration указывает, что класс может использоваться контейнером IoC Spring в качестве источника определений бина. Аннотация @Bean сообщает Spring, что метод, аннотированный @Bean, вернет объект, который должен быть зарегистрирован как компонент в контексте приложения Spring. Простейший класс @Configuration был бы следующим:

package com.tutorialspoint;
import org.springframework.context.annotation.*;

@Configuration
public class HelloWorldConfig {
   @Bean 
   public HelloWorld helloWorld(){
      return new HelloWorld();
   }
}

Приведенный выше код будет эквивалентен следующей конфигурации XML —

<beans>
   <bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" />
</beans>

Здесь имя метода с комментариями @Bean работает как идентификатор компонента, и оно создает и возвращает фактический компонент. Ваш класс конфигурации может иметь объявление для нескольких @Bean. После того, как ваши классы конфигурации определены, вы можете загрузить и предоставить их контейнеру Spring с помощью AnnotationConfigApplicationContext следующим образом:

public static void main(String[] args) {
   ApplicationContext ctx = new AnnotationConfigApplicationContext(HelloWorldConfig.class);
   
   HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
   helloWorld.setMessage("Hello World!");
   helloWorld.getMessage();
}

Вы можете загрузить различные классы конфигурации следующим образом:

public static void main(String[] args) {
   AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();

   ctx.register(AppConfig.class, OtherConfig.class);
   ctx.register(AdditionalConfig.class);
   ctx.refresh();

   MyService myService = ctx.getBean(MyService.class);
   myService.doStuff();
}

пример

Давайте создадим рабочую среду Eclipse и предпримем следующие шаги для создания приложения Spring:

меры Описание
1 Создайте проект с именем SpringExample и создайте пакет com.tutorialspoint в папке src в созданном проекте.
2 Добавьте необходимые библиотеки Spring с помощью параметра « Добавить внешние JAR-файлы», как описано в главе « Пример Hello World» .
3 Поскольку вы используете аннотации на основе Java, вам также необходимо добавить CGLIB.jar из установочного каталога Java и библиотеку ASM.jar, которую можно загрузить с asm.ow2.org .
4 Создайте классы Java HelloWorldConfig , HelloWorld и MainApp в пакете com.tutorialspoint .
5 Последний шаг — создать содержимое всех файлов Java и файла конфигурации Bean и запустить приложение, как описано ниже.

Вот содержимое файла HelloWorldConfig.java

package com.tutorialspoint;
import org.springframework.context.annotation.*;

@Configuration
public class HelloWorldConfig {
   @Bean 
   public HelloWorld helloWorld(){
      return new HelloWorld();
   }
}

Вот содержимое файла HelloWorld.java

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }
   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
}

Ниже приводится содержание файла MainApp.java

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext ctx = 
         new AnnotationConfigApplicationContext(HelloWorldConfig.class);
   
      HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
      helloWorld.setMessage("Hello World!");
      helloWorld.getMessage();
   }
}

Как только вы закончите создание всех исходных файлов и добавление необходимых дополнительных библиотек, давайте запустим приложение. Обратите внимание, что файл конфигурации не требуется. Если с вашим приложением все в порядке, оно напечатает следующее сообщение:

Your Message : Hello World!

Внедрение бобовых зависимостей

Когда @Beans имеют зависимости друг от друга, это означает, что зависимость так же проста, как один метод bean, вызывающий другой, следующим образом:

package com.tutorialspoint;
import org.springframework.context.annotation.*;

@Configuration
public class AppConfig {
   @Bean
   public Foo foo() {
      return new Foo(bar());
   }
   @Bean
   public Bar bar() {
      return new Bar();
   }
}

Здесь бин foo получает ссылку на bar посредством инжектора конструктора. Теперь давайте посмотрим на другой рабочий пример.

пример

Давайте создадим рабочую среду Eclipse и предпримем следующие шаги для создания приложения Spring:

меры Описание
1 Создайте проект с именем SpringExample и создайте пакет com.tutorialspoint в папке src в созданном проекте.
2 Добавьте необходимые библиотеки Spring с помощью параметра « Добавить внешние JAR-файлы», как описано в главе « Пример Hello World» .
3 Поскольку вы используете аннотации на основе Java, вам также необходимо добавить CGLIB.jar из установочного каталога Java и библиотеку ASM.jar, которую можно загрузить с asm.ow2.org .
4 Создайте классы Java TextEditorConfig , TextEditor , SpellChecker и MainApp в пакете com.tutorialspoint .
5 Последний шаг — создать содержимое всех файлов Java и файла конфигурации Bean и запустить приложение, как описано ниже.

Вот содержимое файла TextEditorConfig.java

package com.tutorialspoint;
import org.springframework.context.annotation.*;

@Configuration
public class TextEditorConfig {
   @Bean 
   public TextEditor textEditor(){
      return new TextEditor( spellChecker() );
   }

   @Bean 
   public SpellChecker spellChecker(){
      return new SpellChecker( );
   }
}

Вот содержимое файла TextEditor.java

package com.tutorialspoint;

public class TextEditor {
   private SpellChecker spellChecker;

   public TextEditor(SpellChecker spellChecker){
      System.out.println("Inside TextEditor constructor." );
      this.spellChecker = spellChecker;
   }
   public void spellCheck(){
      spellChecker.checkSpelling();
   }
}

Ниже приводится содержимое другого файла зависимого класса SpellChecker.java

package com.tutorialspoint;

public class SpellChecker {
   public SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
   }
   public void checkSpelling(){
      System.out.println("Inside checkSpelling." );
   }
}

Ниже приводится содержание файла MainApp.java

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext ctx = 
         new AnnotationConfigApplicationContext(TextEditorConfig.class);

      TextEditor te = ctx.getBean(TextEditor.class);
      te.spellCheck();
   }
}

Как только вы закончите создание всех исходных файлов и добавление необходимых дополнительных библиотек, давайте запустим приложение. Обратите внимание, что файл конфигурации не требуется. Если с вашим приложением все в порядке, оно напечатает следующее сообщение:

Inside SpellChecker constructor.
Inside TextEditor constructor.
Inside checkSpelling.

@Import Аннотация

Аннотация @Import позволяет загружать определения @Bean из другого класса конфигурации. Рассмотрим класс ConfigA следующим образом:

@Configuration
public class ConfigA {
   @Bean
   public A a() {
      return new A(); 
   }
}

Вы можете импортировать вышеуказанную декларацию Bean в другую декларацию Bean следующим образом:

@Configuration
@Import(ConfigA.class)
public class ConfigB {
   @Bean
   public B b() {
      return new B(); 
   }
}

Теперь вместо того, чтобы указывать ConfigA.class и ConfigB.class при создании экземпляра контекста, необходимо указать только ConfigB следующим образом:

public static void main(String[] args) {
   ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);
   
   // now both beans A and B will be available...
   A a = ctx.getBean(A.class);
   B b = ctx.getBean(B.class);
}

Обратные вызовы жизненного цикла

Аннотация @Bean поддерживает указание произвольных методов обратного вызова инициализации и уничтожения, во многом как атрибуты init-method и destroy-метода Spring XML для элемента bean —

public class Foo {
   public void init() {
      // initialization logic
   }
   public void cleanup() {
      // destruction logic
   }
}
@Configuration
public class AppConfig {
   @Bean(initMethod = "init", destroyMethod = "cleanup" )
   public Foo foo() {
      return new Foo();
   }
}

Указание объема бобов

Область по умолчанию — singleton, но вы можете переопределить это с помощью аннотации @Scope следующим образом: