Spring 自动装配
Spring框架的自动装配功能使您可以隐式注入对象依赖项。它在内部使用setter或构造函数注入。
自动装配不能用于注入基本值和字符串值。它仅适用于参考。
自动装配的优点
它需要 更少的代码,因为我们不需要编写代码来显式注入依赖项。
自动装配的缺点
没有程序员的控制权。
它不能用于原始值和字符串值。
自动装配模式
有很多自动装配模式:
模式 | 说明 |
no | 这是默认的自动装配模式。这意味着默认情况下没有自动装配。 |
byName | byName模式根据bean的名称注入对象依赖项。在这种情况下,属性名称和bean名称必须相同。它在内部调用setter方法。 |
byType | byType模式根据类型注入对象依赖项。因此属性名称和bean名称可以不同。它在内部调用setter方法。 |
constructor | 构造函数模式通过调用类的构造函数来注入依赖项。它会调用具有大量参数的构造函数。 |
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并调用显示方法。
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="org.sssit.A" autowire="byName"></bean>
但是,如果更改bean的名称,它将不会注入依赖项。
让我们看看将bean的名称从b更改为b1的代码。
<bean id="b1" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean>
2)byType自动装配模式
在byType自动装配模式下,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>
在这种情况下,它将引发异常。
3)构造函数自动装配模式
在构造函数自动装配模式下,spring容器通过最高参数化的构造函数注入依赖项。
如果一个类中的3个构造函数,零参数,一个参数和两个参数,然后通过调用两个参数构造函数执行注入。
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="constructor"></bean>
4)没有自动装配模式
在没有自动装配模式的情况下,spring容器不会通过自动装配注入依赖项。
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="no"></bean>
在Spring中使用工厂方法进行依赖注入Spring框架提供了使用工厂方法来注入bean的便利。为此,我们可以使用bean元素的两个属性。factory-method: 表示将被调用以注入 ...