1.什么是依赖注入
Spring中的IOC是创建对象,但是这个对象是没有初值的。那么要怎么为对象赋初值呢?
Spring中的依赖注入DI就解决了这个问题。
详细概念请参考百度百科--->依赖注入
2.依赖注入的类型有哪些?
基本数据类型, 字符串类型,引用类型,集合类型。
3.如何实现对象属性值的注入?
(1)首先需要有一个类供spring容器创建对象,同时这个类要求有set()方法
可以通过lombok插件,使用注解完成get、set方法和构造方法的自动生成
@Data
@NoArgsConstructor
@AllArgsConstructor
public class People {
private String name;
private int age;
private IDCard idCard;
private List<String> hobby;
private String[] sex;
private Set<String> set;
private Map<String,String> map;
public void show(){
System.out.println("-----------");
}
}
当然也可以自己编写get、set方法。
(2)在spring配置文件中的<bean></bean>标签内编写属性值(基本类型属性的赋值)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--spring容器会帮你创建该bean的对象-->
<bean id="student01" class="com.zjw.demo.People">
<!--property:表示为类中属性注入值,调用的为set方法
name:表示属性名
value:注入基本类和字符串类型时使用value
-->
<property name="name" value="张三"/>
<property name="age" value="15"/>
</bean>
</beans>
(3)引用类型的属性赋值
list集合属性注入
<property name="hobby">
<list>
<value>打游戏</value>
<value>打篮球</value>
<value>看美女</value>
</list>
</property>
数组类型属性注入
<property name="sex">
<array>
<value>男</value>
<value>女</value>
<value>未知</value>
</array>
</property>
map类型属性注入
<property name="map">
<map>
<entry key="name" value="神里"/>
<entry key="age" value="23"/>
<entry key="sex" value="女"/>
</map>
</property>
set类型属性注入
<property name="set">
<set>
<value>蒙德</value>
<value>稻妻</value>
<value>璃玥</value>
<value>须弥</value>
</set>
</property>
对象类型属性注入
<!--此处的值不再使用value了,而是ref表示引用某个对象的id-->
<property name="idCard" ref="idcard01"/>
<!--被引用的对象,也要交予spring容器进行创建-->
<bean id="idcard01" class="com.zjw.demo.IDCard">
<property name="idNum" value="100001"/>
</bean>
4.自动注入
除了通过以上配置文件,spring也可以实现自动注入。
(这句话可能有问题,毕竟我还很菜,这个是我自己的理解)这个注入主要针对于对象类型的属性,对于基本类型和set、list等类型而言,注入的也是默认值,与不注入没什么区别。
这两种属性值是最常用的属性值,更多的关于autowire属性值的内容请参考autowire属性
<!--
通过autowire属性可以实现自动注入,
autowire属性值有:
no:不自动注入;
byname:通过名字自动注入
bytype:通过类型自动注入
-->
<bean id="user" class="com.zjw.dao03.User" autowire="byType">
</bean>
<bean id="idcard01" class="com.zjw.dao03.IDCard">
<property name="idNum" value="100001"/>
</bean>
5.使用注解完成IOC和DI功能
(1)配置包扫描
<context:component-scan base-package="com.zjw"/>
(2)创建controller
@Controller
public class UserController {
@Autowired //该注解默认按类型自动注入,如需指定,则需要配合Qualifier注解使用
@Qualifier(value = "userDao")
private IUserService userDao;
public void show(){
userDao.show();
}
}
(3)service接口和dao实现类
@Service
public interface IUserService {
void show();
}
@Repository
public class UserDao implements IUserService {
public void show(){
System.out.println("userDao的show方法!");
}
}
以上就是通过注解的方式实现了IOC以及DI
注意:
@Controller、@Respository、@Service、@Component
没有区别: 他们的底层都是用的@Component
实际意思就在于区分层的。
@Controller控制层
@Respository持久化层
@Service 业务层
@Component 最底层的bean注解。