spring注入方式之construct方式注入

被注入的类必须存在一个无参构造函数(按参数顺序和按参数类型两种方式)
Dao
public class PersonDao {
	private Integer age;
	private String name;
	
	public PersonDao() {

	}
	/**
	 * 如果是按照参数顺序来注入,那么可以在<constructor-arg index="1">中设置index来区分以下两个构造函数
	 * 
	 * 如果是按参数类型来注入,那么以下两个构造函数谁在前面就执行哪个
	 * 
	 * 注意:如果参数是int类型,<constructor-arg  type="java.lang.Integer">会出异常
	 */
	public PersonDao(String name,Integer age) {
		System.out.println("name,age");
		this.age = age;
		this.name = name;
	}

	public PersonDao(Integer age, String name) {
		System.out.println("age,name");
		this.age = age;
		this.name = name;
	}

	public String toString() {
		return "PersonDao [age=" + age + ", name=" + name + "]";
	}
	
}

applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
							http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	<!-- 构造方法注入之参数顺序注入 
	<bean id="personDao" class="com.xxc.iocc.construct.dao.PersonDao">
		<constructor-arg index="1">
			<value>zhang</value>
		</constructor-arg>
		<constructor-arg index="0">
			<value>2</value>
		</constructor-arg>
	</bean>-->
	
	 <!-- 构造方法注入之参数类型注入 -->
	 <bean id="personDao" class="com.xxc.iocc.construct.dao.PersonDao">
		 <constructor-arg  type="java.lang.String">
            <value>zhang</value>
         </constructor-arg>
         
       <constructor-arg  type="java.lang.Integer">
            <value>123</value>
         </constructor-arg>
	</bean>
</beans>

测试类
public class Test {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("com/xxc/iocc/construct/applicationContext.xml");
		PersonDao personDao = (PersonDao)ac.getBean("personDao");
		System.out.println(personDao.toString());
	}
}


### 依赖注入的概念与用法 依赖注入(Dependency Injection, DI)是一种设计模式,用于减少代码中的耦合度。通过将依赖项从外部注入到对象中,而不是由对象自身负责创建这些依赖项,DI 提高了代码的可维护性、可测试性和灵活性[^4]。 #### 核心概念 依赖注入的核心思想是“获得依赖对象的过程被反转了”。在传统的编程方式中,对象会自行创建或查找其所需的依赖项;而在依赖注入中,这些依赖项由外部容器提供并注入到对象中[^4]。 依赖注入的主要形式包括: 1. **构造注入Constructor Injection)**:通过构造函数传递依赖项。 2. **设值方法注入(Setter Injection)**:通过公共的设值方法设置依赖项。 3. **接口注入(Interface Injection)**:通过实现特定接口来定义和注入依赖项[^2]。 #### 使用场景 依赖注入广泛应用于现代应用程序开发中,尤其是在框架如 Spring、ASP.NET Core 和 Jakarta EE 中。它通过解耦组件之间的依赖关系,使得系统更加灵活和易于测试[^3]。 --- ### 示例说明 以下是一个基于 TypeScript 的依赖注入简单实现示例: #### 定义依赖注入装饰器 ```typescript import { MetaData } from "./MetaData"; import * as crypto from "crypto"; export default function InjectionDependency(alias?: string) { return function (target: any) { const proxy = new Proxy(target, { construct: (target: any, args: any) => { let service = new target(...args); let name = target.name || "injection"; let key = `${name}:${crypto.randomBytes(16).toString("hex")}`; Reflect.defineMetadata(MetaData.InjectionUniqueKey, key, target); // 注入至容器内 let CONTAINERS: Map<string, any> = Reflect.getMetadata(MetaData.CONTAINERS, global); if (!CONTAINERS) { CONTAINERS = new Map<string, any>(); Reflect.defineMetadata(MetaData.CONTAINERS, CONTAINERS, global); } CONTAINERS.set(key, service); if (!!alias) { CONTAINERS.set(alias, service); } return service; }, }); proxy[MetaData.TARGET] = target; return proxy; }; } ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值