我知道并理解基于构造函数的注入。但是,自动装配模式把我搞糊涂了。1)我读到自动装配的默认模式是‘无自动装配’,即我们必须在xml文件中手动设置属性。但是,基于xml的配置难道不是一种自动装配吗?2)自动装配的其他模式是: i) byName ii) byType iii)构造函数iv)自动检测。我的假设是正确的吗:
a)当使用基于xml配置的自动装配时,默认模式是‘byName’(即,我必须保持属性引用的名称与用作属性的bean的名称相同。)
b)当使用注解时,默认的模式是'byType'(无论@Autowired关键字放在设置器上、构造函数上还是属性上,它都会搜索正在自动发送的属性的类型)
3)基于构造函数的注入和自动装配的“构造函数”模式有什么不同?(我读到构造函数模式意味着它在所有构造函数参数上应用byType模式,但它与在构造函数上放置@Autowired关键字有什么不同)
4)我知道要在注释中启用自动连接模式byName,在xml文件的bean定义中,我必须使用“autowire = 'byName‘”。但是,假设我只使用注解配置(使用@Component,并且在xml中没有bean定义),并且我想使用byName自动连接模式,那么该怎么做呢?
发布于 2016-08-31 05:01:48
我想你有点糊涂了。首先,您需要了解依赖注入(请参阅here)。关于DI有大量的信息,但简而言之,它意味着一些第三方(例如spring IOC)将依赖项传递给对象,而不是对象来创建/获取引用本身。这可以通过构造函数或setter来实现。例如,考虑构造函数DI
class B{
}
class A{
private B b;
public A(B b){
this.b = b;
}
}
一些第三方会将类B的实例注入到A中,而类A会创建对B本身的引用。通常你会使用一个接口,所以A类甚至不知道什么对象会被注入到它里面。
现在在Spring中,有不同的方法来配置对象之间的这些关联(上面的例子)。您可以使用XML、Java Config或自动装配。它们是独立的,但做的是相同的事情。
在XML和JAVA配置中,您都需要显式地配置依赖关系-或者在xml文件中,或者为JAVA config创建一个@Configuration类并使用@Bean注释Bean。自动装配是不同的。您可以在其中创建简单的POJO,并使用@Component、@Controller、@Service或@Repository对其进行注释。它们将通过组件扫描自动注册为bean。使用自动装配,您不需要在XML文件或JAVA Config类中显式配置依赖项。您可以直接在代码中完成此操作。例如,如果我们必须使用前面的示例比较java配置和自动装配。
Java Config (explicit config in a config class)
@Bean
public A getA(){
return new A(new B());
}
Autowiring (implicit - done in code)
@Component
class B{
}
@Component
class A{
private B b;
@Autowired
public A(B b){
this.b = b;
}
}
在后者中,我们将B类自动连接到A类(由于@Component注释,它们都将被注册为bean),而没有在xml文件或java配置类中显式定义这种关联。我希望这是有意义的。
发布于 2016-08-31 03:09:58
如果您必须在xml中指定bean名称,它不会自动发生,因此不会自动装配。
使用自动装配,spring将找出要注入的bean,即使它可能没有显式地编写。
当使用基于xml配置的自动装配时,默认模式是'byName‘。
当使用注解时,发生的顺序取决于所使用的注解,因为可以使用一些注解。@Autowire
@Resource
@Inject
.
使用@Component
时,默认配线类型为。下面的方法将解决服务对象的任何自动装配需求。
@Bean
public Service getMyService(){
return new Service();
}
如果有多个返回服务的@Bean
方法,您将得到一个错误。
如果您希望在使用@Component
时通过名称连接,则需要向变量添加@Qualifier("nameToUse")
注释。它将找到一个名为getNameToUse()
的带@Bean
注释的方法。
@Autowired
@Qualifier("nameToUse")
private Service myService;
https://stackoverflow.com/questions/39235095
复制相似问题