Spring - Конфигурация на основе Java
До сих пор вы видели, как мы настраиваем компоненты Spring с помощью файла конфигурации XML. Если вам комфортно с конфигурацией XML, то действительно не требуется изучать, как продолжить настройку на основе Java, поскольку вы собираетесь достичь того же результата, используя любую из доступных конфигураций.
Опция конфигурации на основе Java позволяет вам писать большую часть конфигурации Spring без XML, но с помощью нескольких аннотаций на основе Java, описанных в этой главе.
@Configuration и @Bean-аннотации
Аннотирование класса с помощью @Configurationуказывает, что класс может использоваться контейнером Spring IoC в качестве источника определений компонентов. В@Beanаннотация сообщает Spring, что метод, аннотированный @Bean, вернет объект, который должен быть зарегистрирован как 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-компонента, и он создает и возвращает фактический 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();
}
пример
Разрешите нам иметь рабочую среду IDE Eclipse и предпринять следующие шаги для создания приложения Spring:
Шаги | Описание |
---|---|
1 | Создайте проект с именем SpringExample и создайте пакет com.tutorialspoint подsrc папку в созданном проекте. |
2 | Добавьте необходимые библиотеки Spring с помощью параметра « Добавить внешние JAR», как описано в главе « Пример Spring Hello World» . |
3 | Поскольку вы используете аннотации на основе Java, вам также необходимо добавить CGLIB.jar из каталога установки Java и библиотеку ASM.jar, которую можно загрузить с asm.ow2.org . |
4 | Создайте классы Java HelloWorldConfig , HelloWorld и MainApp в пакете com.tutorialspoint . |
5 | Последним шагом является создание содержимого всех файлов Java и файла конфигурации компонента и запуск приложения, как описано ниже. |
Вот содержание 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!
Внедрение зависимостей bean
Когда @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();
}
}
Здесь bean-компонент foo получает ссылку на bar через инъекцию конструктора. Теперь давайте посмотрим на другой рабочий пример.
пример
Разрешите нам иметь рабочую среду IDE Eclipse и предпринять следующие шаги для создания приложения Spring:
Шаги | Описание |
---|---|
1 | Создайте проект с именем SpringExample и создайте пакет com.tutorialspoint подsrc папку в созданном проекте. |
2 | Добавьте необходимые библиотеки Spring с помощью параметра « Добавить внешние JAR», как описано в главе « Пример Spring Hello World» . |
3 | Поскольку вы используете аннотации на основе Java, вам также необходимо добавить CGLIB.jar из каталога установки Java и библиотеку ASM.jar, которую можно загрузить с asm.ow2.org . |
4 | Создайте классы Java TextEditorConfig , TextEditor , SpellChecker и MainApp в пакете com.tutorialspoint . |
5 | Последним шагом является создание содержимого всех файлов Java и файла конфигурации компонента и запуск приложения, как описано ниже. |
Вот содержание 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 поддерживает указание произвольных методов обратного вызова инициализации и уничтожения, во многом аналогично атрибутам Spring XML init-method и destroy-method в элементе 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 следующим образом:
@Configuration
public class AppConfig {
@Bean
@Scope("prototype")
public Foo foo() {
return new Foo();
}
}