您的位置:首页 > 编程语言 > Java开发

Spring代码实例系列-04:autowire自动装配合集

2018-01-07 17:36 639 查看
超级通道:Spring代码实例系列-绪论

自动装配(autowire)有两大类共计9中方式,分别是:

序号大类方式备注
1xmlno默认方式,通过ref属性,可以不指定autowire属性,其实就是byType
2xmlbyType指定autowire=byType属性,setter注入
3xmlbyName指定autowire=byName属性,setter注入
4xmlconstructor指定autowire=constructor属性,constructor注入
5xmlautodetect指定autowire=autodetect属性,先按constructor装配,再按byType装配
6@AutowirebyType通过@Autowire注解字段
7@AutowirebyName通过@Autowire注解字段,通过@Qualifier注解名称
8@Autowiremethod通过@Autowire注解setter
9@Autowireconstructor通过@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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息