"constructor based injection" 和 Spring 中的“通过构造函数自动装配”有什么区别
What is the difference between "constructor based injection" and " autowire by constructor mode" in Spring
我知道并理解基于构造函数的注入。但是,自动装配模式让我感到困惑。
1) 我读到自动装配的默认模式是 'no autowiring' 即我们必须在 xml 文件中手动设置属性。但是,基于 xml 的配置不是一种自动装配吗?怎么算'No autowiring'?
2) 其他自动装配模式是 i) byName ii) byType iii) constructor iv) auto-detect。我的假设是否正确:
a) 当使用基于 xml 配置的自动装配时,默认模式是 'byName'(即我必须保持 属性 引用的名称与 bean 的名称相同用作 属性.)
b) 当使用注解时,默认模式是 'byType'( 无论 @Autowired 关键字放在什么地方,即 setter、构造函数或 属性 , 它将搜索正在自动生成的 属性 的类型)
3) 基于构造函数的注入和 'constructor' 自动装配模式有什么区别?(我读过构造函数模式意味着它对所有构造函数参数应用 byType 模式,但它与放置有何不同@Autowired 构造函数上的关键字)
4) 我知道要在注释中启用自动装配模式 byName,在 xml 文件的 bean 定义中,我必须使用“ autowire = 'byName' ”。但是,假设我只使用注释配置(使用@Component,并且 xml 中没有 bean 定义),并且我想使用 byName 自动装配模式,那么这样做的方法是什么?
如果您必须在 xml 中指定 bean 名称,它不会自动发生,因此它不会自动装配。
使用自动装配 spring 将找出要注入的 bean,即使它可能没有明确写入。
使用基于xml配置的自动装配时,默认模式为'byName'
使用注释时,发生的顺序取决于所使用的注释,因为有一些可以使用。 @Autowire
@Resource
@Inject
.
使用@Component
时,默认接线为type。下面的方法将解决服务对象的任何自动装配需求。
@Bean
public Service getMyService(){
return new Service();
}
如果 return 一个服务有多个 @Bean
方法,您将收到错误消息。
如果您想在使用 @Component
时通过名称进行连接,您可以向变量添加 @Qualifier("nameToUse")
注释。它会找到一个名为 getNameToUse()
.
的 @Bean
注释方法
@Autowired
@Qualifier("nameToUse")
private Service myService;
我觉得你有点糊涂了。首先,您需要了解依赖注入(参见here)。关于 DI 的信息很多,但简而言之,这意味着某些第三方(例如 spring IOC)将依赖项传递给对象,而不是将对象传递给 create/obtain 引用本身。这可能通过构造函数或 setter 发生。例如,考虑构造函数 DI
class B{
}
class A{
private B b;
public A(B b){
this.b = b;
}
}
一些第三方会将 class B 的实例注入 A 而不是 class A 创建对 B 本身的引用。很多时候你会使用一个接口,所以 class A 甚至不知道将向其中注入什么对象。
现在 Spring 中有不同的方法来配置对象之间的这些关联(上面的示例)。您可以使用 XML、Java 配置或自动装配。他们是独立的,但做同样的事情。
在 XML 和 JAVA 配置中,您需要显式配置依赖项 - 在 xml 文件中或为 [=25] 使用 @Configuration class =] 使用@Bean 配置和注释bean。自动装配是不同的。在那里您可以创建简单的 POJO,您可以使用 @Component、@Controller、@Service 或 @Repository 对其进行注释。它们将通过组件扫描自动注册为 beans。使用自动装配,您不需要在 XML 文件或 JAVA 配置 class 中显式配置依赖项。您可以直接在代码中完成。例如,如果我们必须使用前面的示例
比较 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;
}
}
在后者中,我们将 class B 自动装配到 class A(由于 @Component 注释,它们都将被注册为 beans),而没有在 xml 中显式定义此关联文件或 java 配置 class。我希望它有意义。
我知道并理解基于构造函数的注入。但是,自动装配模式让我感到困惑。 1) 我读到自动装配的默认模式是 'no autowiring' 即我们必须在 xml 文件中手动设置属性。但是,基于 xml 的配置不是一种自动装配吗?怎么算'No autowiring'? 2) 其他自动装配模式是 i) byName ii) byType iii) constructor iv) auto-detect。我的假设是否正确:
a) 当使用基于 xml 配置的自动装配时,默认模式是 'byName'(即我必须保持 属性 引用的名称与 bean 的名称相同用作 属性.)
b) 当使用注解时,默认模式是 'byType'( 无论 @Autowired 关键字放在什么地方,即 setter、构造函数或 属性 , 它将搜索正在自动生成的 属性 的类型)
3) 基于构造函数的注入和 'constructor' 自动装配模式有什么区别?(我读过构造函数模式意味着它对所有构造函数参数应用 byType 模式,但它与放置有何不同@Autowired 构造函数上的关键字)
4) 我知道要在注释中启用自动装配模式 byName,在 xml 文件的 bean 定义中,我必须使用“ autowire = 'byName' ”。但是,假设我只使用注释配置(使用@Component,并且 xml 中没有 bean 定义),并且我想使用 byName 自动装配模式,那么这样做的方法是什么?
如果您必须在 xml 中指定 bean 名称,它不会自动发生,因此它不会自动装配。
使用自动装配 spring 将找出要注入的 bean,即使它可能没有明确写入。
使用基于xml配置的自动装配时,默认模式为'byName'
使用注释时,发生的顺序取决于所使用的注释,因为有一些可以使用。 @Autowire
@Resource
@Inject
.
使用@Component
时,默认接线为type。下面的方法将解决服务对象的任何自动装配需求。
@Bean
public Service getMyService(){
return new Service();
}
如果 return 一个服务有多个 @Bean
方法,您将收到错误消息。
如果您想在使用 @Component
时通过名称进行连接,您可以向变量添加 @Qualifier("nameToUse")
注释。它会找到一个名为 getNameToUse()
.
@Bean
注释方法
@Autowired
@Qualifier("nameToUse")
private Service myService;
我觉得你有点糊涂了。首先,您需要了解依赖注入(参见here)。关于 DI 的信息很多,但简而言之,这意味着某些第三方(例如 spring IOC)将依赖项传递给对象,而不是将对象传递给 create/obtain 引用本身。这可能通过构造函数或 setter 发生。例如,考虑构造函数 DI
class B{
}
class A{
private B b;
public A(B b){
this.b = b;
}
}
一些第三方会将 class B 的实例注入 A 而不是 class A 创建对 B 本身的引用。很多时候你会使用一个接口,所以 class A 甚至不知道将向其中注入什么对象。
现在 Spring 中有不同的方法来配置对象之间的这些关联(上面的示例)。您可以使用 XML、Java 配置或自动装配。他们是独立的,但做同样的事情。
在 XML 和 JAVA 配置中,您需要显式配置依赖项 - 在 xml 文件中或为 [=25] 使用 @Configuration class =] 使用@Bean 配置和注释bean。自动装配是不同的。在那里您可以创建简单的 POJO,您可以使用 @Component、@Controller、@Service 或 @Repository 对其进行注释。它们将通过组件扫描自动注册为 beans。使用自动装配,您不需要在 XML 文件或 JAVA 配置 class 中显式配置依赖项。您可以直接在代码中完成。例如,如果我们必须使用前面的示例
比较 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;
}
}
在后者中,我们将 class B 自动装配到 class A(由于 @Component 注释,它们都将被注册为 beans),而没有在 xml 中显式定义此关联文件或 java 配置 class。我希望它有意义。