java注入_Java依赖注入的三种方式

本文详细介绍了Spring框架中依赖注入(DI)的三种常见方式:构造方法注入、setter注入以及基于@Autowired注解的自动装配。讲解了它们的使用场景、优缺点和配置方法,确保读者理解如何在实际项目中有效应用这些技术。

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

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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值