在使用spring注释时是否有必要使用@Configuration

时间:2018-02-05 10:46:54

标签: java spring spring-annotations

我正在使用一个简单的spring应用程序来检查@Configuration和@Bean(仅基于java的configuartion),该程序正在使用@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());

}}

2 个答案:

答案 0 :(得分:4)

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

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

当使用lite-mode时,@Bean方法基本上不再是工厂方法,尽管它们在调用它们时参与(部分)Spring Beans的生命周期,每次调用都会得到一个新的bean。这意味着,每次调用方法时,bean之间的依赖关系都会为你提供新的实例。

答案 1 :(得分:-1)

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

在未使用 @Configuration 注释的类中声明的方法的

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