Spring框架 DI

DI(Dependency Injection)

1)、功能
DI同于IOC,当一个类需要依赖另一个类对象时,把另一个类对象赋值这个类对象的过程,即为依赖注入

2)、实现
在<property>元素中进行赋值时,使用ref引用另一个对象的bean id

<!-- DI(对象引用) -->
<property name="theTest" ref="DefaultTest"></property>

自动注入

1)、前提
Spring配置文件中,对象属性名name和引用时的bean id相同

2)、实现
在引用对象中被bean元素中,添加属性autowire(五个值):
①no:不注入
②default :默认值,来源于根元素属性default-autowire="",两者都默认时都为no
③byName:容器中找其他和属性名对应的bean id

<!--被引用的类-->
<bean id="myTest" class="com.mfqh.pojo.Test">
    	 <constructor-arg name="index" value="10"></constructor-arg>
     	<constructor-arg name="data"  value="abc"></constructor-arg>
</bean>
<!--引用类-->
<bean id="testDI" class="com.mfqh.pojo.TestDI" autowire="byName"></bean>

测试:
在这里插入图片描述
④byType:容器中找其他和属性类型对应的class
有一种特殊情况:类中有多个属性是同一种类类型

//若在TestDI中设置两个属性(是同一个类的两个不同对象):
private Test myTest;
 private Test myTest01;
<!--把注入类型改为byType-->
<bean id="testDI" class="com.mfqh.pojo.TestDI" autowire="byType"></bean>

结果:
在这里插入图片描述
发现此时类中的两个属性是对同一个对象的引用,考虑到有可能是Spring容器管理对象默认单例的原因
于是,修改被引用对象scope=“prototype",即多例:
在这里插入图片描述
所以可以根据byType类型给同一类型的多个属性注入

⑤constructor:需在类中提供构造方法,且方法形参名必须和bean id相同,(实质通过byName寻找)

Tips:根元素属性default-autowire="",可以配置当前文件全局默认注入方式
在这里插入图片描述

软编码加载(.properties文件)

将一些信息提取到文件中,方便部署
①添加xmlns:context和xsi:schemaLocation

xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
		   https://www.springframework.org/schema/context/spring-context.xsd"

②加载文件:
<context:property-placeholder location="classpath:文件路径,classpath: "/>
Ps:classpath是定位到src下
会将文件信息交给Spring容器进行管理

③配置文件中使用${key}进行提取
如:

<bean id="testPro" class="com.mfqh.pojo.TestProperties">
     	<property name="name" value="${peo.name}"/>
     	<property name="age" value="${peo.age}"/>
     	<property name="sex" value="${peo.sex}"/>
</bean>

Tips:在类中属性前使用注解@Value("${key}),即可获取到信息,记得需扫描注解
Ps,自动注入的级别较高:先寻找需要注入的类进行实例化,使用时不会加载到文件信息
因此,对于需要加载文件信息的bean,在被引用时,不能使用自动注入(或替换为value,不使用注入)

发布了82 篇原创文章 · 获赞 1 · 访问量 1452

猜你喜欢

转载自blog.csdn.net/qq_41891805/article/details/105155609