暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Boot IOC

架构师成长 2020-06-02
1333

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:

@Service
public class UserService {
public String getName() {
return "i am HelloCTO";
}
}

使用对象:

@Autowired
private UserService userService ;


@RequestMapping(path = {"/username"})
public String getUserName() {
return userService.getName();
}


参考:

https://www.jianshu.com/p/4a60020838d3

https://www.jianshu.com/p/93874bb2844d


文章转载自架构师成长,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论