本文概述
- 自动装配的优势
- 自动装配的缺点
- 自动装配模式
- 自动装配示例
- 1)byName自动装配模式
- 2)byType自动装配模式
- 3)构造函数自动装配模式
- 4)无自动装配模式
自动装配不能用于插入原始值和字符串值。它仅适用于参考。
自动装配的优势它需要更少的代码, 因为我们不需要编写代码来显式注入依赖项。
自动装配的缺点不能控制程序员。
不能用于原始值和字符串值。
自动装配模式自动装配模式很多:
No. | Mode | Description |
---|---|---|
1) | no | 这是默认的自动装配模式。这意味着默认情况下没有自动装配。 |
2) | byName | byName模式根据bean的名称注入对象依赖项。在这种情况下, 属性名称和Bean名称必须相同。它在内部调用setter方法。 |
3) | byType | byType模式根据类型注入对象依赖项。因此属性名称和bean名称可以不同。它在内部调用setter方法。 |
4) | constructor | 构造函数模式通过调用类的构造函数来注入依赖项。它调用具有大量参数的构造函数。 |
5) | autodetect | 从Spring 3开始不推荐使用。 |
<
bean id="a" class="org.sssit.A" autowire="byName">
<
/bean>
让我们看一下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");
}
}
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="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自动装配介绍和用法详解】在没有自动装配模式的情况下, spring容器不会通过自动装配注入依赖项。
<
bean id="b" class="org.sssit.B">
<
/bean>
<
bean id="a" class="org.sssit.A" autowire="no">
<
/bean>
推荐阅读
- Spring AOP AspectJ Xml配置示例
- 如何在Spring中使用工厂方法进行依赖注入()
- Android Studio 学习 广播
- App上线-修改构建版本
- Android 常用开源框架源码解析 系列dagger2呆哥兔 依赖注入库
- Android_ContentProvider
- Android 常用开源框架源码解析 系列picasso 图片框架
- Android 常用开源框架源码解析 系列Rxjava 异步框架
- Could not find com.android.tools.lint:lint-gradle:26.1.2.