目录
1.IoC容器
2.依赖注入
1.IoC容器
IOC: Inversion of Control,是一种设计思想。
在spring框架中,Spring 通过IoC容器进行管理所有Java对象的实例化和初始化,控制对象与对象之间的依赖关系。
IoC管理的对象称为Bean,它与使用关键字new创建的java对象没有区别。所以我们可以理解为,IoC就是帮助我们将java对象的创建、管理及对象和对象之间的维护权交由spring框架进行负责。
IOC容器中使用map集合(map<String,Object>类型)存放Bean对象。
下面是IoC容器创建Bean的过程:
简单来说就是通过注解或是xml文件的形式,定义Bean的相关信息(如id、name之类的) ,然后通过相关抽象工具类(BeanDefinitionReader)读取Bean的定义信息,存入IoC容器中,IoC容器通过BeanFactory和反射的机制,使用Bean的定义信息对Bean进行实例化,然后初始化对象,最终化为最终对象。
2.依赖注入
依赖注入:指在Spring创建对象的过程中,将对象依赖属性通过配置进行注入(类似于一个实体类Student中的属性包含另一个定义好的实体类Person,Person类就是注入到的Student中的类)。
依赖注入是对IoC的具体实现。
Spring中我们一般使用两个注解进行依赖注入:
- 1、@Autowired
- 2、@Resource
@Autowired注解:根据类型进行装配。主要有以下4种注入方式,其中,属性注入为最常用的注入方式:
//属性注入
@Autowired
private UserDao userDao;
//set注入
private UserDao userDao;
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
//构造注入1
private UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao){
this.userDao = userDao;
}
//构造注入2
private UserDao userDao;
public UserServiceImpl(@Autowired UserDao userDao){
this.userDao = userDao;
}
上述代码皆为在ServiceImpl类中注入Dao类代码。需要注意的是, 如果只有一个有参构造方法时,@Autowired注解可以省略。即上述构造注入1、2中@Autowired注解都可以省略。
如果一个类型下有两个实现类,@Autowired注解无法正常根据类型进行注入,此时我们需要使用@Qualifier注解指定Bean的名称。
@Resource注解:根据名称进行装配,未指定name时,使用属性名作为name并根据属性名称进行注入,当name找不到时,会自动根据类型进行装配。
//无指定名称,根据类型注入
@Resource
private UserService userService;
//根据属性名称注入
@Resource
private UserService myUserService;
//根据指定名称注入
@Resource(name = "myUserService")
private UserService userService;
区别:@Resource注解是JDK拓展包中的注解,更具有通用性;@Auotwired是spring中的注解。@Resource只能使用在属性及set方法上。