Spring IOC
IOC(Inversion of Controller),即控制反转。将对象的控制由自己控制转交于容器控制。传统是使用 new关键词来主动创建对象的,而在Spring中,是使用IOC容器来创建和管理对象的。我们把对象存储在IOC容器中,需要什么对象直接描述给容器,容器会将我们需要的对象创建好直接注入到代码中,而且也会将对象所需的外部资源(例如存在依赖关系的对象、常量数据)也注入到代码中。所以IOC模式也可描述为DI(Dependency Injeciton,依赖注入)。
Spring IOC用途:
管理对象,包括创建对象、发布对象、销毁对象等整个生命周期;
查询对象的依赖关系,注入依赖对象。
当多个对象需要创建,对象之间存在依赖关系,使用IOC容易管理对象可以降低对象间的耦合度,开源人员代码维护变得更加容易。
Spring Boot Bean初始化
IOC容器中的Bean初始化过程如下图:

1. Bean定义的定位,Bean可能定义在XML中,或者一个注解,或者其他形式。这些都被用Resource来定位, 读取Resource获取BeanDefinition注册到Bean定义注册表中。
2. 第一次向容器getBean操作会触发Bean的创建过程,实列化一个Bean时,根据BeanDefinition中类信息等实列化Bean。
3. 将实列化的Bean放到单列Bean缓存内。
4. 此后再次获取向容器getBean就会从缓存中获取。
Spring Boot IOC使用
Spring Boot中许多注解会注册Bean到IOC容器中, 如@Component、@Service、@Controller、@Repository、@Bean等等。使用Bean时只需要@Autowired修饰即可。
Bean注入相关注解:
@Configuration:代表这是一个Java的配置文件,Spring的容器会根据它来生成IOC容器去装配Bean。
@Bean:代表将方法返回的POJO装配到IOC容器中,属性name定义这个Bean的名称,如果没有配置则将方法名称作为Bean的名称保存到IoC容器。
@Value:指定具体的值,使得Spring IOC给对应的属性注入对应的值。
@Component:表明该类会被Spring IOC容器扫描装配,指定的名称是该Bean 的名称,如果不指定该类第一个字母小写作为该Bean的名称。
@ComponentScan:如果不指定包名,则只会扫描@Configuration所在的包下的Bean。如果指定包名,则扫描指定包名下的所有Bean。
@Service:业务层的Bean,指定名称则以该名称作为Bean的名称,否则以第一个字母小写作的类名为该Bean的名称。
@Autowired:自动注入。根据属性的类型找到对应的Bean进行注入。如果对应类型的Bean不是唯一的会根据属性名称和Bean的名称进行匹配。设置@Autowired的属性required为false时如果找不到匹配的Bean,允许设置为null而不抛出异常。
使用样例如下:
定义Service:
@Servicepublic class UserService {public String getName() {return "i am HelloCTO";}}
使用对象:
@Autowiredprivate UserService userService ;@RequestMapping(path = {"/username"})public String getUserName() {return userService.getName();}
参考:
https://www.jianshu.com/p/4a60020838d3
https://www.jianshu.com/p/93874bb2844d




