Java Spring 配置何时定义bean和何时新建
Java Spring configuration when to define bean and when new
我有一个配置 class,我想知道我应该为每个 class 定义 bean 还是创建新的。
@Configuration
public class BookConfig {
@Bean
public Read readBook() {
return new ReadBook(new Operation(), new Library(new Location()));
}
}
或
@Configuration
public class BookConfig {
@Bean
public Operation operation() {
return new Operation();
}
@Bean
public Location location() {
return new Location();
}
@Bean
public Library library() {
return new Library(location());
}
@Bean
public Read readBook() {
return new ReadBook(operation(), library());
}
}
正确的方法是什么?
如果您不打算在任何时候使用 Operation 和 Location bean,那么您可以跳过该 bean 的创建并像第一个选项那样使用 new。
但是,如果您认为稍后会使用 Operation 和 Location bean,则第二种方法更好。尽管我建议稍作修改。您不必调用这些方法,而是将 bean 本身作为方法参数传递。
@Configuration
public class BookConfig {
@Bean
public Operation operation() {
return new Operation();
}
@Bean
public Location location() {
return new Location();
}
@Bean
public Library library(Location location) {
return new Library(location);
}
@Bean
public Read readBook(Location location, Library library) {
return new ReadBook(location, library);
}
}
作为一个经验法则,永远记住任何被制成 Bean 的东西都将由 Spring 引导上下文本身管理。任何您声明为“新”的东西都不会被 spring 引导管理,并将被视为一个普通的 java 对象。
Bean 默认情况下是单例的,并且具有所有生命周期方法 运行(除其他外)。在启动时 Spring 创建引导上下文期间,将解决 bean 依赖关系,您必须以不存在循环依赖问题的方式设计 classes。
如果你做一个“新”,那么这些对象的范围将被限制在 class 的特定实例中,并且一旦被垃圾收集,就会与实例一起销毁。
我有一个配置 class,我想知道我应该为每个 class 定义 bean 还是创建新的。
@Configuration
public class BookConfig {
@Bean
public Read readBook() {
return new ReadBook(new Operation(), new Library(new Location()));
}
}
或
@Configuration
public class BookConfig {
@Bean
public Operation operation() {
return new Operation();
}
@Bean
public Location location() {
return new Location();
}
@Bean
public Library library() {
return new Library(location());
}
@Bean
public Read readBook() {
return new ReadBook(operation(), library());
}
}
正确的方法是什么?
如果您不打算在任何时候使用 Operation 和 Location bean,那么您可以跳过该 bean 的创建并像第一个选项那样使用 new。 但是,如果您认为稍后会使用 Operation 和 Location bean,则第二种方法更好。尽管我建议稍作修改。您不必调用这些方法,而是将 bean 本身作为方法参数传递。
@Configuration
public class BookConfig {
@Bean
public Operation operation() {
return new Operation();
}
@Bean
public Location location() {
return new Location();
}
@Bean
public Library library(Location location) {
return new Library(location);
}
@Bean
public Read readBook(Location location, Library library) {
return new ReadBook(location, library);
}
}
作为一个经验法则,永远记住任何被制成 Bean 的东西都将由 Spring 引导上下文本身管理。任何您声明为“新”的东西都不会被 spring 引导管理,并将被视为一个普通的 java 对象。
Bean 默认情况下是单例的,并且具有所有生命周期方法 运行(除其他外)。在启动时 Spring 创建引导上下文期间,将解决 bean 依赖关系,您必须以不存在循环依赖问题的方式设计 classes。
如果你做一个“新”,那么这些对象的范围将被限制在 class 的特定实例中,并且一旦被垃圾收集,就会与实例一起销毁。