提问者:小点点

@Service/@Controller注解在不使用@Bean注解的情况下创建一个新bean


我有一个用@Service@Scope注释的类

@Slf4j
@Service
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ProductDataModel {
@Value("${message}")
private String message;

上面的代码似乎是在为ProductDataModel创建一个bean,而没有使用@Bean注释。

我在我的代码中使用了@Autowed ProductDataModel productDataModel,并且当与上述代码一起使用时,依赖productDataModel不为空。

上面的代码怎么会创建bean??

理想情况下,我希望bean仅在我使用以下代码时创建

//I am not using this piece of code in my program., for reference only

@Configuration
public class OSCConfig {

@Bean
 @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
ProductDataModel productDataModel(){
return new ProductDataModel();
}

有人能解释两段代码之间的区别以及何时使用哪一段代码吗?


共2个答案

匿名用户

正如@M. Deina指出的那样,当我们声明@Service或@Controller注释时,我们不需要为每个类指定@Bean,如果为该包启用了组件扫描,它们会被Spring Container拾取。

所以使用@Bean的好用例可能是

  • 如果类在第三方jar并且您不能添加@Service/@Controller注释
  • 如果您想在@Bean注释方法中添加一些自定义逻辑

匿名用户

@Service注解是Spring在扫描要创建的对象时提取的(作为包扫描的一部分)。它是Spring@Component注解的特化,但除了向用户提供有关其预期用途的指示之外,并没有真正添加太多内容。@Controllller注解类似,但创建的bean具有特定特征。

您使用的@Bean注释也在创建对象时使用,在此上下文中它位于Configuration类中的方法上,因此创建的bean是该方法返回的类型。