首页 > 编程语言 > 详细

Spring5.X bean自动装配Autowire属性

时间:2020-07-15 13:43:53      阅读:48      评论:0      收藏:0      [点我收藏+]

属性注入

  • set方法、构造函数、POJO、list、map、ref,属于手工注入,点我直达

Spring自动注入

  • 使用<bean>元素的autowire属性为一个bean定义指定自动装配模式
  • autowire设置值
    • no:没有开启
    • byName:根据bean的id名称,注入到对应的属性里面
    • byType:根据bean需要注入的类型,注入到对应的属性里面
      • 如果按照类型注入,存在2个以上bean的话会抛异常
      • expected single matching bean but found 2
    • construcctor:通过构造函数注入,需要这个类型的构造函数

byName演示

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="video" class="net.cybclass.sp.domain.Video">
        <property name="id" value="8"></property>
        <property name="title" value="SpringBoot课程专题"></property>
    </bean>
    <bean id="videoOrder" class="net.cybclass.sp.domain.VideoOrder" autowire="byName">
        <property name="id" value="8"></property>
        <property name="outTradeNo" value="12312"></property>
    </bean>
</beans>

Video.java

package net.cybclass.sp.domain;

public class Video {
    public Video()
    {
        System.out.println("Video 默认空构造函数被调用");
    }
    {
        System.out.println("Video 构造块被调用");
    }
    static
    {
        System.out.println("Video static 静态代码块被调用");
    }
    public void init()
    {
        System.out.println("Video init 被调用类");
    }
    public void destroy()
    {
        System.out.println("Video destroy 被调用类");
    }
    private int id;
    private String title;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Video{" +
                "id=" + id +
                ", title=‘" + title + ‘\‘‘ +
                ‘}‘;
    }
}

VideoOrder.java

package net.cybclass.sp.domain;

public class VideoOrder {
    private int id;
    //订单号
    private String outTradeNo;
    private Video video;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getOutTradeNo() {
        return outTradeNo;
    }

    public void setOutTradeNo(String outTradeNo) {
        this.outTradeNo = outTradeNo;
    }

    public Video getVideo() {
        return video;
    }

    public void setVideo(Video video) {
        this.video = video;
    }

    @Override
    public String toString() {
        return "VideoOrder{" +
                "id=" + id +
                ", outTradeNo=‘" + outTradeNo + ‘\‘‘ +
                ", video=" + video +
                ‘}‘;
    }
}

技术分享图片

  从上我们可以看到byName注入,自动获取bean的id等于video的,当修改bean的id的值为video2的时候,就自动注入不到值类

byType演示

技术分享图片

下面演示注册2次bean的,会抛异常

技术分享图片

expected single matching bean but found 2: video2,video3

constructor演示

为VideoOrder.java添加构造函数

技术分享图片

 

修改applicationContext.xml

技术分享图片

 

技术分享图片

底层也是根据byType注入的

技术分享图片

Spring5.X bean自动装配Autowire属性

原文:https://www.cnblogs.com/chenyanbin/p/13304762.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!