请简述什么是spring的ioc和di_Spring中的IOC和DI

一、IOC介绍

IoC(Inverse of Control:控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。

IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。

二、IOC的优点

1、对象的创建销毁的生命周期交由iOC管理、大大降低了代码的耦合性。

三、@Configuration @Bean的简单使用

2、@Configuration 代表这是一个java配置文件,Spring的容器会根据它来生成IOC容器去装配Bean

3、@Bean 代表将initUser方法返回的POJO装配到IOC容器中,而其属性name定义这个bean的名称,如果没有配置它,则将方法名称"initUser"作为Bean的名称装配到Spring IOC容器中。

4、使用实例:

5、@Component表示这个类将会被SpringIOC容器扫描装配。

6、@ComponentScan扫描指定包

7、@Component 和 @Bean 的区别是什么?

8、作用对象不同: @Component注解作用于类,而@Bean注解作用于方法

三、依赖注入(Dependency Injection)

1、依赖注入就是将实例变量传入到一个对象中去。(Dependency injection means giving an object its instance variables)

@Autowired

它会根据属性的类型(by type)找到对应对的Bean进行注入。

如上,spring容器会通过注解@Autowired将Dog注入到BussinessPerson实例中

Q:但是,加入又有一个动物类cat,那么它会选择哪个注入?怎么解决这个错误?

A: 因为 @Autowired首先会根据类型找到对应的Bean,如果类型不是唯一的,那么它会根据其属性名称和Bean的名称进行匹配。如果匹配得上,就用该Bean,如果还是无法匹配就会抛出异常。

因为将animal修改为了dog,所以它会找到dog类

注:

因为@Autowired是一个默认必须要找到对应Bean的注解,所以如果不能确定其标注属性是否存在,或者允许这个被标注的属性为null。则可以配置@Autowired属性required为false。@Autowired(required =false)

它除了可以标注属性外还可以标注方法。甚至还可以使用在方法参数上

它会使用setAnimal方法从IOC容器中找到对应的动物进行注入。

2.@Primary和@Quelifier

@Primary:它是一个修改优先权的注解,比如上面的例子,当我们有猫有狗时,假设这次使用猫,name只需要在猫类的定义上加入@Primary就可以了

这里的@Primary的含义告诉SpringIOC容器,当发现有多个同类型的Bean时,请优先使用我进行注入.

Q: 如果@Primary作用在多个类上,其结果是IOC容器还是无法区分采用哪个Bean的实例进行注入,那么该采取什么样的情况呢?

A: 可以使用@Quelifier结合@Autowired一起使用,则可以通过类型和名称一起查找Bean。

通过上面的代码,即使cat已经标注了@Primary,但是我们还是可以拿到dog提供服务。

3.带参数的构造方法实现注入

上面取消了对animal的@Autowired注解而是在构造参数中加入了@Autowired@Quelifier注解

你可能感兴趣的:(请简述什么是spring的ioc和di_Spring中的IOC和DI)