原理:在标准的applicationContext.xml文件中配置<bean>标签,实现创建类对象操作
1.通过构造器注入
1.1无参构造
<!--如果配置的bean对象有无参构造,并且是一个简单属性类型,就可以直接通过这种方式注入-->
<bean id="userInfo" class="com.school.pojo.Users">
<property name="sex" value="男性"/>
</bean>
<!--当类中属性有另一个Bean类型时:要通过ref-->
<!--这两个实体类中没有属性,所以可以不要定义property-->
<bean id="userImpl1" class="com.school.dao.UserInfoImpl"/>
<bean id="userImpl2" class="com.school.dao.UserInfoImpl2"/>
<bean id="userService" class="com.school.service.UserServiceImpl">
<!--
ref: 装载复杂类型的数据,指定要实例化的类型,即引用Spring容器中已经创建好的对象
value: 简单的类型,就是要实例化属性具体的值
-->
<!--将userImpl1-->
<property name="ui" ref="userImpl2"/>
</bean>
1.2有参构造
<!--三种方式实现有参数构造注入-->
<!--为bean标签设置别名,只要添加一个name即可,在从Bean容器获取的时候用的就是id值-->
<bean id="bookInfo" class="com.school.pojo.Books" name="bookAll">
<!--方式1,构造函数参数类型匹配,不推荐,当一个类中存在相同属性时,要根据类中定义的顺序设置constructor-arg-->
<!--<constructor-arg type="int" value="1998"/>-->
<!--方式2,构造函数参数索引-->
<!--<constructor-arg index="0" value="1999"/>-->
<!--方式3,构造函数参数名称,推荐使用-->
<constructor-arg name="price" value="1990"/>
</bean>
2.通过set注入
2.1通过一个实体类声明不同类型的变量名(bean | ref | idref | list | set | map | props | value | null)
<bean id="book1" class="com.school.pojo.Books">
<!--有参构造的注入-->
<constructor-arg name="price" value="12"/>
</bean>
<!--将student中的所有属性注入-->
<bean id="student" class="com.school.pojo.Student">
<!--对应实体类private String name;-->
<property name="name" value="小金"/>
<!--对应实体类private Books book;-->
<property name="book" ref="book1"/>
<!--对应实体类private String[] id;-->
<property name="id">
<array>
<value>小红</value>
<value>小黄</value>
<value>小橙</value>
</array>
</property>
<!--对应实体类private Map<String,String> packages;-->
<property name="packages">
<map>
<entry key="键1" value="红"/>
<entry key="键2" value="橙"/>
<entry key="键3" value="黄"/>
</map>
</property>
<!--对应实体类private Set<String> stringSet;-->
<property name="stringSet">
<set>
<value>set1</value>
<value>set2</value>
<value>set3</value>
</set>
</property>
<!--对应实体类private Properties properties;-->
<property name="properties">
<props>
<prop key="driver">com.jdbc.mysql.Driver</prop>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
</bean>
3.通过其它方式注入
3.1带有p命名空间的注入(根据set属性)
<!--未设置P命名空间注入时xml配置文件-->
<bean id="classroom" class="com.school.pojo.Classroom">
<property name="name" value="1号教室"/>
<property name="id" value="101"/>
</bean>
<!--使用P命名空间注入时德xml配置文件,所谓P命空间就是property的缩写。先要在beans标签中加入xmlns:p="http://www.springframework.org/schema/p"-->
<!--使用P时要有无参构造函数,不然会报错-->
<bean id="classroom2" class="com.school.pojo.Classroom" p:id="102" p:name="2号教室"/>
3.2带有c命名空间的注入(根据构造函数)
<bean id="classroom" class="com.school.pojo.Classroom">
<property name="name" value="1号教室"/>
<property name="id" value="101"/>
</bean>
<!--使用C命名空间方式注入,C就是 constructor 的首字母缩写。先要在beans标签中加入xmlns:c="http://www.springframework.org/schema/c"-->
<!--使用C时要有全参构造函数,不然会报错-->
<!--例子:<bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
c:thingThree-ref="beanThree" c:email="something@somewhere.com"/>-->
<bean id="classroom3" class="com.school.pojo.Classroom" c:name="33号教室" c:id="133"/>
总结:这是一个基本的实现原理,也是今天学习的一些知识,写的时DI依赖注入的三种实现方式,还有一些东西没有细分,更详细的官方文档在一开始处指出,可以去那里查看。