使用 spring 注释时是否需要使用 @Configuration

Is it necessary to use @Configuration while working with spring annotations

我正在使用一个简单的 spring 应用程序来检查 @Configuration 和 @Bean(仅基于 java 的配置),该程序既可以使用 @Configuration 也可以不使用 it.So有必要吗

这是我的代码,

Student.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 + "]";
}
    }

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

Client.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);

}}

不管有没有@Configuration

输出都是一样的
Student [id=101, name=ajay]
Faculty [empId=202, name=Kiran]

即使尝试使用自动装配,它也可以在没有@Configuration的情况下工作

Student.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 + "]";
}}

Client.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());

}}

@Configuration是必需的,因为它表示一个class声明了一个或多个@Bean方法并且可能被处理由 Spring 容器在运行时为这些 bean 生成 bean 定义和服务请求。 @Configuration 注释用于许多其他原因。例如,@Configuration 元注释为 @Component,因此 @Configuration classes 是组件扫描的候选者(通常使用 Spring XML 的 <context:component-scan/> 元素)因此也可以利用 @Autowired/@像任何常规的 @Component 一样注入。更多细节参考如下Link -
Annotation Type Configuration

@Bean 在 class 中声明的方法上的注释未使用 @Configuration 注释称为 “精简版” 模式。在“lite”模式下,@Bean 方法不能声明 bean 间依赖。理想情况下,一个 @Bean 方法不应在“精简”模式下调用另一个 @Bean 方法。 Spring 建议在 @Configuration classes 中声明 @Bean 方法以进行完整配置。这种全模式可以防止很多bug

在 Spring 中使用基于 Java 的配置时,您基本上有 2 个选项(正如您已经注意到的那样)。您可以选择使用 @Configuration 注释 class 并将所有 @Bean 注释方法作为 bean 提供。但是,您也可以在没有 @Configuration 注释的情况下执行此操作。后者就是所谓的lite mode.

当使用 @Configuration classes 时,其中定义的 bean 是常规 Spring bean,并且当从另一个方法调用一个方法时,这将始终产生相同的 bean 实例。 Spring 检测 @Configuration classes 并以非常特殊的方式对待它们(它将为那些 classes 创建代理)。

使用精简模式时,@Bean 方法基本上只不过是工厂方法,尽管它们参与(部分)Spring Beans 的生命周期。调用它们时,每次调用都会给你一个新的 bean。这意味着,bean 间依赖关系,每次调用方法时都会为您提供新实例。