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

Gow*_*imi 1 java spring 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 + "]";
}
    }
Run Code Online (Sandbox Code Playgroud)

教师.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 + "]";
}
}
Run Code Online (Sandbox Code Playgroud)

配置文件

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();
}}
Run Code Online (Sandbox Code Playgroud)

客户端.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);

}}
Run Code Online (Sandbox Code Playgroud)

有或没有@Configuration 的输出是一样的

Student [id=101, name=ajay]
Faculty [empId=202, name=Kiran]
Run Code Online (Sandbox Code Playgroud)

即使尝试过自动装配,它也可以在没有 @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 + "]";
}}
Run Code Online (Sandbox Code Playgroud)

客户端.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());

}}
Run Code Online (Sandbox Code Playgroud)

M. *_*num 5

在 Spring 中使用基于 Java 的配置时,您基本上有 2 个选项(正如您已经注意到的)。您可以选择使用来注释一个类,@Configuration并且可以将所有带@Bean注释的方法作为 bean 使用。但是,您也可以在没有@Configuration注释的情况下执行此操作。后者被称为所谓的精简模式

当使用@Configuration类时,定义在那里的 bean 是常规的 Spring bean,当从另一个调用一个方法时,这将始终导致 bean 的相同实例。Spring 检测@Configuration类并以一种非常特殊的方式处理它们(它将为这些类创建一个代理)。

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