自动装配(autowire)有两大类共计9中方式,分别是:
序号 | 大类 | 方式 | 备注 |
---|---|---|---|
1 | xml | no | 默认方式,通过ref属性,可以不指定autowire属性,其实就是byType |
2 | xml | byType | 指定autowire=byType属性,setter注入 |
3 | xml | byName | 指定autowire=byName属性,setter注入 |
4 | xml | constructor | 指定autowire=constructor属性,constructor注入 |
5 | xml | autodetect | 指定autowire=autodetect属性,先按constructor装配,再按byType装配 |
6 | @Autowire | byType | 通过@Autowire注解字段 |
7 | @Autowire | byName | 通过@Autowire注解字段,通过@Qualifier注解名称 |
8 | @Autowire | method | 通过@Autowire注解setter |
9 | @Autowire | constructor | 通过@Autowire注解constructor |
下面分别进行展示
0.程序目录
project
\---src
\---main
\---java
| \---pers
| \---hanchao
| \---autowire
| \---App.java
| \---MyFavoriteAutowireType.java
| \---MyFavoriteAutowireTypeByAnnotation.java
| \---DefaultAutoWire.java
| \---ByTypeAutoWire.java
| \---ByNameAutoWire.java
| \---ConstructorAutoWire.java
| \---AutodetectAutoWire.java
\---resources
\---spring-config
\---spring-autowire
\---spring-autowire-default.xml
\---spring-autowire-bytype.xml
\---spring-autowire-byname.xml
\---spring-autowire-constructor.xml
\---spring-autowire-autodetect.xml
\---spring-autowire-annotation.xml
1.以xml形式,autowire=no进行装配
1.1.App.java
package pers.hanchao.autowire;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* <p>spring构造注入示例:通过配置xml中的constructor-arg标签</p>
* @author hanchao 2018/1/7 12:32
**/
public class App {
public static void main(String[] args) {
//默认的自动装配类型:通过setter注入的形式,在xml中指定ref属性,实现自动装配
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config/spring-autowire/spring-autowire-default.xml");
MyFavoriteAutowireType myFavoriteAutowireType = (MyFavoriteAutowireType) context.getBean("myFavoriteAutowireType");
myFavoriteAutowireType.showMyFavoriteAutowireType();
}
}
1.2.spring-autowire-default.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--默认的自动装配类型-->
<bean id="myFavoriteAutowireType" class="pers.hanchao.autowire.MyFavoriteAutowireType" autowire="no">
<property name="defaultAutoWire" ref="defaultAutoWire"/>
</bean>
<bean id="defaultAutoWire" class="pers.hanchao.autowire.DefaultAutoWire"/>
</beans>
1.3.MyFavoriteAutowireType.java
package pers.hanchao.autowire;
public class MyFavoriteAutowireType {
public MyFavoriteAutowireType() {
}
private DefaultAutoWire defaultAutoWire;
//通过setter注入
public void setDefaultAutoWire(DefaultAutoWire defaultAutoWire) {
this.defaultAutoWire = defaultAutoWire;
}
public void showMyFavoriteAutowireType(){
if (null != defaultAutoWire)
System.out.println("My favorite autowire type is " + this.defaultAutoWire.showName());
}
}
1.4.DefaultAutoWire.java
package pers.hanchao.autowire;
public class DefaultAutoWire {
public String showName() {
return " defautl autowire";
}
}
1.5.result
My favorite autowire type is defautl autowire
2.以xml形式,autowire=byType进行装配
2.1.App.java
package pers.hanchao.autowire;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* <p>spring构造注入示例:通过配置xml中的constructor-arg标签</p>
* @author hanchao 2018/1/7 12:32
**/
public class App {
public static void main(String[] args) {
//byType的自动装配类型,通过setter注入的形式,在xml中指定autowire=byType,实现自动装配
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config/spring-autowire/spring-autowire-bytype.xml");
MyFavoriteAutowireType myFavoriteAutowireType = (MyFavoriteAutowireType) context.getBean("myFavoriteAutowireType");
myFavoriteAutowireType.showMyFavoriteAutowireType();
}
}
2.2.spring-autowire-bytype.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--byType:按类型自动装配-->
<bean id="myFavoriteAutowireType" class="pers.hanchao.autowire.MyFavoriteAutowireType" autowire="byType"/>
<bean id="byTypeAutoWire" class="pers.hanchao.autowire.ByTypeAutoWire"/>
</beans>
2.3.MyFavoriteAutowireType.java
package pers.hanchao.autowire;
public class MyFavoriteAutowireType {
public MyFavoriteAutowireType() {
}
private ByTypeAutoWire byTypeAutoWire;
//通过setter注入
public void setByTypeAutoWire(ByTypeAutoWire byTypeAutoWire) {
this.byTypeAutoWire = byTypeAutoWire;
}
public void showMyFavoriteAutowireType(){
if (null != byTypeAutoWire)
System.out.println("My favorite autowire type is " + this.byTypeAutoWire.showName());
}
}
2.4.ByTypeAutoWire.java
package pers.hanchao.autowire;
public class ByTypeAutoWire {
public String showName() {
return " byType autowire";
}
}
2.5.result
My favorite autowire type is byType autowire
3.以xml形式,autowire=byName进行装配
3.1.App.java
package pers.hanchao.autowire;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* <p>spring构造注入示例:通过配置xml中的constructor-arg标签</p>
* @author hanchao 2018/1/7 12:32
**/
public class App {
public static void main(String[] args) {
//byName的自动装配类型,通过setter注入的形式,在xml中指定autowire=byName,实现自动装配
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config/spring-autowire/spring-autowire-byname.xml");
MyFavoriteAutowireType myFavoriteAutowireType = (MyFavoriteAutowireType) context.getBean("myFavoriteAutowireType");
myFavoriteAutowireType.showMyFavoriteAutowireType();
}
}
3.2.spring-autowire-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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--byName:按名称自动装配-->
<bean id="myFavoriteAutowireType" class="pers.hanchao.autowire.MyFavoriteAutowireType" autowire="byName"/>
<bean id="byNameAutoWire" class="pers.hanchao.autowire.ByNameAutoWire"/>
</beans>
3.3.MyFavoriteAutowireType.java
package pers.hanchao.autowire;
public class MyFavoriteAutowireType {
public MyFavoriteAutowireType() {
}
private ByNameAutoWire byNameAutoWire;
//通过setter注入
public void setByNameAutoWire(ByNameAutoWire byNameAutoWire) {
this.byNameAutoWire = byNameAutoWire;
}
public void showMyFavoriteAutowireType(){
if (null != byNameAutoWire)
System.out.println("My favorite autowire type is " + this.byNameAutoWire.showName());
}
}
3.4.ByNameAutoWire.java
package pers.hanchao.autowire;
public class ByNameAutoWire {
public String showName() {
return " byName autowire";
}
}
3.5.result
My favorite autowire type is byName autowire
4.以xml形式,autowire=constructor进行装配
4.1.App.java
package pers.hanchao.autowire;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* <p>spring构造注入示例:通过配置xml中的constructor-arg标签</p>
* @author hanchao 2018/1/7 12:32
**/
public class App {
public static void main(String[] args) {
//byConstructor的自动装配类型,通过setter注入的形式,在xml中指定autowire=constructor,实现自动装配
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config/spring-autowire/spring-autowire-constructor.xml");
MyFavoriteAutowireType myFavoriteAutowireType = (MyFavoriteAutowireType) context.getBean("myFavoriteAutowireType");
myFavoriteAutowireType.showMyFavoriteAutowireType();
}
}
4.2.spring-autowire-constructor.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--constructor:按构造器参数的数据类型自动装配-->
<bean id="myFavoriteAutowireType" class="pers.hanchao.autowire.MyFavoriteAutowireType" autowire="constructor"/>
<bean id="constructorAutoWire" class="pers.hanchao.autowire.ConstructorAutoWire"/>
</beans>
4.3.MyFavoriteAutowireType.java
package pers.hanchao.autowire;
public class MyFavoriteAutowireType {
public MyFavoriteAutowireType() {
}
private ConstructorAutoWire constructorAutoWire;
//通过constructor注入
public MyFavoriteAutowireType(ConstructorAutoWire constructorAutoWire) {
this.constructorAutoWire = constructorAutoWire;
}
public void showMyFavoriteAutowireType(){
if (null != constructorAutoWire)
System.out.println("My favorite autowire type is " + this.constructorAutoWire.showName());
}
}
4.4.ConstructorAutoWire.java
package pers.hanchao.autowire;
public class ConstructorAutoWire {
public String showName() {
return " constructor autowire";
}
}
4.5.result
My favorite autowire type is constructor autowire
5.以xml形式,autowire=autodetect进行装配
5.1.App.java
package pers.hanchao.autowire;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* <p>spring构造注入示例:通过配置xml中的constructor-arg标签</p>
* @author hanchao 2018/1/7 12:32
**/
public class App {
public static void main(String[] args) {
//byAutodetect的自动装配类型,先byContstructor,再byType的组合自动装配方式
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config/spring-autowire/spring-autowire-autodetect.xml");
MyFavoriteAutowireType myFavoriteAutowireType = (MyFavoriteAutowireType) context.getBean("myFavoriteAutowireType");
myFavoriteAutowireType.showMyFavoriteAutowireType();
}
}
5.2.spring-autowire-autodetect.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--自动检测的自动装配形式-->
<bean id="myFavoriteAutowireType" class="pers.hanchao.autowire.MyFavoriteAutowireType" autowire="constructor"/>
<bean id="autodetectAutoWire" class="pers.hanchao.autowire.AutodetectAutoWire"/>
</beans>
5.3.MyFavoriteAutowireType.java
package pers.hanchao.autowire;
public class MyFavoriteAutowireType {
public MyFavoriteAutowireType() {
}
private AutodetectAutoWire autodetectAutoWire;
//通过constructor注入
public MyFavoriteAutowireType(AutodetectAutoWire autodetectAutoWire) {
this.autodetectAutoWire = autodetectAutoWire;
}
//通过setter注入
public void setAutodetectAutoWire(AutodetectAutoWire autodetectAutoWire) {
this.autodetectAutoWire = autodetectAutoWire;
}
public void showMyFavoriteAutowireType(){
if (null != autodetectAutoWire)
System.out.println("My favorite autowire type is " + this.autodetectAutoWire.showName());
}
}
5.4.AutoDetectAutoWire.java
package pers.hanchao.autowire;
public class AutodetectAutoWire {
public String showName() {
return " autodetect autowire";
}
}
5.5.result
My favorite autowire type is autodetect autowire
6.以@Autowire形式进行装配
6.1.App.java
package pers.hanchao.autowire;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* <p>spring构造注入示例:通过配置xml中的constructor-arg标签</p>
* @author hanchao 2018/1/7 12:32
**/
public class App {
public static void main(String[] args) {
//byAnnotation的自动装配类型,及@Autowire注解的方式
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config/spring-autowire/spring-autowire-annotation.xml");
MyFavoriteAutowireTypeByAnnotation myFavoriteAutowireTypeByAnnotation = (MyFavoriteAutowireTypeByAnnotation) context.getBean("myFavoriteAutowireTypeByAnnotation");
myFavoriteAutowireTypeByAnnotation.showMyFavoriteAutowireType();
}
}
6.2.spring-autowire-annotation.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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="myFavoriteAutowireTypeByAnnotation" class="pers.hanchao.autowire.MyFavoriteAutowireTypeByAnnotation"/>
<bean id="defaultAutoWire" class="pers.hanchao.autowire.DefaultAutoWire"/>
<bean id="byTypeAutoWire" class="pers.hanchao.autowire.ByTypeAutoWire"/>
<bean id="byNameAutoWire" class="pers.hanchao.autowire.ByNameAutoWire"/>
<bean id="constructorAutoWire" class="pers.hanchao.autowire.ConstructorAutoWire"/>
<bean id="autodetectAutoWire" class="pers.hanchao.autowire.AutodetectAutoWire"/>
</beans>
6.3.MyFavoriteAutowireTypeByAnnotation.java
package pers.hanchao.autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class MyFavoriteAutowireTypeByAnnotation {
private DefaultAutoWire defaultAutoWire;
//通过@Autowired注解setter,默认按byType自动装配
@Autowired
public void setDefaultAutoWire(DefaultAutoWire defaultAutoWire) {
this.defaultAutoWire = defaultAutoWire;
}
//通过@Autowired注解字段,默认按byType自动装配
@Autowired
private ByTypeAutoWire byTypeAutoWire;
//通过@Autowired注解字段,通过@Qualifier指定按byName自动装配
@Autowired
@Qualifier("byNameAutoWire")
private ByNameAutoWire byNameAutoWire;
private ConstructorAutoWire constructorAutoWire;
//通过@Autowired注解constructor,默认按byType自动装配
@Autowired
public MyFavoriteAutowireTypeByAnnotation(ConstructorAutoWire constructorAutoWire) {
this.constructorAutoWire = constructorAutoWire;
}
public void showMyFavoriteAutowireType(){
if (null != defaultAutoWire)
System.out.println("My favorite autowire type is @Autowire setter方法");
if (null != byTypeAutoWire)
System.out.println("My favorite autowire type is @Autowire 字段(按类型)");
if (null != byNameAutoWire)
System.out.println("My favorite autowire type is @Autowire 字段(按名称)");
if (null != constructorAutoWire)
System.out.println("My favorite autowire type is @Autowire 构造方法");
}
}
6.4.result
My favorite autowire type is @Autowire setter方法
My favorite autowire type is @Autowire 字段(按类型)
My favorite autowire type is @Autowire 字段(按名称)
My favorite autowire type is @Autowire 构造方法
6.5.关闭依赖检查(required)
默认情况下,spring加载时,会根据@Autowire注解检查所有的相关依赖。如果被@Autowire注解的依赖找不到,程序就会报错。如果想关闭依赖检查,可以通过以下注解。
@Autowired(required=false)