Spring 依赖注入 (构造函数注入、Setter注入 、嵌套注入、 文件方式注入)

博客介绍了依赖注入方式,包括基于构造函数和Setter方法的注入。阐述了实际开发中强依赖选构造函数注入,可选依赖选Setter方法注入。还介绍了通过构造函数注入(含集合)、文件方式注入Bean、嵌套注入等,最后对比了构造函数注入和Setter注入的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依赖注入方式

-基于构造函数

public class ScrewDriver{
	private Header header;
	public ScrewDriver(Header header){
		this.header = header;
	}
}

-基于Setter方法

public class ScrewDriver{
	private Header header;
	public setDriver(Header header){
		this.header = header;
	}
}

实际开发选择

强依赖 → 构造函数

可选依赖 → Setter方法 (可配置)

通过构造函数依赖注入

  • 定义接口
package cn.test.controller;

public interface Header {
    public void doWord();
    public String getInfo();
}
  • 接口实现
package cn.test.controller;

public class StraightHeader implements Header {

    private String color;
    private int size;

    public StraightHeader(){}

    public StraightHeader(String color, int size) {
        this.color = color;
        this.size = size;
    }

    @Override
    public void doWord() {
        System.out.println("doWord");
    }

    @Override
    public String getInfo() {
      return "StraightHeader"+color+"--- SIZE:"+size;
    }
}
  • 实例测试
package cn.test.controller;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/cren")
public class TestContainer {
    @RequestMapping("/test")
    public static void main(String [] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Header header = context.getBean("header", StraightHeader.class);
        System.out.println(header.getInfo());
        header.doWord();
    }

}
  • Bean注入
 <bean id="header" class="cn.test.controller.StraightHeader">
        <constructor-arg value="red"></constructor-arg>
        <constructor-arg value="15"></constructor-arg>
    </bean>

通过构造函数依赖注入 (集合)

  • 定义接口
package cn.test.controller;

public interface Header {
    public void doWord();
    public String getInfo();
}
  • 接口实现
package cn.test.controller;

public class StraightHeader implements Header {

    private String color;
    private int size;

    public StraightHeader(){}

    public StraightHeader(String color, int size) {
        this.color = color;
        this.size = size;
    }
	//改
    public StraightHeader(Map<String,String> paras){
        this.color = paras.get("color");
        this.size =Integer.valueOf(paras.get("size"));
    }

    @Override
    public void doWord() {
        System.out.println("doWord");
    }

    @Override
    public String getInfo() {
      return "StraightHeader"+color+"--- SIZE:"+size;
    }
}
  • 实例测试
package cn.test.controller;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/cren")
public class TestContainer {
    @RequestMapping("/test")
    public static void main(String [] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Header header = context.getBean("header", StraightHeader.class);
        System.out.println(header.getInfo());
        header.doWord();
    }

}
  • Bean注入
//改
<bean id="header" class="cn.test.controller.StraightHeader">
        <constructor-arg>
            <map>
                <entry key="color" value="red"></entry>
                <entry key="size" value="12"></entry>
            </map>
        </constructor-arg>
    </bean>

文件方式注入Bean

<bean id="header" class="cn.test.controller.StraightHeader">
    <constructor-arg name="color" value="${color}"> </constructor-arg>
    <constructor-arg name="size" value="${size}"> </constructor-arg>
 </bean>
//加入以下配置
 <bean id = "headerProperties"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:header.properties"></property>
    </bean>

//建立文件header.properties,参数写入即可

嵌套注入
<bean id="screwDriver" class="cn.test.controller.ScrewDriver">
    <constructor-arg >
    	<ref bean="header">
    </constructor-arg>
 </bean>
 
 <bean id="header" class="cn.test.controller.StraightHeader">
        <constructor-arg value="red"></constructor-arg>
        <constructor-arg value="15"></constructor-arg>
    </bean>

通过Setter依赖注入

  • 定义接口
package cn.test.controller;

public interface Header {
    public void doWord();
    public String getInfo();
}
  • 接口实现
package cn.test.controller;

public class StraightHeader implements Header {

    private String color;
    private int size;

    public StraightHeader(){}

    public StraightHeader(String color, int size) {
        this.color = color;
        this.size = size;
    }
	
	//改
	public void setColor(String color){
		this.color=color;
	}
	public void setSize(String size){
		this.size=size;
	}
    @Override
    public void doWord() {
        System.out.println("doWord");
    }

    @Override
    public String getInfo() {
      return "StraightHeader"+color+"--- SIZE:"+size;
    }
}
  • 实例测试
package cn.test.controller;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/cren")
public class TestContainer {
    @RequestMapping("/test")
    public static void main(String [] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Header header = context.getBean("header", StraightHeader.class);
        System.out.println(header.getInfo());
        header.doWord();
    }

}
  • Bean注入
 <bean id="header" class="cn.test.controller.StraightHeader">
        <property name="color" value="${color}"></constructor-arg>
        <preperty name="size" value="${size}"></constructor-arg>
    </bean>

构造函数注入和Setter注入两者的区别 :

构造函数注入,必须将定义的构造函数所有参数注入设值,而Setter不用,他可以只设值一个值或者多个值,一般来说如果构造注入的值是固定的建议用构造函数注入,如果不固定用Setter注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值