spring中@configuration的实际用法是什么?

spring中@configuration的实际用法是什么?,spring,spring-mvc,spring-boot,spring-data,Spring,Spring Mvc,Spring Boot,Spring Data,我只是想知道为什么下面的程序可以工作,即使我没有在AppConfig类上使用@Configuration注释。你能告诉我它是如何工作的吗 案例1: java(带有@Configuration) Item.java public class Item { int itemNo; String itemName; String itemType; String itemSize; public int getItemNo() { return

我只是想知道为什么下面的程序可以工作,即使我没有在AppConfig类上使用@Configuration注释。你能告诉我它是如何工作的吗

案例1:

java(带有@Configuration)

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)

@Bean-Lite模式 @Bean方法也可以在非 用@Configuration注释。例如,bean方法可能是 在@Component类中声明,甚至在普通的旧类中声明。这样 在某些情况下,@Bean方法将以所谓的“lite”模式进行处理

lite模式下的Bean方法将被 容器(类似于XML中的工厂方法声明),具有 正确应用范围和生命周期回调。包含类 在本例中保持不变,并且没有异常约束 对于包含类或工厂方法


当您从AppConfig类中删除@Configuration注释时,调用item()方法将是一个普通的java方法调用,您将得到item的一个新实例,它将不再是单例

为了证明这一点,首先向Item类添加一个构造函数,如下所示:

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

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

}
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());
    }
}
然后定义另一个将使用项实例的bean,如下所示:

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

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

}
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());
    }
}
并在AppConfig类中将其用作bean,如下所示:

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

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

}
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类实例化了两次,这意味着它不是单例的

现在,再次使用@Configuration annotation注释AppConfig类,并运行ItemTest类。这次输出如下所示:

Item instance created
ItemConsumer created