我有一个用@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();
}
有人能解释两段代码之间的区别以及何时使用哪一段代码吗?
正如@M. Deina指出的那样,当我们声明@Service或@Controller注释时,我们不需要为每个类指定@Bean,如果为该包启用了组件扫描,它们会被Spring Container拾取。
所以使用@Bean的好用例可能是
@Service注解是Spring在扫描要创建的对象时提取的(作为包扫描的一部分)。它是Spring@Component注解的特化,但除了向用户提供有关其预期用途的指示之外,并没有真正添加太多内容。@Controllller注解类似,但创建的bean具有特定特征。
您使用的@Bean注释也在创建对象时使用,在此上下文中它位于Configuration类中的方法上,因此创建的bean是该方法返回的类型。