📜  在Spring中自动装配

📅  最后修改于: 2020-12-04 07:49:02             🧑  作者: Mango

Spring自动布线

Spring框架的自动装配功能使您可以隐式注入对象依赖项。它在内部使用setter或构造函数注入。

自动装配不能用于插入原始值和字符串值。它仅适用于参考。

自动接线的优势

它需要较少的代码,因为我们不需要编写代码来显式注入依赖项。

自动装配的缺点

不能控制程序员。

不能用于原始值和字符串值。

自动装配模式

自动装配模式很多:

No. Mode Description
1) no It is the default autowiring mode. It means no autowiring bydefault.
2) byName The byName mode injects the object dependency according to name of the bean. In such case, property name and bean name must be same. It internally calls setter method.
3) byType The byType mode injects the object dependency according to type. So property name and bean name can be different. It internally calls setter method.
4) constructor The constructor mode injects the dependency by calling the constructor of the class. It calls the constructor having large number of parameters.
5) autodetect It is deprecated since Spring 3.

自动接线示例

让我们看一下在春天使用自动装配的简单代码。您需要使用bean元素的autowire属性来应用自动装配模式。


让我们看一下Spring自动布线的完整示例。为了创建此示例,我们创建了4个文件。

  • B.java
  • A.java
  • applicationContext.xml
  • Test.java

此类仅包含构造函数和方法。

package org.sssit;
public class B {
B(){System.out.println("b is created");}
void print(){System.out.println("hello b");}
}

此类包含B类的引用以及构造函数和方法。

package org.sssit;
public class A {
B b;
A(){System.out.println("a is created");}
public B getB() {
    return b;
}
public void setB(B b) {
    this.b = b;
}
void print(){System.out.println("hello a");}
void display(){
    print();
    b.print();
}
}







此类从applicationContext.xml文件获取Bean并调用display方法。

package org.sssit;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    A a=context.getBean("a",A.class);
    a.display();
}
}

输出:

b is created
a is created
hello a
hello b

1)byName自动装配模式

在byName自动装配模式下,bean ID和引用名称必须相同。

内部使用setter注入。



但是,如果更改bean的名称,它将不会注入依赖项。

让我们看看将Bean名称从b更改为b1的代码。



2)byType自动装配模式

在byType自动装配模式下,bean ID和引用名称可能不同。但是,只能有一个类型的bean。

内部使用setter注入。



在这种情况下,它可以正常工作,因为您已创建了B类型的实例。 Bean名称与引用名称不同也没关系。

但是,如果您有一个类型的多个bean,它将无法工作并引发异常。

让我们看一下其中有许多B型bean的代码。




在这种情况下,它将引发异常。

3)构造函数自动装配模式

在构造器自动装配模式下,spring容器通过参数化最高的构造器注入依赖项。

如果一个类中有3个构造函数,零参数,一个参数和两个参数,则将通过调用两个参数构造函数来执行注入。



4)无自动接线模式

在没有自动装配模式的情况下,spring容器不会通过自动装配注入依赖项。