首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring中的“基于构造函数的注入”和“通过构造函数模式自动连接”的区别是什么?

Spring中的“基于构造函数的注入”和“通过构造函数模式自动连接”的区别是什么?
EN

Stack Overflow用户
提问于 2016-08-31 02:55:03
回答 2查看 5.8K关注 0票数 2

我知道并理解基于构造函数的注入。但是,自动装配模式把我搞糊涂了。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自动连接模式,那么该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-31 05:01:48

我想你有点糊涂了。首先,您需要了解依赖注入(请参阅here)。关于DI有大量的信息,但简而言之,它意味着一些第三方(例如spring IOC)将依赖项传递给对象,而不是对象来创建/获取引用本身。这可以通过构造函数或setter来实现。例如,考虑构造函数DI

代码语言:javascript
运行
复制
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配置和自动装配。

代码语言:javascript
运行
复制
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配置类中显式定义这种关联。我希望这是有意义的。

票数 3
EN

Stack Overflow用户

发布于 2016-08-31 03:09:58

如果您必须在xml中指定bean名称,它不会自动发生,因此不会自动装配。

使用自动装配,spring将找出要注入的bean,即使它可能没有显式地编写。

当使用基于xml配置的自动装配时,默认模式是'byName‘。

当使用注解时,发生的顺序取决于所使用的注解,因为可以使用一些注解。@Autowire @Resource @Inject.

使用@Component时,默认配线类型为。下面的方法将解决服务对象的任何自动装配需求。

代码语言:javascript
运行
复制
@Bean
public Service getMyService(){
return new Service();
}

如果有多个返回服务的@Bean方法,您将得到一个错误。

如果您希望在使用@Component时通过名称连接,则需要向变量添加@Qualifier("nameToUse")注释。它将找到一个名为getNameToUse()的带@Bean注释的方法。

代码语言:javascript
运行
复制
@Autowired
@Qualifier("nameToUse")
private Service myService;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39235095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档