spring中@configuration的实际用法是什么?
我只是想知道为什么下面的程序可以工作,即使我没有在AppConfig类上使用@Configuration注释。你能告诉我它是如何工作的吗 案例1: java(带有@Configuration) Item.javaspring中@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
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