Spring中的自动装配

Spring框架的自动装配功能使您能够隐式地注入对象依赖关系。它内部使用setter或构造函数注入。

自动装配不能用于注入原始类型和字符串值。它只能用于引用。

自动装配的优势

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

自动装配的缺点

程序员没有控制权。

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

自动装配模式

有许多自动装配模式:

序号模式描述
1)no这是默认的自动装配模式。这意味着默认情况下没有自动装配。
2)byNamebyName模式根据bean的名称注入对象依赖项。在这种情况下,属性名称和bean名称必须相同。它内部调用setter方法。
3)byTypebyType模式根据类型注入对象依赖项。因此,属性名称和bean名称可以不同。它内部调用setter方法。
4)constructorconstructor模式通过调用类的构造函数来注入依赖项。它调用具有大量参数的构造函数。
5)autodetect自Spring 3以来,已弃用。

自动装配示

让我们看一个简单的使用Spring中自动装配的示例。您需要使用bean元素的autowire属性来应用自动装配模式。

<bean id="a" class="org.sssit.A" autowire="byName"></bean>

让我们看一个完整的Spring中自动装配的示例。为了创建这个示例,我们创建了4个文件。

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

B.java

这个类只包含一个构造函数和一个方法。

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

A.java

这个类包含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

<?xml version="1.0" encoding="UTF-8"?> 
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byName"></bean>
</beans> 

Test.java

这个类从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 id="b" class="org.sssit.B"></bean>
<bean id="a" class

但是,如果更改bean的名称,它将无法注入依赖关系。

让我们看一个将bean名称从b更改为b1的代码示例。

<bean id="b1" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byName"></bean>

按类型自动装配模式

在按类型自动装配模式中,bean的id和引用名称可以不同。但是必须只有一个类型的bean存在。

它内部使用setter注入。

<bean id="b1" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byType"></bean>

在这种情况下,它能正常工作,因为您已经创建了一个B类型的实例。引用名称与bean名称不同并不重要。

但是,如果有多个类型相同的bean,则不会起作用并且会抛出异常。

让我们看一个存在多个B类型bean的代码示例。

<bean id="b1" class="org.sssit.B"></bean>
<bean id="b2" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byName"></bean>

在这种情况下,它将抛出异常。

构造函数自动装配模式

在构造函数自动装配模式中,Spring容器通过调用具有最多参数的构造函数来注入依赖项。

如果一个类中有3个构造函数,零参数、一个参数和两个参数,那么注入将通过调用两个参数的构造函数来完成。

<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="constructor"></bean>

无自动装配模式

在无自动装配模式中,Spring容器不会通过自动装配来注入依赖项。

<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="no"></bean>

标签: spring, Spring教程, Spring技术, Spring语言学习, Spring学习教程, Spring下载, Spring框架, Spring框架入门, Spring框架教程, Spring框架高级教程, Spring面试题, Spring笔试题, Spring编程思想