在使用Spring注解时是否需要使用@Configuration

btxsgosb  于 2022-09-18  发布在  Spring
关注(0)|答案(3)|浏览(157)

我正在使用一个简单的Spring应用程序来检查@Configuration和@Bean(仅限基于Java的配置),该程序可以同时使用@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 + "]";
}
    }

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

}}
rjee0c15

rjee0c151#

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

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

在使用精简模式时,@Bean方法基本上只不过是工厂方法,尽管它们参与了SpringBean的生命周期(部分)。当调用它们时,每个调用都会为您获得一个新的Bean。这意味着,Bean间的依赖关系将在每次调用该方法时为您提供新的示例。

2cmtqfgy

2cmtqfgy2#

我还意识到,如果使用@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

虽然没有@ConfigurationAnnotation,程序甚至可以在私有依赖项下工作

lymnna71

lymnna713#

@Configuration是必需的,因为它表示一个类声明了一个或多个**@Bean方法,可能会被Spring容器处理,以便在运行时为这些Bean生成Bean定义和服务请求。@Configuration用于许多其他原因的注解。例如,@Configuration@Component进行了元注解,因此@Configuration类是组件扫描的候选类(通常使用Spring XML的<context:component-scan/>**元素),因此也可以像任何常规的 @Component 一样利用@AuTower/@Inject。有关更多详细信息,请访问以下链接:

Annotation Type Configuration

在类中声明的方法上的**@Bean注解没有使用@Configuration注解,称为“lite”模式。在“lite”模式下,@Bean方法不能声明Bean间的依赖关系。理想情况下,一个@Bean方法不应该以“lite”模式调用另一个@Bean方法。Spring推荐在@Configuration类中声明的@Bean**方法进行完全配置。这种完全模式可以防止许多错误。

相关问题