簡體   English   中英

使用 spring 注釋時是否需要使用 @Configuration

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM