spring IOC控制反转原理详解

 更新时间:2022年03月07日 15:42:40   作者:ZJH'blog  
这篇文章主要为大家详细介绍了spring IOC控制反转原理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

IOC概念

  • 定义:控制反转,把对象的创建和调用(传统方式是通过new之后直接使用对象),交给Spring进行管理(依靠对象工厂通过注入的方式获取对象)
  • 降低耦合度
  • 底层原理:xml解析、工厂模式、反射

参考

补:工厂模式和单例模式区别

单例模式(懒汉式,饿汉式)都只能创建一个指定类的唯一对象

工厂模式(一个接口,多态性的体现)可以创建该接口的工厂下的所有类的唯一对象

IOC接口——实现IOC容器

IOC容器可以有多个,new几个就有几个IOC容器,一个容器绑定一个xml文件,一个xml中可以配置多个bean,容器可以关闭

1.BeanFactory

  • Spring的内部接口,不建议开发者使用
  • 懒汉式,加载配置文件的时候不创建对象

2.ApplicationContext

  • BeanFactory的子接口
  • 功能更强大,建议开发者使用
  • 饿汉式,加载配置文件即创建对象
  • 由于创建对象会耗费时间和资源,因此饿汉式可以把时间开销放在项目启动时

第三个是基于注解的获取容器方式,利用反射而非解析xml配置

SpringBoot中获取ApplicationContext的三种方式

1.@Autowired: 在任意被spring托管的类中注入

2.ApplicationContextAware接口:实现这个接口可以在普通类中获取Spring的IOC容器

IOC操作管理Bean

xml配置bean

在bean.xml中配置了bean的属性后,先解析xml得到IOC接口对象(IOC容器),然后通过容器来getBean,获得对象

同时,ApplicationContext也可以换成其父接口BeanFactory,结果不受影响

DI:依赖注入(注入属性)

两种方法

set方法+property

有参构造+constructor

 工厂Bean和普通Bean

注解配置bean

注册Bean

以下5个注解都可以创建Bean对象交给Spring的IOC容器进行管理

  • @Component:以下4个的元注解
  • @Service
  • @Controller
  • @Repository
  • @Configuration

因为元注解Component可以指定value=“别名”,所以以上5种注册Bean的方式都可以起别名,一个接口多个实现类Bean的情况需要起别名,否则Spring无法判断获取哪个Bean

使用Bean

  • @Autowired:根据自动装配
  • @Qualifier:根据别名装配,要和@Autowired搭配使用
  • @Resource:即可根据类也可根据别名
  • @Value:注入普通类型属性

两个String实现Bean,起别名

Bean的配置

作用域:如何设置bean的单例or多例

scope属性值:(常用singleton和prototype)

  • singleton:默认值,单例对象,饿汉式
  • prototype:多实例对象,懒汉式
  • request请求、session会话:不常用

在bean.xml中或者@Bean(scope="")中配置

生命周期:创建到销毁

1.无参构造

2.调用set方法解析配置

3.调用bean的初始化方法

如果有配置了初始化方法,需要配置init-method=“初始化方法的名称”

例如:在@Bean(initmethod=“xxx方法”)

4.获取bean并使用

注解方法可以直接@Autowired注入bean,配置xml的方式通过

new ClassPathXmlApplicationContext(xxxx.xml)解析并获取IOC容器之后getBean

5.bean的销毁与销毁时方法

springboot中的bean创建与销毁

销毁方法的配置@Bean(destroyMethod = “xxxxx”)

如果是配置在xml中,则

<bean id="  " class="   " destroy-method="   "></bean>

xml配置的Bean的关闭:关闭IOC容器即可

Bean扫描

spring中xml配置

spring和springboot中的注解配置

@ComponentScan

  • 被Component及其子注解标注的Bean需要用ComponentScan扫描到才能使用
  • SpringBootApplication启动类包括了@ComponentScan
  • @ComponentScan默认扫描该类包下的所有Bean
  • @ComponentScan可以自定义basePackages、includeFilters、excludeFilters

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!    

相关文章

  • Spring Security配置保姆级教程

    Spring Security配置保姆级教程

    Spring Security是一个功能强大且可高度自定义的身份验证和访问控制框架。它是保护基于Spring的应用程序的事实上的标准。Spring Security是一个专注于为Java应用程序提供身份验证和授权的框架
    2023-02-02
  • Java递归遍历文件目录代码实例

    Java递归遍历文件目录代码实例

    这篇文章主要介绍了Java递归遍历文件目录代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Spring中HandlerMapping接口源码详解

    Spring中HandlerMapping接口源码详解

    这篇文章主要介绍了Spring中HandlerMapping接口源码详解,RequestMappingHandlerMapping类就是实现此接口并将容器中所有的控制器的RequestMappingInfo请求和HandlerMethod注册到内存之中,需要的朋友可以参考下
    2023-11-11
  • Spring中事务几个常见的问题解决

    Spring中事务几个常见的问题解决

    这篇文章主要介绍了Spring中事务几个常见的问题解决,事务这个概念是数据库层面的,Spring只是基于数据库中的事务进行扩展,以及提供了一些能让程序员更新方便操作事务的方式
    2022-08-08
  • java实现的RSA加密算法详解

    java实现的RSA加密算法详解

    这篇文章主要介绍了java实现的RSA加密算法,结合实例形式详细分析了RSA加密解密的原理、java实现方法及相关注意事项,需要的朋友可以参考下
    2017-06-06
  • vue+springboot读取git的markdown文件并展示功能

    vue+springboot读取git的markdown文件并展示功能

    Markdown-it 是一个用于解析和渲染 Markdown 标记语言的 JavaScript 库,使用 Markdown-it,你可以将 Markdown 文本解析为 HTML 输出,并且可以根据需要添加功能、扩展语法或修改解析行为,本文介绍vue+springboot读取git的markdown文件并展示,感兴趣的朋友一起看看吧
    2024-01-01
  • 最新IDEA 2022基于JVM极致优化 IDEA启动速度的方法

    最新IDEA 2022基于JVM极致优化 IDEA启动速度的方法

    这篇文章主要介绍了IDEA 2022最新版 基于 JVM极致优化 IDEA 启动速度,需要的朋友可以参考下
    2022-08-08
  • 关于jackson序列化和feign返回值的问题

    关于jackson序列化和feign返回值的问题

    这篇文章主要介绍了关于jackson序列化和feign返回值的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot中的五种对静态资源的映射规则的实现

    SpringBoot中的五种对静态资源的映射规则的实现

    这篇文章主要介绍了SpringBoot中的五种对静态资源的映射规则的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 详解openfeign集成spring cloud loadbalancer实现负载均衡流程

    详解openfeign集成spring cloud loadbalancer实现负载均衡流程

    这篇文章主要介绍了openfeign集成spring cloud loadbalancer实现负载均衡流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论