经过autowiring concept之后 我有一些问题。这些是: -
byType
或byName
下面自动装配,是否必须在班级学院中使用setStudent()
方法?public class College {
private Student student1;
private String registration1;
}
<bean id="student1" class="Student"/>
- 如果是byname
,它会查看id
属性,如果是bytype
,它会查找class
属性以上
Stetement。对?如果它为同一类型找到两个bean dean标签,它将在bytype
的情况下抛出致命错误。正确的吗?
autodetect场景通过内省bean类选择constructor
或byType
。如果找到默认构造函数,则为byType
模式
将适用。
我的问题在于,如果找不到默认构造函数,并且找到带有参数的构造函数,则由构造函数自动装配
将适用。正确的吗?
我们是否需要在@Autowired
中的某处指定College
以应用自动装配。正如我在this example中看到的那样
但没有指定任何内容here
答案 0 :(得分:4)
1),4)Spring中有两种不同的自动装配方式:基于XML和基于注释。
基于XML的自动装配从XML配置激活,如here所述。最后,它会调用setter方法,因此这里需要setStudent()
方法。
@Autowired
注释填充您标记的所有内容。实际上,它可以设置没有访问器的私有字段,如
public class Foo {
@Autowired private Thingy thing; // No getThing or setThing methods
private void doStuff() {
// thing is usable here
}
}
要使@Autowired
注释起作用,您需要定义相应的bean后处理器;它是通过将以下行添加到xml config来完成的:
<context:annotation-config/>
请注意,这两种自动装配方法是独立的,并且可以(但不建议)同时使用它们。在这种情况下,xml自动装配将覆盖注释。
2)一般情况下,如果无法找到一个且只有一个注射候选者,则自动装配将失败。因此,在您的情况下,它将在容器创建时失败。有一些后备怪癖,但总的来说它可靠地运作。
3)是的,documentaion这样说。
关于byName
和byType
自动装配。虽然byName
自动装配只是尝试匹配bean名称(可以使用id
属性指定),但byType
比class
属性查找复杂一点。它通过 type 搜索bean,它将匹配接口。例如:
public interface SomeService {
void doStuff();
}
public class SomeServiceImpl implements SomeService {
@Override public void doStuff() {
// Implementation
};
}
public class ServiceUser {
@Autowired
private SomeService someService; // SomeServiceImpl instance goes here
}
P.S。您在问题中引用了两个不同版本的Spring,即2.5和3.0。自动装配行为在两者中都是相同的。
答案 1 :(得分:1)
另外如果您使用@Autwired注释,则需要将类标记为自动装配的候选者。应该使用以下注释之一来完成:
@Repository
@Service
@Component
@Controller
因为你可以在不同的范围配置它:
@Scope("prototype")
@Repository
public class MovieFinderImpl implements MovieFinder {
// ...
}
希望它更清楚。