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容器来创建,可以大大降低开发中代码的维护成本

实现步骤:

  1. 导入spring坐标
<dependecy>
    <groupid>org.springframework</groupid>
    <artifactid>spring-context</artifactid>
    <version>5.2.10.release</version>
</dependecy>
  1. 在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定义类型

  1. 获取ioc容器(由spring提供的方法)
ApplactionContext ctx = new ClassPathxmlApplactionContext(applicationContext.xml);
// 这个方法需要传递一个spring配置文件进去,如上一步的配置文件信息applicationContext.xml
  1. 获取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作用范围默认只有两个值

  1. prototype

​ 非单例

  1. singletor

    单例,不配置scope属性默认的是这个值

其他配置bean的方法:

实例化bean还有一种方法,即实现FactoryBean<>接口,实现步骤

  1. 实现FactoryBean接口,泛型写需要实例化的对象类型
  2. 重写FactoryBean的getobject方法和getobjectType方法,其中getobject方法是返回有FactoryBean创建的Bean实例,getobjectType方法是返回FactoryBean创建Bean的类型的字节码文件。
  3. 在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的执行流程

  • 初始化容器
    1. 创建对象(内存分配)
    2. 执行构造方法
    3. 执行属性注入
    4. 执行bean初始化方法
  • 使用bean
    1. 执行业务操作
  • 关闭销毁容器
    1. 执行bean销毁方法
posted @   萧何i  阅读(750)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示