Java依赖注入的三种方式

  • 格式:pdf
  • 大小:67.83 KB
  • 文档页数:2

Java依赖注⼊的三种⽅式

Spring通过DI(依赖注⼊)实现IOC(控制反转),常⽤的注⼊⽅式主要有三种:构造⽅法注⼊,setter注⼊,基于注解的注⼊。

构造⽅法注⼊

构造器注⼊:保证了⼀些必要的属性在Bean实例化时就设置,并且确保了bean实例在实例化后就可以使⽤.

1.在类中,不⽤为属性设置setter⽅法,只需提供构造⽅法即可

2.在构造⽂件中配置该类bean,并配置构造器,在配置构造器中⽤

//ApplicationContext.xml

提供构造⽅法

public class UserAction {

private String name;

public UserAction(String name) {

this.name = name;

}

}

setter注⼊

1.根据property标签的name属性的值去找对应的setter⽅法.

例如: name= “aa” 对应的就是setAa⽅法.

2.由于属性注⼊具有可选性和灵活性⾼的优点,是实际上最常⽤的注⼊⽅式.

3.属性注⼊要求bean提供⼀个默认的构造函数,并为需要注⼊的属性提供对应的setter⽅法.spring先调⽤bean默认的构造函数实例化bean对

象,然后通过反射机制的⽅法调⽤setter⽅法注⼊属性值.

4.还有⼀点需要注意:如果通过set⽅法注⼊属性,那么spring会通过默认的空参构造⽅法来实例化对象,所以如果在类中写了⼀个带有参

数的构造⽅法,⼀定要把空参数的构造⽅法写上,否则spring没有办法实例化对象,导致报错。

//ApplicationContext.xml

提供setting⽅法

public class UserAction {

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

注解注⼊

@Autowired(构造,接⼝,⽅法)

⾃动装配,默认根据类型注⼊

—属性Required

1.@Autowired(required=true):当使⽤@Autowired注解的时候,其实默认就是@Autowired(required=true),表⽰注⼊的时候,该bean必

须存在,否则就会注⼊失败

2.@Autowired(required=false):表⽰忽略当前要注⼊的bean,如果有直接注⼊,没有跳过,不会报错。

3.required属性含义和@Required⼀样,只是@Required只适⽤于基于XML配置的setter注⼊⽅式,只能打在setting⽅法上。

public class AutowiredAction {

private String name;

private List list;

@Autowired

private AutowiredAction(String name) {

this.name=name;

}

public String getName() { return name;

}

@Autowired

public void setName(String name) {

this.name = name;

}

@Autowired(required = true)

private void initName(String name,List list) {

this.name = name;

this.list = list;

}

}

接⼝

public interface AutowiredIn {

@Autowired

void initName(String name,Integer age);

}

@Resource 默认按照名称装配

可以标注在字段或属性的setter⽅法上。默认按照字段的名称去Spring容器中找依赖对象,如果没有找到,退回到按照类型查找

如果配置了属性name

那么只能按照名称找依赖对象

public class ResourceAction {

@Resource(name="name")

private String name;

@Resource

private List list;

public String getName() {

return name;

}

@Resource

public void setName(String name) {

this.name = name;

}

public List getList() {

return list;

}

public void setList(List list) {

this.list = list;

}

}