使用 spring 注释时是否需要使用 @Configuration
Is it necessary to use @Configuration while working with spring annotations
我正在使用一个简单的 spring 应用程序来检查 @Configuration 和 @Bean(仅基于 java 的配置),该程序既可以使用 @Configuration 也可以不使用 it.So有必要吗
这是我的代码,
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());
}}
@Configuration是必需的,因为它表示一个class声明了一个或多个@Bean方法并且可能被处理由 Spring 容器在运行时为这些 bean 生成 bean 定义和服务请求。 @Configuration 注释用于许多其他原因。例如,@Configuration 元注释为 @Component,因此 @Configuration classes 是组件扫描的候选者(通常使用 Spring XML 的 <context:component-scan/>
元素)因此也可以利用 @Autowired/@像任何常规的 @Component 一样注入。更多细节参考如下Link -
Annotation Type Configuration
@Bean 在 class 中声明的方法上的注释未使用 @Configuration 注释称为 “精简版” 模式。在“lite”模式下,@Bean 方法不能声明 bean 间依赖。理想情况下,一个 @Bean 方法不应在“精简”模式下调用另一个 @Bean 方法。
Spring 建议在 @Configuration classes 中声明 @Bean 方法以进行完整配置。这种全模式可以防止很多bug
在 Spring 中使用基于 Java 的配置时,您基本上有 2 个选项(正如您已经注意到的那样)。您可以选择使用 @Configuration
注释 class 并将所有 @Bean
注释方法作为 bean 提供。但是,您也可以在没有 @Configuration
注释的情况下执行此操作。后者就是所谓的lite mode.
当使用 @Configuration
classes 时,其中定义的 bean 是常规 Spring bean,并且当从另一个方法调用一个方法时,这将始终产生相同的 bean 实例。 Spring 检测 @Configuration
classes 并以非常特殊的方式对待它们(它将为那些 classes 创建代理)。
使用精简模式时,@Bean
方法基本上只不过是工厂方法,尽管它们参与(部分)Spring Beans 的生命周期。调用它们时,每次调用都会给你一个新的 bean。这意味着,bean 间依赖关系,每次调用方法时都会为您提供新实例。
我正在使用一个简单的 spring 应用程序来检查 @Configuration 和 @Bean(仅基于 java 的配置),该程序既可以使用 @Configuration 也可以不使用 it.So有必要吗
这是我的代码,
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());
}}
@Configuration是必需的,因为它表示一个class声明了一个或多个@Bean方法并且可能被处理由 Spring 容器在运行时为这些 bean 生成 bean 定义和服务请求。 @Configuration 注释用于许多其他原因。例如,@Configuration 元注释为 @Component,因此 @Configuration classes 是组件扫描的候选者(通常使用 Spring XML 的 <context:component-scan/>
元素)因此也可以利用 @Autowired/@像任何常规的 @Component 一样注入。更多细节参考如下Link -
Annotation Type Configuration
@Bean 在 class 中声明的方法上的注释未使用 @Configuration 注释称为 “精简版” 模式。在“lite”模式下,@Bean 方法不能声明 bean 间依赖。理想情况下,一个 @Bean 方法不应在“精简”模式下调用另一个 @Bean 方法。 Spring 建议在 @Configuration classes 中声明 @Bean 方法以进行完整配置。这种全模式可以防止很多bug
在 Spring 中使用基于 Java 的配置时,您基本上有 2 个选项(正如您已经注意到的那样)。您可以选择使用 @Configuration
注释 class 并将所有 @Bean
注释方法作为 bean 提供。但是,您也可以在没有 @Configuration
注释的情况下执行此操作。后者就是所谓的lite mode.
当使用 @Configuration
classes 时,其中定义的 bean 是常规 Spring bean,并且当从另一个方法调用一个方法时,这将始终产生相同的 bean 实例。 Spring 检测 @Configuration
classes 并以非常特殊的方式对待它们(它将为那些 classes 创建代理)。
使用精简模式时,@Bean
方法基本上只不过是工厂方法,尽管它们参与(部分)Spring Beans 的生命周期。调用它们时,每次调用都会给你一个新的 bean。这意味着,bean 间依赖关系,每次调用方法时都会为您提供新实例。