day120 - 依赖注入的几种方式
配置bean时为属性赋值
<bean id="studentTwo" class="com.gu.spring.pojo.Student"> <!-- property:根据成员变量的set方法进行赋值,set注入 name:设置需要赋值的属性名 value:设置指定属性值 --> <property name="sid" value="1001"></property> <property name="sname" value="张三"></property> <property name="age" value="23"></property> <property name="gender" value="男"></property> </bean>
test
@Test public void testDI(){ //获取ioc容器 ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml"); //获取bean Student studentTwo = ioc.getBean("studentSix", Student.class); System.out.println(studentTwo); // Object clazzInner = ioc.getBean("clazzInner", Clazz.class); // System.out.println(clazzInner); // Clazz clazzOne = ioc.getBean("clazzOne", Clazz.class); // System.out.println(clazzOne); }
构造器依赖注入
当实体类中添加的有有参构造时
可以在bean中使用<constructor-arg来进行配置
<bean id="studentThree" class="com.gu.spring.pojo.Student"> <constructor-arg value="1002"></constructor-arg> <constructor-arg value="李四"></constructor-arg> <constructor-arg value="24"></constructor-arg> <constructor-arg value="女"></constructor-arg> </bean>
注意:constructor-arg标签还有两个属性可以进一步描述构造器参数:
index属性:指定参数所在位置的索引(从0开始)
name属性:指定参数名
test
同上
依赖注入中的特殊值处理
null值
<property name="name"> <null /> </property>
注意:
value="null"代表值为字符串null
<bean class="com.gu.spring.pojo.Student" id="studentFour"> <!-- 特殊值: <: < >: > [CDATA[]]中的所有内容会被原样解析 CDATA是xml中一个特殊的标签,因此不能写在属性中,只能作为标签使用 --> <property name="sid" value="1003"></property> <property name="sname" value="lisi"></property> <property name="gender"> <value><![CDATA[ a>b ]]></value> </property> <property name="age" value="24"></property> </bean>
为类属性进行赋值
引用外部的已经声明的bean
<bean id="clazzOne" class="com.gu.spring.pojo.Clazz"> <property name="cid" value="1111"></property> <property name="cname" value="最强王者班"></property> <property name="students" ref="studentList"></property> </bean>
为类属性赋值已经声明的bean,注意使用ref标签
<bean id="studentFive" class="com.gu.spring.pojo.Student"> <property name="sid" value="1003"></property> <property name="sname" value="lisi"></property> <property name="age" value="23"></property> <property name="gender" value="男"></property> <!-- 引用ioc容器中某个bean的id --> <property name="clazz" ref="clazzOne"></property> </bean>
若将ref使用value:IllegalStateException:Cannot convert value of type 'java.lang.String' to required type
意思是不能把String类型转换成我们要的Clazz类型,说明我们使用value属性时,Spring只把这个属性看做一个普通的字符串,不会认为这是一个bean的id,更不会根据它去找到bean来赋值
内部bean
<bean id="studentFive" class="com.gu.spring.pojo.Student"> <property name="sid" value="1003"></property> <property name="sname" value="lisi"></property> <property name="age" value="23"></property> <property name="gender" value="男"></property> <property name="clazz"> <!-- 内部bean,只能在当前的bean内部使用,不能直接通过ioc容器获取 --> <bean id="clazzInner" class="com.gu.spring.pojo.Clazz"> <property name="cid" value="1111"></property> <property name="cname" value="最强王者班"></property> </bean> </property> </bean>
内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性
级联方式
<bean id="studentFive" class="com.gu.spring.pojo.Student"> <property name="sid" value="1003"></property> <property name="sname" value="lisi"></property> <property name="age" value="23"></property> <property name="gender" value="男"></property> <!-- 级联: 要保证提前对clazz属性赋值或者实例化 --> <property name="clazz" ref="clazzOne"></property> <property name="clazz.cid" value="2222"></property> <property name="clazz.cname" value="倔强青铜班"></property>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY