依赖注入方式
-基于构造函数
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注入