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

时间:2017-09-12 10:53:23

标签: spring spring-bean

我有一个我用@Service @Scope

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

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

我在我的代码中使用@Autowired ProductDataModel productDataModel,并且当与上面的代码一起使用时,依赖关系productDataModel不为null。

上面的代码是如何创建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 个答案:

答案 0 :(得分:1)

作为@M。 Deinum指出,当我们声明@Service或@Controller注释时,我们不需要为每个类指定@Bean,如果为该包启用了组件扫描,它们将被Spring Container选中。

使用@Bean的好用例可能就是那个

  • 如果Class位于第三方jar中且您无法添加@Service / @ Controller annotations
  • 如果要在@Bean注释方法
  • 中添加一些自定义逻辑

答案 1 :(得分:0)

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

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