zhu*_*hen 56 java spring dependency-injection
为什么我不能@Autowired在这种情况下使用?
@SpringBootApplication
public class Application {
@Autowired
BookingService bookingService;
public static void main(String[] args) {
bookingService.book("Alice", "Bob", "Carol");
}
}
Run Code Online (Sandbox Code Playgroud)
但可以使用 @Bean
@SpringBootApplication
public class Application {
@Bean
BookingService bookingService() {
return new BookingService();
}
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
BookingService bookingService = ctx.getBean(BookingService.class);
bookingService.book("Alice", "Bob", "Carol");
}
}
Run Code Online (Sandbox Code Playgroud)
是不是两种方式生成BookingService相同的东西?
Dav*_*ave 139
@Bean并@Autowired做两件截然不同的事情.这里的其他答案更详细地解释,但更简单的说明:
@Bean 告诉Spring'这是这个课程的一个实例,请保留它并在我问的时候把它还给我.
@Autowired说'请给我一个这个类的实例,例如,我@Bean之前使用注释创建的一个'.
那有意义吗?在你的第一个例子中,你要求Spring给你一个实例BookingService,但你永远不会创建一个,所以Spring没有什么可以给你.在你的第二个例子中,你正在创建一个新的实例BookingService,告诉Spring它,然后,在main()方法中,要求它回来.
如果需要,可以从第二种main()方法中删除另外两行,并将两个示例组合如下:
@SpringBootApplication
public class Application {
@Autowired
BookingService bookingService;
@Bean
BookingService bookingService() {
return new BookingService();
}
public static void main(String[] args) {
bookingService.book("Alice", "Bob", "Carol");
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,@Bean注释给Spring BookingService,并@Autowired使用它.
这将是一个稍微毫无意义的例子,因为你在同一个类中使用它,但是如果你@Bean在一个类中定义了它,而在另一个类中定义了它,它就会变得有用@Autowired.
pmv*_*rma 10
@Bean
BookingService bookingService() {
return new BookingService();
}
Run Code Online (Sandbox Code Playgroud)
注释@Bean仅在Spring应用程序上下文中将服务注册为bean(一种Object).简单来说,它只是注册而不是别的.
@Autowired
BookingService bookingService;
Run Code Online (Sandbox Code Playgroud)
通过从Spring Application Context @Autowired注入BookingServicebean(即Object)来注释变量.
(即)带@Bean注释的已注册bean 将注入带注释的变量@Autowired.
希望这清除你的怀疑!
与这里投票最高的答案所声称的相反,它们并不是两个截然不同的东西。@Bean 和 @Autowired 在大多数情况下可以互换。
假设您有一个返回 Car 实例的 @Bean 方法。您实际上可以摆脱该 bean 方法并在 Car 类上添加 @Component,然后自动装配它。
反之亦然。无论您使用 @Autowired 实例化什么类,都可以在方法上使用 @Bean 并使用 @Configuration 注释在类中实例化它。
您将使用 @Bean 而不是 @Autowired 的地方
1>您无权更改类以添加 @Component 注释,因此您无法自动装配它。
2>你想要自定义类的实例化。
例如,如果您正在实例化 Resilience4J 断路器类,如果您在使用 @Bean 的方法内执行此操作,则可以选择使用如下代码设置所有配置
@Bean
public CircuitBreaker fooCircuitBreaker() {
CircuitBreakerConfig.Builder builder = CircuitBreakerConfig.custom().
slidingWindowSize(xxx).
failureRateThreshold(xxx).
waitDurationInOpenState(xxx)).
ignoreException(e -> {
if (e instanceof HttpStatusCodeException) {
HttpStatusCodeException httpStatusCodeException = (HttpStatusCodeException) e;
if (httpStatusCodeException.getStatusCode().is4xxClientError()) {
return true;
}
}
return false;
});
circuitBreakerRegistry.addConfiguration(xxx, builder.build());
return circuitBreakerRegistry.circuitBreaker(xxx, xxx);
}
Run Code Online (Sandbox Code Playgroud)
@DaveyDaveDave的很好答案在示例中,而不是
@Bean
BookingService bookingService() {
return new BookingService();
}
Run Code Online (Sandbox Code Playgroud)
您可以在BookingService类上使用@Service批注
| 归档时间: |
|
| 查看次数: |
44901 次 |
| 最近记录: |