我很想知道这样的代码之间有什么区别:
class MyClass {
@Autowired
MyService myService;
}
和这样的代码:
class MyClass {
MyService myService;
@Required
public void setMyService(MyService val) {
this.myService = val;
}
}
答案 0 :(得分:32)
@Autowired
注释。 @Autowired
不仅限于二传手。它也可以与构造函数和字段一起使用。如果在字段上使用@Autowired
注释,则该字段将使用具有匹配数据类型的bean自动装配。
@Required
检查是否已设置特定属性。如果某个字段已使用@Required
注释进行了注释且该字段未设置,则您将获得org.springframework.beans.factory.BeanInitializationException
。
参见:
Recommended usage of Spring's @Required annotation
编辑:正如“kryger”所指示的:使用@Autowired
注释的字段实际上也是@Required
(除非您明确将其参数设置为false)。
例如:
@Autowired(required=false)
private ObjectType objectType;
对于已注释@Autowired
的字段,如果具有匹配数据类型的bean不可用,则抛出org.springframework.beans.factory.BeanCreationException
。
答案 1 :(得分:6)
@Autowired
与@Required
不同。
@Autowire
- Annotation (如代码示例中所示)告诉ApplicationContext(a.k.a Spring-IoC-Containter)注入所需的依赖项。 (无论如何使用注释或ApplicationContext的XML-File)。
@Required
- Annotation 告诉ApplicationContext必须在XML文件(ApplicationContext的XML文件)中提及此属性,而不是引用依赖项通过使用XML文件(或当然的预期)注入。但是Annotation本身并没有告诉注入依赖! 完成注入是因为XML文件中提到了该属性。很高兴知道,您可能需要它。
在XML文件中提及属性我的意思是这样的配置:
<bean id="MyClass" class="com.myclasses.common.MyClass">
<property name="someProperty" value="ValueThatHasToBeInjected" />
</bean>
那么我为什么要在@ Autowired-Annotation上使用它?
当必须通过XML配置文件中的信息注入依赖项时,应该使用它。
你能举个例子吗?
嗯,已经有一个非常好的例子on this website.,其中也有解释。
答案 2 :(得分:0)
@watchme @Required -annotation通知容器该属性需要作为配置的一部分进行初始化,可以通过xml配置或通过@Autowired注释或通过Java bean创建来初始化
xml示例:
public class SimpleMovieLister
{
private MovieFinder movieFinder;
@Required
public void setMovieFinder(MovieFinder movieFinder)
{
this.movieFinder = movieFinder;
}
}
<beans ...>
<bean id = "movieFinder" class = "com.test.MovieFinder">
<bean id = "simpleMovieLister" class = "com.test.SimpleMovieLister">
<property name = "movieFinder" value = "movieFinder" />
通过@Autowire
public class SimpleMovieLister
{
@Autowired
@Required
private MovieFinder movieFinder;
}
实际上,我们不需要@Required,因为@Autowired默认是必需的。
通过@Bean
public class SimpleMovieLister
{
private MovieFinder movieFinder;
@Required
public void setMovieFinder(MovieFinder movieFinder)
{
this.movieFinder = movieFinder;
}
}
public class AppConfig {
@Bean
public SimpleMovieLister getSimpleMovieLister()
{
SimpleMovieLister simpleMovieLister = new SimpleMovieLister();
simpleMovieLister.setMovieFinder(new MoveFinder());
}
}