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

超级通道: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)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值