控制反转(IoC)简介
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。
简单来说控制依赖注入出现之前对象实例是由程序猿自己new的,如果对象之间的依赖关系复杂,相当费事费力,于是IOC应运而生,把对象交给spring来管理,由Spring IoC容器来帮我们new出对象实例,利用反射加工厂的方式。
使用方式
Spring IoC容器注册
注解注入在 XML 注入之前执行。因此,如果两者之间存在差异,那么最终应用的依赖注入将基于 XML 配置中的设置。。
1.通过注解注册
@Component 最普通的组件,可以被注入到Spring IoC容器进行管理
@Repository 作用于持久层
@Service 作用于业务逻辑层
以上三个注解都可以用
public interface Animal {
void eat();
}
@Component
public class Cat implements Animal{
@Override
public void eat(){
System.out.println("猫吃");
}
}
2.配置类注册
以下会把Play注册到Spring IoC容器中
@Configuration
public class PlayConfig {
@Bean
public Play play(Dog dog, Cat cat, @Qualifier("dog")Animal animal) {
animal.eat();
return new Play(dog, cat);
}
}
注意:
配置类中对应的方法的参数,只要是容器中的,都会按照类型自动注入,如果存在相同类型的多个类,会报错,解决办法为:对应参数加Qualifier参数指定类型或者在某个实现类上加@Primary表示默认首选
如果参数列表是List接口类型,Spring会自动注入所有该接口的实现类;Map类型参数也会得到类似的处理
依赖注入
1.注入
@Autowired
@Resource
两种方式区别:
依赖查找顺序:
@Resource
: 默认的注入顺序是按照Bean的名称进行匹配,如果找不到,则会按照类型进行匹配。如果仍然找不到,将不会抛出异常,而是返回null
。@Autowired
: Spring容器在解析@Autowired
注解时,首先会按照类型进行匹配,如果存在多个相同类型的Bean,则会进一步根据名称进行匹配。如果没有用@Qualifier明确指定名称,Spring将抛出异常。
来源:@Autowire是依赖于Spring的,而@Resourse是基于java的
以下两种引用依赖的方式是等同的,一般比较推荐使用@Resource
@Resource(name = "cat")
private Animal cat;
@Autowired
@Qualifier(value = "cat")
private Animal cat1;
void eat(){
cat.eat();
cat1.eat();
}
2.使用注意事项
如果一个类依赖于被Spring IoC容器管理的Bean,那么这个类就不能自己通过new来创建,否则会找不到被注入的类
public class Home {
@Resource
private Dog dog;
public void play(){
dog.play();
}
}
@Test
void play() {
Home home = new Home();
home.play();
}
直接调用的话Home.dog为空