Spring对于bean的配置详解
Spring简介
Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。 提供了展现层 SpringMVC 和持久层 Spring JDBCTemplate 以及业务层事务管理等众多的企业级应用技术 ,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开源框架。
名词解释:
IOC:控制反转,对象的创建控制权由程序转移到外部,这种思想称为IOC(控制反转),主要作用就是解耦
IOC容器:IOC思想的实现,Spring提供了ioc思想的解决方案,并成为ioc容器
Bean:IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为bean
DI:依赖注入,在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
Spring入门案例
Spring简化开发的思路:
由于之前中的开发中创建对象时使用New关键字来创建,这种方法会导致代码耦合度变高,不利于后期维护,Spring提供了ioc容器来管理这些需要创建的对象,使用的时候把对象交给ioc容器来创建,可以大大降低开发中代码的维护成本
实现步骤:
- 导入spring坐标
<dependecy>
<groupid>org.springframework</groupid>
<artifactid>spring-context</artifactid>
<version>5.2.10.release</version>
</dependecy>
- 在resources目录下创建spring配置文件,配置Bean(名称一般固定为applicationContext.xml)
把需要实例化的类(或者接口的实现类配置到配置文件中)
<bean id="xxx" class="com.xxx.xxx.xxx"/>
<bean id="bookservice" class="com.xiaohe.dao.imp.bookdaoimpl"/>
id 属性表示给bean起名字,class属性表示给bean定义类型
- 获取ioc容器(由spring提供的方法)
ApplactionContext ctx = new ClassPathxmlApplactionContext(applicationContext.xml);
// 这个方法需要传递一个spring配置文件进去,如上一步的配置文件信息applicationContext.xml
- 获取Bean
通过上一步创建的容器对象的.getbean方法拿到bean,这个方法需要传递一个参数,参数就是配置文件里面定义的bean的id,也就是决定自身需要调用哪个实例对象
ctx.getbean("bookservice")
在拿到Bean对象以后,需要使用它就要给这个bean做一个强制转型,然后才能再调用它的一些方法
bookservice bookservice = ctx.getbean("bookeservice")
强制转型快捷键:alt+enter
public class IOCimpl implements TestIOC {
public void say() {
System.out.println("hello,spring");
}
}
// 这是第二个类
public class Diimpl implements Di{
private IOCimpl IOCimpl = new IOCimpl();
public void say() {
System.out.println("hello,dao");
IOCimpl.say();
}
}
// 程序入口
public class Application {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplactionContext.xml");
// IOCimpl test = (IOCimpl) applicationContext.getBean("IOCimpl");
// test.say();
Diimpl bean = (Diimpl) applicationContext.getBean("DIimpl");
bean.say();
}
}
<bean name="IOCimpl" class="com.xiaohe.dao.IOCimpl"></bean>
<bean name="DIimpl" class="com.xiaohe.service.Diimpl"></bean>
这个时候虽然初步实现了对象的创建交给spring执行,但是具体实现的时候还是用到了new关键字,所以我们需要给这个案例做一个改进
实现思路:
在service调用dao层的代码中取消new关键字创建实例对象,然后提供对应的set方法,在spring配置文件中配置二者关系
配置二者关系:
<bean id ="IOCimpl" class="com.xiaohe.dao.IOCimpl"></bean>
<bean id ="DIimpl" class="com.xiaohe.service.Diimpl">
<property name="IOCimpl" ref="IOCimpl"/>
<!-- 第一个iocimpl表示实例化的属性名,第二个iocimpl表示配的bean的id属性-->
</bean>
其中property属性表示配置当前bean的属性(DIimpl),name属性表示配置哪一个具体的属性(类的实例化属性),ref属性表示参照哪一个bean
bean的配置
起别名
在写Spring配置文件的时候,也可以使用Name属性来给bean起多个名称(别名),这样就可以使用配置的其他名称来使用bean,需要注意的是,要使用的别名必须在spring配置文件中被定义,否则会抛出一个异常,起多个别名的时候可以使用逗号(,)封号(;)空格( )隔开
作用范围
spring默认提供的bean对象是单例的,也就是说如果使用getbean获取同一个bean,获取两次并直接将该对象打印的时候,会发现两个对象的地址值是相同的,但是开发环境中有时候需要创建非单例的对象,这个时候就需要给bean配置一个作用范围了(scope)
scope作用范围默认只有两个值
- prototype
非单例
-
singletor
单例,不配置scope属性默认的是这个值
其他配置bean的方法:
实例化bean还有一种方法,即实现FactoryBean<>接口,实现步骤
- 实现FactoryBean接口,泛型写需要实例化的对象类型
- 重写FactoryBean的getobject方法和getobjectType方法,其中getobject方法是返回有FactoryBean创建的Bean实例,getobjectType方法是返回FactoryBean创建Bean的类型的字节码文件。
- 在spring配置文件里配置bean的id和class属性,注意class属性指向的是创建的Factorybean的实现类
bean的生命周期控制
生命周期:从创建到销毁的完整过程、
bean生命周期:bean从创建到销毁的整个过程
bean生命周期控制:在bean创建后到销毁前做一些事情
spring提供了两种控制生命周期的方式、
1.配置文件控制生命周期
第一步,在控制的bean里定义两个方法,一个init,一个destory。
第二步,在spring配置文件中选择进行生命周期控制操作的bean,添加两个属性
第三步,选择属性对应的方法,init-method属性选择类里面写好的对应的init方法,destroy属性里面选择类里面写好的对应的destory方法
第四步,在创建ioc容器的时候左边的指向选择classpathxmlapplicationcontext,(因为只有这个实现类里面有close方法)通过ioc容器对象.close方法关闭容器,但是这种方式过于粗暴,所以ioc容器还提供了另一个方法registershutdownhook来实现同一个目标,两者的区别在于registershutdownhook方法可以写在ioc容器的任意行,close方法只能写在最后一行,如果写在获取ioc容器这行代码的下边则会导致无法获取Bean
2.实现接口initializingbean和disposablebean
该方法只需要重写destroy方法和afterpropertiesset方法即可
bean的执行流程
- 初始化容器
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入
- 执行bean初始化方法
- 使用bean
- 执行业务操作
- 关闭销毁容器
- 执行bean销毁方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南