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容器进行管理
Ps:也可使用org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
其属性location,值为properties文件所在路径
来加载文件
③配置文件中使用${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,不使用注入)