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

Java 在使用spring注释时是否需要使用@Configuration,java,spring,spring-annotations,Java,Spring,Spring Annotations,我正在使用一个简单的spring应用程序来检查@Configuration和基于@Beanjava的配置,该程序同时使用@Configuration和不使用@Configuration。因此有必要使用它 这是我的密码 Student.java package com.cg.spring; public class Student { private int id; private String name; public int getId() { return id; } publi

我正在使用一个简单的spring应用程序来检查@Configuration和基于@Beanjava的配置,该程序同时使用@Configuration和不使用@Configuration。因此有必要使用它

这是我的密码

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

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

}}
无论是否使用@配置,输出都是相同的

Student [id=101, name=ajay]
Faculty [empId=202, name=Kiran]
即使尝试了自动布线,它也可以在没有@Configuration的情况下工作

Student [id=101, name=ajay]
Faculty [empId=202, name=Kiran]
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 + "]";
}
    }
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);

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

}}
@配置是必需的,因为它指示一个类声明一个或多个@Bean方法,并且可能由Spring容器处理,以便在运行时为这些Bean生成Bean定义和服务请求@配置注释用于许多其他原因。例如,@Configuration是用@Component进行元注释的,因此@Configuration类是组件扫描的候选对象,通常使用SpringXML元素,因此也可以像任何常规@Component一样利用@Autowired/@Inject。有关更多详情,请参阅以下链接-

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

@配置是必需的,因为它表示一个类声明了一个或多个@Bean方法,并且可以由Spring容器处理,以便在运行时为这些Bean生成Bean定义和服务请求@配置注释用于许多其他原因。例如,@Configuration是用@Component进行元注释的,因此@Configuration类是组件扫描的候选对象,通常使用SpringXML元素,因此也可以像任何常规@Component一样利用@Autowired/@Inject。有关更多详情,请参阅以下链接-

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

在Spring中使用基于Java的配置时,您基本上有两个选项,正如您已经注意到的。您可以选择使用@Configuration注释类,并将所有@Bean注释方法作为Bean提供。但是,您也可以在不使用@Configuration注释的情况下执行此操作。后者被称为所谓的

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


使用lite模式时,@Bean方法基本上只不过是工厂方法,尽管它们参与了Springbean生命周期的一部分。当给他们打电话时,每次电话都会给你一个新的bean。这意味着,每次调用该方法时,bean之间的依赖关系将为您提供新的实例。

在Spring中使用基于Java的配置时,您基本上有两个选项,正如您已经注意到的那样。您可以选择使用@Configuration注释类,并将所有@Bean注释方法作为Bean提供。但是,您也可以在不使用@Configuration注释的情况下执行此操作。后者被称为所谓的

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


使用lite模式时,@Bean方法基本上只不过是工厂方法,尽管它们参与了Springbean生命周期的一部分。当给他们打电话时,每次电话都会给你一个新的bean。这意味着,每次调用该方法时,bean间依赖项都会为您提供新实例。

因为您正在执行“ApplicationContext context=new AnnotationConfigApplicationContextMyConfig.class;”它可以使用@Configuration或不使用@Configuration。但是,如果你想自动连接学生或教师,甚至MyConfig bean,那么如果没有@Configuration,它就无法工作。因为,spring只扫描带有其中一个spring注释的文件。我将代码修改为使用@Autowired,在这两种情况下输出仍然相同。.Autowired w
这里还有什么?刚刚在末尾加上..请核对一下我建议读一读。寻找lite模式。有些东西在lite模式下不适用于完整的@Configuration类。因为您正在执行'ApplicationContext context=new AnnotationConfigApplicationContextMyConfig.class;'它可以使用@Configuration或不使用@Configuration。但是,如果你想自动连接学生或教师,甚至MyConfig bean,那么如果没有@Configuration,它就无法工作。因为,spring只扫描带有其中一个spring注释的文件。我修改了代码以使用@Autowired,在这两种情况下输出仍然相同。.Autowired where and what?刚刚添加在末尾。.plz check我建议读取。寻找lite模式。有些东西在lite模式下不起作用,它们适用于完整的@Configuration类。