关于控制(IoC)的反转是如何工作的,我有点困惑Spring.
假设我有一个名为的UserServiceImpl实现UserService接口的服务类.
怎么会这样@Autowired?
而在我Controllers,我怎么会instantiate在instance这个服务的?
我会做以下吗?
UserService userService = new UserServiceImpl();
Run Code Online (Sandbox Code Playgroud) 我应该在DI中使用哪个注释@Resource(jsr250)或@Autowired(特定于Spring)?
我已经成功地在过去使用两种,@Resource(name="blah")和@Autowired @Qualifier("blah")
我的直觉是坚持使用@Resource标签,因为它已被jsr人批准.
有人对此有强烈的想法吗?
我正在阅读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几个月了,我认为使用@Autowired注释的依赖注入也需要为该字段注入一个setter.
所以,我这样使用它:
@Controller
public class MyController {
@Autowired
MyService injectedService;
public void setMyService(MyService injectedService) {
this.injectedService = injectedService;
}
...
Run Code Online (Sandbox Code Playgroud)
}
但我今天试过这个:
@Controller
public class MyController {
@Autowired
MyService injectedService;
...
Run Code Online (Sandbox Code Playgroud)
}
哦惊喜,没有编译错误,启动时没有错误,应用程序运行完美...
所以我的问题是,使用@Autowired注释进行依赖注入所需的setter是什么?
我正在使用Spring 3.1.1.
我对直接场依赖注入感兴趣.传统上,Spring支持构造函数注入(为构造函数提供参数)和基于setter的注入(在调用时调用setter).
但是,Spring也能够直接注入场景(在没有setter方法的情况下设置对象的成员字段),通过使用注释字段来证明@Autowired.自动装配仅限于"bean",因此无法注入原始值(虽然这可以通过创建类"java.lang.String"的bean来规避 - 这可行,但具有正常的自动装配警告.)除了这个,Spring支持@Value直接从属性等设置成员字段的值.
但是,Spring不允许将属性直接设置为成员字段(不使用自动装配).
我的问题是:为什么?
它显然有能力这样做,为什么不呢?是否有任何大的负面副作用阻止这种情况?或者这种能力是否有限,只有自动装配才有意义?它是否需要比调用setter更大的黑客攻击?
请注意,我不想讨论一般的setter和getter的相对优点,只是Spring做出这个选择的原因.
如果@Autowired没有getter setter ,注释如何用于私有字段?春天如何进入私人领域?