Каково реальное использование @configuration весной? - PullRequest
0 голосов
/ 03 декабря 2018

Я просто хотел узнать, почему работает приведенная ниже программа, даже если я не использую аннотацию @Configuration в классе AppConfig.Подскажите, пожалуйста, как это работает?

Случай 1:

AppConfig.java (с @Configuration)

@Configuration
public class AppConfig {


    @Bean
    public Item item(){

        Item item = new Item();
        item.setItemNo(46789);
        item.setItemName("chair");
        item.setItemType("ART");
        item.setItemSize("A4");
        return item;
    }
}

Item.java

public class Item {

    int itemNo;
    String itemName;
    String itemType;
    String itemSize;
    public int getItemNo() {
        return itemNo;
    }
    public void setItemNo(int itemNo) {
        this.itemNo = itemNo;
    }
    public String getItemName() {
        return itemName;
    }
    public void setItemName(String itemName) {
        this.itemName = itemName;
    }
    public String getItemType() {
        return itemType;
    }
    public void setItemType(String itemType) {
        this.itemType = itemType;
    }
    public String getItemSize() {
        return itemSize;
    }
    public void setItemSize(String itemSize) {
        this.itemSize = itemSize;
    }
}

ItemTest.java

public class ItemTest {
    public static void main(String[] args) {        
        AnnotationConfigApplicationContext ct = new AnnotationConfigApplicationContext(AppConfig.class);
        Item item = ct.getBean(Item.class);
        System.out.println(item.getItemNo());

    }
}

Случай 2:

AppConfig.java (без @Configuration)

public class AppConfig {

    @Bean
    public Item item(){

        Item item = new Item();
        item.setItemNo(46789);
        item.setItemName("chair");
        item.setItemType("ART");
        item.setItemSize("A4");
        return item;
    }
}

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Когда вы удаляете аннотацию @Configuration из класса AppConfig, вызов метода item () будет простым вызовом метода java, и вы получите новый экземпляр объекта Item, и он не останется одноточечно .

Чтобы доказать это, сначала добавьте конструктор в класс Item следующим образом:

public class Item {
    ...
    public Item() {
        System.out.println("Item instance created")
    }
    ...
}

, а затем определите другой компонент, который будет использовать экземпляр Item, следующим образом:

public class ItemConsumer {

    public ItemConsumer(Item item) {
        System.out.println("ItemConsumer created");
    }

}

и используйте его в качестве компонента в классе AppConfig следующим образом:

public class AppConfig {


@Bean
public Item item(){
        Item item = new Item();
        item.setItemNo(46789);
        item.setItemName("chair");
        item.setItemType("ART");
        item.setItemSize("A4");
        return item;
    }

@Bean
public ItemConsumer itemConsumer() {
    return new ItemConsumer(item());
    }
}

измените ItemTest, как показано ниже:

public class ItemTest {
    public static void main(String[] args) {        
        AnnotationConfigApplicationContext ct = new AnnotationConfigApplicationContext(AppConfig.class);
        Item item = ct.getBean(Item.class);
        ItemConsumer itemConsumer = ct.getBean(ItemConsumer.class);
    }
}

Теперь, когда вы запускаете класс ItemTest, он генерирует следующий вывод:

Item instance created
Item instance created
ItemConsumer created

Итак, класс Item создается дважды, что означает, что он не singleton .

, теперь снова аннотируйте класс AppConfig аннотацией @Configuration и запускайте класс ItemTest.На этот раз вывод будет как ниже:

Item instance created
ItemConsumer created
0 голосов
/ 03 декабря 2018

@ Bean Lite Mode

@ Методы Bean также могут быть объявлены в классах, которые не аннотированы @Configuration.Например, методы bean-компонента могут быть объявлены в классе @Component или даже в простом старом классе.В таких случаях метод @Bean будет обрабатываться в так называемом «облегченном» режиме.

Методы bean в облегченном режиме будут обрабатываться контейнером как простые фабричные методы (аналогично объявлениям фабричных методов вXML), с правильно примененными обратными вызовами областей видимости и жизненного цикла.Содержащий класс остается неизменным в этом случае, и нет никаких необычных ограничений для содержащего класса или фабричных методов.

Источник - Spring Documentation.

...