我正在使用一个简单的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());
}}
答案 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
@Bean 注释称为“lite”模式。在“lite”模式下, @Bean 方法无法声明bean间依赖关系。理想情况下,一个 @Bean 方法不应在'lite'模式下调用另一个 @Bean 方法。 Spring建议在 @Configuration 类中声明 @Bean 方法以进行完整配置。这种完整模式可以防止许多错误。