spring构造器注入

本文详细介绍了Spring构造器注入的使用方法,包括如何声明简单bean、实现角色bean及用户bean的注入,并通过示例展示了如何在实际开发中灵活运用构造器注入。重点讨论了构造器注入的优点与局限性,提供了在不同场景下的应用建议。

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

spring set注入请看:http://blog.youkuaiyun.com/luckey_zh/article/details/46674113

一、声明一个简单的bean

直接来个角色bean

public class Roles {
	private int id;
	private String roleName;
	
	public Roles() {
	}
	public Roles(int id,String roleName) {
		this.id=id;
		this.roleName = roleName;
	}
	@Override
	public String toString() {
		return "Users [id=" + id + ", name=" + roleName + "]";
	}
}
spring配置
	<bean id="roles" class="cn.com.ztz.spring.model.Roles">
		<constructor-arg value="1"/>
		<constructor-arg value="管理员"/>
	</bean>

在运行我们的测试方法

public class SpringTest {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		Roles u = (Roles)context.getBean("roles");
		System.out.println(u.toString());
	}
}

得到的结果是:

Users [id=1, name=管理员]


我们可以看出来,我没有是去实例化Roles,也没有set方法。实际上spring给我们去实例化了,<constructor-arg/>给我们bean赋值了。

在实际开发中,角色下面肯定会有用户,现在我们引入用户bean

public class Roles {
	private int id;
	private String roleName;
	//用户
	private Users users;
	
	public Roles() {
	}
	public Roles(int id,String roleName,Users users) {
		this.id=id;
		this.roleName = roleName;
		this.users=users;
	}
	//重写toString方法,方便测试
	@Override
	public String toString() {
		return "Roles [id=" + id + ", roleName=" + roleName + ", users="
				+ users + "]";
	}
}
用户bean

public class Users {
	private int id;
	private String name;
	public Users(){
		
	}
	public Users(int id, String name) {
		this.id = id;
		this.name = name;
	}
	@Override
	public String toString() {
		return "Users [id=" + id + ", name=" + name + "]";
	}
}

spring配置

	<bean id="roles" class="cn.com.ztz.spring.model.Roles">
		<constructor-arg value="1"/>
		<constructor-arg value="管理员"/>
		<constructor-arg ref="users"/>
	</bean>
	<bean id="users" class="cn.com.ztz.spring.model.Users">
		<constructor-arg value="2"/>
		<constructor-arg value="张三"/>
	</bean>

运行测试方法,得到结果:

Roles [id=1, roleName=管理员, users=Users [id=2, name=张三]]


下面这个在Roles里面引入Users,在spring里面就要用<constructor-arg ref="users"/>去关联Users。

总结:构造器注入虽然很方便,但是在开发中有很多弊端,比如我不想注入某个字段,怎么办。所以,在用的时候看业务在去用具体方法。


博主表述不太好,见谅



### 如何在Spring中实现构造器注入Spring框架中,构造器注入是一种常用的依赖注入方式。通过这种方式,可以确保对象在其生命周期内不可变,并且强制执行所需的依赖项。 #### 构造器注入的基础概念 当类只有一个带参数的构造方法时,Spring会自动将其用于依赖注入[^1]。如果存在多个具有相同数量参数的构造函数,则可能会引发构造函数注入类型的歧义问题[^2]。这是因为Spring无法明确区分哪个构造函数应该被调用[^4]。 #### 示例代码展示 下面是一个简单的例子来说明如何使用构造器注入: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyService { private final AnotherService anotherService; // 单一构造函数,Spring 将自动注入 AnotherService 的实例 @Autowired public MyService(AnotherService anotherService) { this.anotherService = anotherService; } public void performAction() { System.out.println("Performing action using " + anotherService); } } ``` 在这个例子中,`MyService` 类有一个带有 `AnotherService` 参数的单一构造函数。由于这是唯一的构造函数,Spring 容器会在创建 `MyService` 实例时自动注入 `AnotherService` 的实例。 #### 多个构造函数的情况处理 如果有多个构造函数,可以通过指定 `@Autowired` 注解以及提供更具体的类型提示来解决潜在的模糊性问题。例如: ```java import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component public class ComplexService { private final AnotherService serviceA; private final YetAnotherService serviceB; // 提供两个构造函数并标注其中一个为主构造函数 @Autowired public ComplexService(@Qualifier("serviceA") AnotherService serviceA, YetAnotherService serviceB) { this.serviceA = serviceA; this.serviceB = serviceB; } public void doSomethingComplex() { System.out.println("Using services: " + serviceA + ", " + serviceB); } // 辅助构造函数不会被 Spring 自动选择 public ComplexService(YetAnotherService serviceB) { this(null, serviceB); } } ``` 这里展示了两种不同的构造函数定义情况下的解决方案。主要依靠的是 `@Qualifier` 和其他类似的注解工具帮助消除可能存在的二义性[^3]。 #### 结合Lombok简化开发过程 为了进一步减少样板代码量,可以考虑结合 Lombok 库中的 `@RequiredArgsConstructor` 注解一起使用。这不仅能够自动生成必要的构造函数,还能保持代码简洁明了。 ```java import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor public class SimplifiedService { private final AnotherService anotherService; public void simpleOperation() { System.out.println("Executing operation via dependency injected by constructor."); } } ``` 在这种情况下,无需手动编写任何构造函数声明,因为它们会被 Lombok 自动生成出来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值