Spring IOC、DI及Bean
一、基础知识
1. 概念
A. IoC(控制反转)思想:是指在程序开发中,实例的创建不再由调用者管理,而是由Spring容器创建,Spring容器会负责控制程序之间的关系,而不是由代码直接控制,因此,控制权由程序代码转移到了Spring容器中,控制权发生了反转;
B. DI(依赖注入):是指程序员不必创建对象,但必须描述如何创建它们,不需要直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务,由Ioc容器将它们装配在一起;
依赖:bean对象的创建依赖于容器;注入:bean对象中所有的属性由容器来注入,注入范围含:普通值、引用、数组、List、Map、Set、null、Properties。
2. 依赖注入方式
A. 构造器注入:Spring4.X版本以后推荐使用;
B. setter注入;
C. p(property)和c(constructor)命名空间注入。
3. IoC特点
A. 它将最小化应用程序中的代码量;
B. 它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例或JNDI查找机制;
C. 它以最小的影响和最少的侵入机制促进松耦合;
D. 它支持即时的实例化和延迟加载服务。
注意:IoC是一种设计思想,DI是实现IoC的一种方法。
二、Spring容器
1. BeanFactory
A. 是基础类型的IoC容器,就是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用他们的生命周期的方法;
B. 常用接口实现类:BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D://applicationContext.xml"));
C. 特点:采用懒加载机制,使用语法显示提供资源对象。
2. ApplicationContext
A. 是BeanFactory的子接口即应用上下文,它还支持国际化,资源访问和事件传播等;
B. 常用实现类
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
C. 特点:采用即时加载机制,自己创建和管理资源对象。
三、Bean基础
1. Bean的定义
A. 它们是构成用户应用程序主干的对象;
B. 它们由 Spring IoC 容器实例化,配置,装配和管理;
C. Bean是基于用户提供给容器的配置元数据创建;
2. Bean的实例化
A. 构造器;
B. 静态工厂;
C. 实例工厂。
3. Bean的作用域(Scope)
A. singleton(单例模式):这是Bean默认的作用域,Spring容器只创建一个Bean的实例,Spring在创建第一次后会缓存起来,之后不再创建,适合无会话状态的Bean,比如Service和Dao层;
B. prototype(原型模式);每次请求该Bean时,都会创建一个新的Bean实例,需要保持会话状态的Bean,如Struts2中Action类;
C. request:每个request作用域内的请求只创建一个Bean实例;
D. session:每个session作用域内的请求只创建一个Bean实例;
E. global Session:这个只在porlet的web应用程序中才有意义,它映射到porlet的global范围的session;如果是普通的就类似session作用;
4. Bean的生命周期
A. 根据配置情况调用Bean构建方法或工厂方法实例化Bean;
B. 利用依赖注入完成Bean中所有属性值的配置注入;
C. 如果Bean实现了BeanNameAware接口,则调用Bean的setBeanName()方法传入当前Bean的id值;
D. 如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory()方法传入当前工厂实例的引用;
E. 如果Bean实现了ApplicationContextAware接口,则调用setApplicationContext()方法传入当前ApplicationContext实例的引用;
F. 如果BeanPostProcessor和Bean关联,则调用该接口的预初始化方法postProcessBeforeInitialzation()对Bean进行加工操作;
G. 如果Bean实现了InitializingBean接口,则调用afterPropertiesSet()方法;
H. 如果在配置文件中通过init-method属性指定了初始化方法,则调用该初始化方法;
I. 如果BeanPostProcessor和Bean关联,则调用该接口的初始化方法postProcessAfterInitialization();
J. 如果在<bean>中指定了该Bean的作用范围为scope="singleton",则将该Bean放入Spring IoC的缓存池中,将触发Spring对该Bean的生命周期管理;如果在<bean>中指定了该Bean的作用范围为scope="prototype",则将该Bean交给调用者,调用者管理该Bean的生命周期,Spring不再管理该 Bean;
K. 如果Bean实现了DisposableBean接口,则调用destory()方法将Spring中的Bean销毁;如果在配置文件中通过destory-method属性指定了Bean的销毁方法,则调用该方法对 Bean 进行销毁。
四、Bean的装配
1. 方式
A. 在XML中显示的配置,又分为设置(setter)注入和构造注入;
B. 在Java中显示的配置;
C. 隐式的自动装配。
2. 使用场景
A. @Bean或XML配置:适合导入第三方包里面的组件;
B. 基于Annotation的Bean装配:适合自己写的类;
C. @Import(自定义类)注解:适合快速给容器中导入一个组件;
3. 自动装配方式
A. no:默认设置,表示没有自动装配,应使用显示的Bean引用进行装配;
B. byName:按Bean的名称进行装配;
C. byType:按Bean的类型进行装配;
D. constructor:根据构造方法的参数的数据类型,进行byType模式的自动装配;
E. autodetect:如果发现默认的构造方法,则用constructor模式,否则用byType模式。
注解实现自动装配
五、Bean的初始化及销毁时自定义方法
1. 初始化方式
A. 使用注解@PostConstruct;
B. 实现InitializingBean接口,并重写其afterPropertiesSet();
C. 在注解@bean上指定初始化的方法;
D. 加载顺序为:构造器>A>B>C;
2. 销毁方式
A. 使用注解@PreDestroy;
B. 实现DisposableBean接口,并重写其destroy();
C. 在注解@bean上指定销毁的方法;
D. 加载顺序为:构造器>A>B>C;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗