Spring学习总结(DI依赖注入)
一、DI依赖注入
Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,set方式注入,拓展方式注入(p命令和c命令空间)。
1.1 构造方法注入
上一章已经讲过了,包括有参构造以及无参构造方式。
1.2 set方式注入(重点)
- 依赖:bean对象的创建依赖于容器。
- 注入:bean对象中的所有属性,由容器注入。
【环境搭建】
- 创建Address和Student实体类,创建多种复杂类型
//Address
private String address;
//Student
private String name;//String类型
private Address address;//应用类型
private String[] books;//数组
private List<String> hobbys;//List集合
private Map<String,String> card;//Map集合
private Set<String> games;//Set集合
private String wife;//空值
private Properties info;//配置类
- applicationContext.xml配置文件(常用的是第一个和第二个,其他了解即可)
<bean id="address" class="com.dmj.entity.Address">
<property name="address" value="花果山水帘洞"/>
</bean>
<bean id="student" class="com.dmj.entity.Student">
<!--第一个:普通值,使用value-->
<property name="name" value="孙悟空"/>
<!--第二个:bean,使用ref-->
<property name="address" ref="address"/>
<!--第三个:数组-->
<property name="books">
<array>
<value>西游记</value>
<value>水浒传</value>
<value>红楼梦</value>
<value>三国演义</value>
</array>
</property>
<!--第四个:list-->
<property name="hobbys">
<list>
<value>听歌</value>
<value>看电影</value>
</list>
</property>
<!--第五个:map-->
<property name="card">
<map>
<entry key="身份证" value="111111111111111111"/>
<entry key="银行卡" value="222222222222222222"/>
</map>
</property>
<!--第六个:set-->
<property name="games">
<set>
<value>王者荣耀</value>
<value>和平精英</value>
</set>
</property>
<!--第七个:null-->
<property name="wife">
<null/>
</property>
<!--第八个:配置类类型-->
<property name="info">
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
- 测试类
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) context.getBean("student");
System.out.println(student.toString());
}
}
- 运行结果
1.3 拓展方式注入
我们可以使用p命名空间和c命名空间方式进行注入,但是不能直接使用,前提得导入xml约束:
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
- User实体类。注意:创建无参构造以及有参构造
private String name;
private int age;
- applicationContext.xml配置文件
<!--p命名空间注入,可以直接注入属性的值:代替property-->
<bean id="user1" class="com.dmj.entity.User" p:name="猪八戒" p:age="18"/>
<!--c命名空间注入,通过构造器注入:代替construct-args-->
<bean id="user2" class="com.dmj.entity.User" c:name="沙悟净" c:age="20"/>
- 测试类
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user1");
System.out.println(user);
}
}
- 运行结果