65269@163.com
Beans 的自动装配
Spring 容器可以在不使用和元素的清空下自动装配相互协作的bean之间的关系,这有助于减少编写一个答的基于Spring的应用程序的XML配置的数量.
自动装配:
Spring是受欢迎的企业级Java应用程序开发框架,数以百万的来自世界各地的开发人员都在使用 Spring 框架创建高性能、易于测试和可重用的代码。
自动装配是Spring框架的重要功能,是使用Spring满足bean依赖的一种方式,Spring会在应用中为某个bean寻找其依赖的bean,Spring中bean有三种装配机制,分别是:在xml中显示配置、在java中显示配置以及隐式的bean发现机制和自动装配。
自动装配模式
下列是自动装配模式,他们可以用于指示Spring容器为 来使用自动装配进行依赖注入. 你可以使用元素的autowire属性为一个bean定义指定的自动装配模式
模式 | 描述 |
---|---|
no | 这个是默认的设置,它以为着没有自动装配,你应该使用显示的bean引用来连接.你可不用为了连接做特殊的事. |
byName | 由属性名自动装配,Spring容器看到在XML配置文件中bean的自动装配的属性设置为byName.然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的bean的属性进行连接 |
byType | 由属性类型自动装配.Spring容器看到在XML配置文件中bean的自动装配的属性为byType.然后如果它的类型匹配配置文件中的一个确切的bean名称,它将尝试匹配连接属性的类型,如果存在不止一个这样的bean,则一个指明的异常将会被抛出. |
constructor | 类似于byType,但该类型适用于构造函数参数类型,如果在容器中没有一个构造函数类型的bean,则一个指明的错误将会发生. |
autodetect | Spring首先尝试通过constructor使用自动装配来连接,如果它不执行,Spring尝试通过byType来自动装配 |
可以使用byType或者constructor自动装配模式来连接数组和其他类型的集合.
自动装配的局限性
当自动装配始终在同一个项目中使用时,它的效果最好.如果通常不使用自动装配,它可能会使开发人员混淆的使用它来连接只有一个或者两个bean定义.不过,自动装配可以显著减少需要指定的属性构造器参数,但你应该在使用他们之前考虑到自动装配的局限性和缺点.
限制 | 描述 |
---|---|
重写的可能性 | 你可以使用总是重写自动装配和设置来指定依赖关系 |
原始数据类型 | 你不能自动渣u哪个品牌所谓的简单类型包括基本类型,字符串和类 |
混乱的本质 | 自动装配不如显示装配精确,所以如果可能的话尽可能的使用显示装配. |
Spring 自动装配’byName’
这种模式有属性名称指定自动装配.Springle容器看做beans,在XML配置文件中beans的auto-wire属性设置为byName.然后,它尝试将它的属性与配置文件中定义为相同名称的beans进行匹配和连接.如果找到匹配项,它将注入这些beans,否则它抛出异常.
例如:
在配置文件中,如果一个bean定义设置为自动装配byName,并且它包含SpellChecker属性(即,它有一个setSpellChecker()的方法),那么S平均日那个就会查找定义名为spellChecker的bean,并且用它来设置属性.你仍可以使用标签连接其余的属性.
步骤 | 描述 |
---|---|
1 | 创建一个名称为 SpringExample 的项目,并且在已创建的项目的 c src 文件夹中创建一个包 com.tutorialspoint 。 |
2 | 使用 Add External JARs 选项,添加所需的 Spring 库,在 Spring Hello World Example 章节中已说明。 |
3 | 在 com.tutorialspoint 包中创建 Java 类 TextEditor , SpellChecker 和 MainApp |
4 | 在src 文件夹中创建 Beans 的配置文件 Beans.xml 。 |
5 | 最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并运行该应用程序,正如下面解释的一样。 |
TextEditor.java
package com.tutorialspoint;
public class TextEditor {
private SpellChecker spellChecker;
private String name;
public SpellChecker getSpellChecker() {
return spellChecker;
}
public void setSpellChecker(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void spellCheck(){
spellChecker.checkSpelling();
}
}
SpellChecker.java
package com.tutorialspoint;
public class SpellChecker {
public SpellChecker() {
System.out.println(" SpellChecker 的 构造方法");
}
public void checkSpelling() {
System.out.println("SpellChecker 中的 checkSpelling() 方法");
}
}
MainApp.java
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"Beans.xml");
TextEditor te = (TextEditor) context.getBean("textEditor");
te.spellCheck();
}
}
下面是正常清空下的配置文件
Beans.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="textEditor" class="com.tutorialspoint.TextEditor">
<property name="spellChecker" ref="spellChecker" />
<property name="name" value="Generic TextEditor" />
</bean>
<bean id="spellChecker" class="com.tutorialspoint.SpellChecker"></bean>
</beans>
如果使用自动装配”byName” , 那么你的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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="textEditor" class="com.tutorialspoint.TextEditor"
autowire="byName">
<property name="name" value="Generic Text Editor" />
</bean>
<bean id="spellChecker" class="com.tutorialspoint.SpellChecker" />
</beans>
byName的加载过程图解:
图片中只理解了对byName的加载,其他的执行过程都是一样的.
Spring 自动装配 byType
这种模式由属性类型指定自动装配.自动装配.Spring容器看做beans,在XML配置文件中beans的autowire属性设置为byType.然后,如果它的type恰好与配置文件中beans名称中的一个相匹配,它将尝试匹配和连接它的属性.如果找不到匹配项,它将注入这些beans,否则,它将抛出异常.
例如:
在配置文件中,如果一个bean定义设置为自动装配byType,并且包含SpellChecker类型的spellChecker属性,那么Spring就会查找定义名为SpellChecker的bean,并且用它来设置这个属性.你仍然可以使用标签连接其余属性.下面的例子说明这个概念,你会发现和上面的例子没什么区别.除了XML文件的配置发生了少许的改变.
代码与上面的byName的代码一致,但Beans.xml中的类型需要该成byType.
Beans.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="textEditor" class="com.tutorialspoint.TextEditor"
autowire="byType">
<property name="name" value="Generic Text Editor" />
</bean>
<bean id="spellChecker" class="com.tutorialspoint.SpellChecker" />
</beans>
Spring 由 构造函数自动装配
这种模式与byType非常相似,但它应用于构造器参数.Spring容器看做beans,在XML配置文件中beans的autowire属性设置为 constructot . 然后 , 它尝试把构造函数的参数与配置文件中的beans名称中的一个进行匹配和连接,如果找到匹配项,它会注入这些bean,否则抛出异常.
例如
在配置文件中,如果一个本定义设置通过构造函数自动装配,而且它带有一个SpellChecker类型的参数之一的构造函数,那么Spring就会查找定义名为SpellChecker的bean,并且用它来设置构造函数的参数,你仍然可以使用标签连接其余属性.
案例:
步骤 | 描述 |
---|---|
1 | 创建一个名称为 SpringExample 的项目,并且在已创建的项目的 c src 文件夹中创建一个包 com.tutorialspoint 。 |
2 | 使用 Add External JARs 选项,添加所需的 Spring 库,在 Spring Hello World Example 章节中已说明. |
3 | 在 com.tutorialspoint 包中创建 Java 类 TextEditor , SpellChecker 和 MainApp |
4 | 在src 文件夹中创建 Beans 的配置文件 Beans.xml 。 |
5 | 最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并运行该应用程序,正如下面解释的一样。 |
TextEditor.java
package com.tutorialspoint;
public class TextEditor {
private SpellChecker spellChecker;
private String name;
public TextEditor(SpellChecker spellChecker, String name) {
this.spellChecker = spellChecker;
this.name = name;
}
public SpellChecker getSpellChecker() {
return spellChecker;
}
public void setSpellChecker(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void spellCheck(){
spellChecker.checkSpelling();
}
}
SpellChecker.java
package com.tutorialspoint;
public class SpellChecker {
public SpellChecker() {
System.out.println(" SpellChecker 的 构造方法");
}
public void checkSpelling() {
System.out.println("SpellChecker 中的 checkSpelling() 方法");
}
}
MainApp.java
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"Beans.xml");
TextEditor te = (TextEditor) context.getBean("textEditor");
te.spellCheck();
}
}
Beans.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="textEditor" class="com.tutorialspoint.TextEditor"
autowire="constructor">
<constructor-arg value="Generic Text Editor" />
</bean>
<bean id="spellChecker" class="com.tutorialspoint.SpellChecker" />
</beans>