我正在阅读spring 3.0.x参考文档以了解Spring Autowired注释:
我无法理解下面的例子.我们是否需要在XML中执行某些操作才能使用它?
例1
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
例2
public class MovieRecommender {
private MovieCatalog movieCatalog;
private CustomerPreferenceDao customerPreferenceDao;
@Autowired
public void prepare(MovieCatalog movieCatalog,
CustomerPreferenceDao customerPreferenceDao) {
this.movieCatalog = movieCatalog;
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
如何通过自动装配两个类来实现相同的接口并使用相同的类?
例:
class Red implements Color
class Blue implements Color
class myMainClass{
@Autowired
private Color color;
draw(){
color.design();
}
}
Run Code Online (Sandbox Code Playgroud)
将调用哪种设计方法?如何确保调用Red类的设计方法而不是Blue?
注释变得流行.Spring-3支持它们.CDI严重依赖它们(我不能在没有注释的情况下使用CDI,对吧?)
我的问题是为什么?
我听到几个问题:
"它有助于摆脱XML".但是xml有什么不好的?依赖性本质上是声明性的,XML对于声明非常有用(对于命令式编程来说非常糟糕).有了很好的IDE(就像想法一样),编辑和验证xml非常容易,不是吗?
"在许多情况下,每个接口只有一个实现".那不是真的!我系统中的几乎所有接口都具有用于测试的模拟实现.
还有其他问题吗?
现在我的XML优势:
你可以在任何地方注入任何东西(不仅是带有注释的代码)
如果我有一个接口的多个实现,我该怎么办?使用限定符?但它迫使我的班级知道它需要什么样的注射.它不适合设计.
基于XML的DI使我的代码清晰:每个类都不知道注入,所以我可以配置它并以任何方式对它进行单元测试.
你怎么看?
我很想知道这样的代码有什么区别:
class MyClass {
@Autowired
MyService myService;
}
Run Code Online (Sandbox Code Playgroud)
和这样的代码:
class MyClass {
MyService myService;
@Required
public void setMyService(MyService val) {
this.myService = val;
}
}
Run Code Online (Sandbox Code Playgroud) 我认为许多专业人士没有转向注释驱动的依赖注入的主要原因是它不支持在开发/测试/生产环境之间切换.出于开发目的,在许多情况下,您不仅使用不同的服务(以及它们的连接),但有时您需要模拟它们,或创建Dummy实例.
昨天我找到了一个带有Spring注释的解决方案:
@Value("#{${env} == "production" ? realService : dummyService}")
private SomeService service;
Run Code Online (Sandbox Code Playgroud)
......哪个应该有用,但不好看.
我会对你的解决方案或论点非常感兴趣:为什么它不是一个真正的问题;-) Guice,Spring或其他任何欢迎.
原始问题是这个主题的一部分:Spring @Autowired用法,但我认为值得创建一个新线程.
我有一个项目......我不知道... 200-300 daos/services/controllers我用来@Autowired连接所有东西,而不是指定一切applicationContext.xml.
我的问题是,这对我的创业时间有多大影响?是否值得删除所有@Autowired注释并实际通过applicationContext.xml?手动连接此应用程序?
从架构的角度来看,我喜欢@Autowired.我不想通过使用xml文件添加另一层复杂性 - 就我而言,它没有增加任何价值.但是如果这种事情在我的容器的加载时间增加10秒,我可能会考虑它.如果成本是100毫秒,那么我会保持原样.
谢谢
java ×5
spring ×5
autowired ×3
guice ×2
annotations ×1
cdi ×1
performance ×1
required ×1
resources ×1
spring-3 ×1