概括
我们都知道spring
提供IOC
和DI
。IOC
很容易理解就是将对象的创建交给Spring去管理,而开发者只需要去使用,相对于之前的new
关键字创建对象。而直接去spring
容器中拿到对象更加方便且容易,而DI
就是依赖注入,每个对象都存在不同属性,这些属性可以是基本数据类型,也可以是对象,当对象的属性也是对象的时候,那么此时 如何给属性对象赋值呢?也就是如何DI
?spring
提供了3种方式
- 通过set方式
- 通过构造函数
- 通过注解
而这里我们就只说一下通过注解如何给属性对象赋值。
Autowrie
-
Autowire
是spring
提供的一个依赖注入的注解 ,该注解可以写在属性上面或set
方法上面用来给对象的属性赋值。常用来在service
层和controller
层注入mapper
和service
。那么Autowire
是如何工作的呢? -
在介绍
Autowire
之前,我们先来了解spring
中的bean
,我们都知道spring
中的对象默认都是单例的无论是@Component
或者@Bean
注解或者@Service
都是为了在spring
容器种加入注解的类。但是是否spring
中仅仅只有这一个对象呢?
当然不是!比如 当我们在service
层写上一个@Service
的时候 表示这个类会在spring
中生成一个单例的对象,并且会把这个对象放入单例池中,这个单例池就是一个concurrentHashMap
,其中key就是这个对象的名称(name),比如说@Service public UserServiceImpl implement IUserService{ //...实现方法 }
那么这时候的单例池就会存在key
为userServiceImpl
,值为类型(type) IUserService
的对象UserServiceImpl
,这里为什么标记为类型为IUserService
的对象?后面会说明。
- 现在我们模拟一个
Autowried
的使用方式,首先定义一个接口,接口名称为ITestService
public interface ITestService { void print(); } ```
再写一个实现该接口的实现类TestServiceImpl
@Service
public class TestServiceImpl implements ITestService {
@Override
public void print() {
System.out.println("testimpl");
}
}
再写一个测试类<