代码之家  ›  专栏  ›  技术社区  ›  user3094331

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

  •  2
  • user3094331  · 技术社区  · 6 年前

    我只是想知道为什么下面的程序工作,即使我不在appconfig类上使用@configuration注释。你能告诉我它是怎么工作的吗?

    案例1:

    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;
        }
    }
    

    爪哇

    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;
        }
    }
    

    爪哇

    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 回复  |  直到 6 年前
        1
  •  3
  •   Abolfazl Hashemi    6 年前

    当从AppCOnFIG类中删除@配置注释时,调用ItMeMe()方法将是一个普通的Java方法调用,您将得到一个 新实例 物品的数量,它将不再存在 单子 .

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

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

    然后定义另一个将使用item实例的bean,如下所示:

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

    并在appconfig类中将其用作bean,如下所示:

    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());
        }
    }
    

    更改项测试如下:

    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
    

    所以项类实例化了两次,这意味着它不是 单子 .

    现在用@configuration annotation再次注释appconfig类并运行itemtest类。此时间输出如下:

    Item instance created
    ItemConsumer created
    
        2
  •  2
  •   Gaurav Pathak    6 年前

    豆豆模式

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

    Lite模式下的bean方法将被视为普通工厂方法 容器(类似于XML中的工厂方法声明),具有 正确应用范围界定和生命周期回调。包含类 在这种情况下保持不变,并且没有异常约束 对于包含类或工厂方法。

    Source - Spring Documentation.