我在一些帖子中读过,Spring MVC并Portlets建议不要进行现场注射.因为我试图得到一个所以我问自己我是否使用现场注射,我无法回答它.据我所知场注入是,如果你注入一个Bean与一个属性@Autowired是这样的:
CartController.java:
...
@Autowired
private Cart cart;
...
Run Code Online (Sandbox Code Playgroud)
BookshopConfiguartion.java:
@Configuration
public class BookShopConfiguration {
@Bean
public Cart cart(){
return new Cart();
}
//more configuration
Run Code Online (Sandbox Code Playgroud)
我Cart.java习惯于在购物车中存储和提供有关书籍的信息.
在我的研究期间,我读到了构造函数注入:
MyComponent.java:
...
public class MyComponent{
private Cart cart;
@Autowired
public MyComponent(Cart cart){
this.cart = cart;
}
...
Run Code Online (Sandbox Code Playgroud)
这两种注射的优点和缺点是什么?
编辑1:由于此问题被标记为此问题的重复,我检查了它.因为在问题和答案中都没有任何代码示例,我不清楚我是否正确猜测我正在使用哪种注射类型.
弹簧有两种类型的DI:定位器DI和结构DI.
基于构造函数的DI修复了需要注入依赖项的顺序.基于Setter的DI不提供此功能.
基于Setter的DI帮助我们仅在需要时注入依赖项,而不是在构造时需要它.
我没有看到任何其他显着差异,因为两种类型的Spring DI都提供相同的功能 - 设置器和构造函数DI在代码启动时注入依赖关系.当然,构造函数DI将通过构造函数执行,而setter DI将在构造对象后立即通过setter执行它,但它在性能等方面对开发人员没有任何影响.两者都提供了指定顺序的方法依赖注入也是如此.
我正在寻找一个场景,其中一个提供明显优势,或一个类型完全无法使用.
我找到了一些答案:https://stackoverflow.com/a/21218921/2754014关于依赖注入.没有任何注释@Autowired,@Inject或,或@Resource.让我们假设这个示例TwoInjectionStylesbean 没有任何XML配置(简单除外)<context:component-scan base-package="com.example" />.
在没有指定注释的情况下注入是否正确?
我正在从 spring 属性文件中读取一个文件路径,如下所示,并映射到一个 java 类中
#file path
file.path =/root/ms_data/file/
Run Code Online (Sandbox Code Playgroud)
它被映射到这样的java类中
@Value("${file.path}")
private String fileDataPath;
Run Code Online (Sandbox Code Playgroud)
请告知我是否可以将其保留为最终我的意思是如下所示,其中我将 fileDataPath 保留为最后一个
@Value("${file.path}")
private final String fileDataPath;
Run Code Online (Sandbox Code Playgroud)