依赖注入(DI)入门
创建 UserService,UserService 内部在调用 UserDao的save() 方法
1
2
3
4
5
6
7
8public class UserServiceImpl implements UserService {
public void save() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
}
}将 UserServiceImpl 的创建权交给 Spring
1
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>
从 Spring 容器中获得 UserService 进行操作
1
2
3ApplicationContext applicationContext = new??ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();Bean的依赖注入
概念
- 依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。
- 在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
- IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。
- 那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。
- 简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取 。
注入方式
- 构造注入
- 设值注入
构造注入
创建有参构造
1 | public class UserServiceImpl implements UserService { |
配置Spring容器用有参构造时进行注入
1 | <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> |
设值注入
注入数据的三种数据类型
- 普通数据类型
- 引用数据类型
- 集合数据类型(List、Map、Properties)
在UserServiceImpl中添加setUserDao方法
1 | public class UserServiceImpl implements UserService { |
配置Spring容器调用set方法进行注入
1 | <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> |
要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is
测试pojo类 :
Address.java
1 | public class Address { |
Student.java
1 | package com.asher.pojo; |
常量注入
1
2
3<bean id="student" class="com.kuang.pojo.Student">
<property name="name" value="小明"/>
</bean>测试
1
2
3
4
5
6
7
8
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) context.getBean("student");
System.out.println(student.getName());
}Bean注入
注意点:这里的值是一个引用,ref。
1
2
3
4
5
6
7
8<bean id="addr" class="com.kuang.pojo.Address">
<property name="address" value="重庆"/>
</bean>
<bean id="student" class="com.kuang.pojo.Student">
<property name="name" value="小明"/>
<property name="address" ref="addr"/>
</bean>数组注入
1
2
3
4
5
6
7
8
9
10
11<bean id="student" class="com.kuang.pojo.Student">
<property name="name" value="小明"/>
<property name="address" ref="addr"/>
<property name="books">
<array>
<value>西游记</value>
<value>红楼梦</value>
<value>水浒传</value>
</array>
</property>
</bean>List注入
1
2
3
4
5
6
7<property name="hobbys">
<list>
<value>听歌</value>
<value>看电影</value>
<value>爬山</value>
</list>
</property>Map注入
1
2
3
4
5
6<property name="card">
<map>
<entry key="中国邮政" value="456456456465456"/>
<entry key="建设" value="1456682255511"/>
</map>
</property>set注入
1
2
3
4
5
6
7<property name="games">
<set>
<value>LOL</value>
<value>BOB</value>
<value>COC</value>
</set>
</property>Null注入
1
<property name="wife"><null/></property>
Properties注入
1
2
3
4
5
6
7<property name="info">
<props>
<prop key="学号">20190604</prop>
<prop key="性别">男</prop>
<prop key="姓名">小明</prop>
</props>
</property>测试结果
p命名和c命名注入
P命名空间注入
P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,简化property name=”userDao”为p:userDao主要体现在配置文件中,如下:
首先,需要引入P命名空间
1 | xmlns:p="http://www.springframework.org/schema/p" |
其次,需要修改注入方式
1 | <bean id="userService" class="com.itheima.service.impl.UserServiceImpl" p:userDao ref="userDao"/> |
C命名空间注入
本质是构造注入
首先,需要引入P命名空间
1 | xmlns:p="http://www.springframework.org/schema/c" |
其次,需要修改注入方式
1 | <bean id="user" class="com.asher.pojo.User" c:name="Asher" c:age="18"/> |
发现问题:爆红了,刚才我们没有写有参构造!
解决:把有参构造器加上,这里也能知道,c 就是所谓的构造器注入!
测试代码:
1 |
|