[英]Is it necessary to use @Configuration while working with spring annotations
我正在使用一個簡單的 spring 應用程序來檢查 @Configuration 和 @Bean(僅限基於 java 的配置),該程序同時使用 @Configuration 和沒有它。所以有必要擁有它。
這是我的代碼,
學生.java
package com.cg.spring;
public class Student {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
教員.java
package com.cg.spring;
public class Faculty {
private int empId;
private String name;
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Faculty [empId=" + empId + ", name=" + name + "]";
}
}
MyConfig.java
package com.cg.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public Student stu()
{
return new Student();
}
@Bean
public Faculty fac()
{
return new Faculty();
}}
客戶端.java
package com.cg.spring;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Client {
public static void main(String[] args) {
ApplicationContext context=new
AnnotationConfigApplicationContext(MyConfig.class);
Student stu=(Student)context.getBean(Student.class);
Faculty fac=(Faculty)context.getBean(Faculty.class);
stu.setName("ajay");
stu.setId(101);
System.out.println(stu);
fac.setEmpId(202);
fac.setName("Kiran");
System.out.println(fac);
}}
output 與@Configuration 相同
Student [id=101, name=ajay]
Faculty [empId=202, name=Kiran]
即使嘗試使用自動裝配,它也可以在沒有 @Configuration 的情況下工作
學生.java
package com.cg.spring;
import org.springframework.beans.factory.annotation.Autowired;
public class Student {
private int id;
private String name;
@Autowired
private Faculty faculty;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Faculty getFaculty() {
return faculty;
}
public void setFaculty(Faculty faculty) {
this.faculty = faculty;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}}
客戶端.java
package com.cg.spring;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Client {
public static void main(String[] args) {
ApplicationContext context=new
AnnotationConfigApplicationContext(MyConfig.class);
Student stu=(Student)context.getBean(Student.class);
Faculty fac=(Faculty)context.getBean(Faculty.class);
stu.setName("ajay");
stu.setId(101);
System.out.println(stu);
fac.setEmpId(202);
fac.setName("Kiran");
System.out.println(fac);
stu.setFaculty(fac);
System.out.println(stu.getFaculty());
}}
在 Spring 中使用基於 Java 的配置時,您基本上有 2 個選項(正如您已經注意到的)。 您可以選擇使用@Configuration
注釋一個類,並將所有@Bean
注釋的方法作為 bean 可用。 但是,您也可以在沒有@Configuration
注釋的情況下執行此操作。 后者被稱為所謂的精簡模式。
當使用@Configuration
類時,在那里定義的 bean 是常規的 Spring bean,當從另一個調用一個方法時,這將始終導致 bean 的相同實例。 Spring 檢測@Configuration
類並以一種非常特殊的方式處理它們(它將為這些類創建一個代理)。
使用精簡模式時, @Bean
方法基本上只不過是工廠方法,盡管它們參與(部分)Spring Bean 的生命周期。 調用它們時,每次調用都會為您提供一個新 bean。 這意味着,每次調用方法時,bean 之間的依賴關系都會為您提供新實例。
我還意識到,如果使用 @Configuration 將依賴項定義為私有是不允許的。
@Configuration
public class ProgrammingConfig {
// define bean for the fortune service
@Bean
private FortuneService javaFortuneService() {
return new JavaFortuneService();
};
// define bean for java coach and inject its dependencies
@Bean
public Coach javaCoach() {
return new JavaCoach(javaFortuneService());
}
}
將產生
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Bean method 'javaFortuneService' must not be private or final; change the method's modifiers to continue
Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Bean method 'javaFortuneService' must not be private or final; change the method's modifiers to continue
在沒有 @Configuration 注釋的情況下,即使有私有依賴項,程序也可以工作
@Configuration是必需的,因為它表明一個類聲明了一個或多個@Bean方法,並且可能會被 Spring 容器處理以在運行時為這些 bean 生成 bean 定義和服務請求。 @Configuration注釋用於許多其他原因。 例如, @Configuration是用@Component元注釋的,因此@Configuration類是組件掃描的候選者(通常使用 Spring XML 的<context:component-scan/>
元素),因此也可以利用 @Autowired/@Inject 之類的任何常規的@Component。 以下鏈接提供更多詳細信息參考 -
注解類型配置
在未使用@Configuration注釋的類中聲明的方法上的@Bean注釋被稱為“精簡”模式。 在“lite”模式下, @Bean方法不能聲明 bean 間的依賴關系。 理想情況下,一個@Bean方法不應在“精簡”模式下調用另一個@Bean方法。 Spring 建議在@Configuration類中聲明@Bean方法以進行完整配置。 這種全模式可以防止很多bug。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.