1.关系:
依赖注入是控制反转的基础
2.控制反转(IOC):
简写自Inversion of Control,那么,何为反转?在以前,对象的创建由自己把控(通过new()方式),使用完之后也是自己去销毁,这样就导致对象始终会与其他类耦合在一起;那么现在,有了Spring IOC,一个专门帮我们创建对象的容器,当我们需要某个对象时,不再需要自己动手去创建,而只需要告诉Spring IOC容器:我需要创建xxx对象,然后Spring就会帮我们创建好。组件对象的控制权由程序代码本身转移到了外部容器------这就是所谓的反转。
如何实现反转呢?这就要要说到依赖注入了。
3.依赖注入(DI)
简写自 Dependency Injection。依赖注入具体是怎么实现的呢,我所学习到的有这么三种方式:
(1)构造器注入
顾名思义,就是通过构造器方法来实现依赖的注入,想要完成注入,我们还要配置xml文件,当然光靠说可能还无法理解,真要搞懂还得靠代码:
package com.atxx.demo.entity;
public class Student{
private String name;
public Student(String name){
this.name=name;
}
}
然后,我们在xml里面配置这个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-3.0.xsd">
<bean id="computer" class="com.atxx.demo.entity.Student">
<constructor-arg value="小罗"></constructor-arg>
</bean>
</beans>
(2)属性注入/setter注入
通过setter方式注入我们需要在实体类中写出属性的setter()方法
package com.atxx.demo.entity;
public class Student {
private String name;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
添加setter方法之后,要再xml配置文件中声明
<?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-3.0.xsd">
<bean id="student" class="com.atxx.demo.entity.Student">
<property name="name" value="小罗"></property>
</bean>
</beans>
在这个xml文件中,我们相当于给实体类的属性赋了值,通过给property的name属性赋值,Spring就会通过id所对应类中的set方法,给类中属性赋值。这样我们就完成了属性注入。
(3)自动装配
使用注解
package com.atxx.demo.entity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Student{
@Autowired
private String name;
}
1.面使用的是@Autowired,在使用@Autowired注解之前需要在Spring配置文件进行配置,即手动配置了bean或者在类上添加了@Component注解。
2.@Autowired可以配合@Qualifier使用,使用注解@Qualifier可以指定要装配组件的id
3.另外,关于@Autowired,我们要清楚:@Autowired默认使用byType来装配属性,如果匹配到类型的多个实例,再通过byName来确定bean,自动装配如果找不到组件就会报NoSuchBeanDefinitionException,如果要允许null 值,可以使用@Autowired(required=false),来指定一个不存在的组件
也可以只用@Resource来完成自动装配,它默认按名称装配,只有当找不到与名称匹配的bean才会按照类型来装配注入
希望本文能对你有所帮助,如果有大佬发现有错误,还希望能帮我指出来!我及时纠正;或者有朋友能够补充的也可以提出来,大家一起学习,一起进步!