1.spring框架-----spring framework bean基础配置 bean生命周期

2023-05-16

目录

一、spring framework

1.IoC控制反转(Inversion of Control)

2.DI依赖注入(Dependency Injection)

3.bean基础配置

4.bean实例化 

4.1构造方法

4.2静态工厂

4.3实例工厂

5.bean的生命周期


一、spring framework

springframework 是spring 里面的一个基础开源框架,主要用于javaee的企业开发。

  图源

1.IoC控制反转(Inversion of Control)

不需要自己主动创建对象,由外部提供对象,对象创建控制权由程序转移到外部,称为控制反转。spring提供一个容器,称为IoC容器,IoC容器负责创建对象、初始化等一系列工作,被创建或管理的对象在IoC容器中统称为Bean

 IoC 在其他语言中也有应用,并非 Spirng 特有。 IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。

2.DI依赖注入(Dependency Injection)

在容器中建立bean和bean之间依赖关系的整个过程,称为依赖注入

‘高内聚,低耦合’

项目中每个模块之间相互联系的紧密程度,模块之间联系越紧密,耦合性越高,模块的独立性就越差

模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,内聚性越高

而我们设计软件需要的是“高内聚,低耦合”

使用IOC容器管理Bean,在IOC容器中把有依赖关系的都进行绑定,在使用对象时就可以之间从IOC容器中获取,并且所有的bean已经绑定好依赖关系,降低了耦合性,修改代码的时候不需要全部更改

3.bean基础配置

spring默认提供的bean是单例的

想要修改成不是单例的可以在配置文件中修改

singleton默认为单例 prototype为非单例

 scope="prototype"

为什么bean默认为单例?

bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象 bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高

bean在容器中是单例的,会不会产生线程安全问题?

如果对象是有状态对象,即该对象有成员变量可以用来存储数据的, 因为所有请求线程共用一个bean对象,所以会存在线程安全问题。 如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的, 因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。

4.bean实例化 

 实例化bean的三种方式,构造方法,静态工厂和实例工厂

bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成 的。

4.1构造方法

Spring底层使用的是类的无参构造方法。

先创建接口BookDao和类BookDaoImpl

public interface BookDao {
    public void save();
}


public class BookDaoImpl implements BookDao {
    public BookDaoImpl() {
        System.out.println("book dao constructor is running ....");
    }

    public void save() {
        System.out.println("book dao save ...");
    }

}

 applicationContext.xml

<!--配置bean-->

 <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

编写运行程序 

public class AppForLifeCycle {
    public static void main( String[] args ) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao1 = (BookDao) ctx.getBean("bookDao");
        bookDao1.save();

    }
}

​

 

4.2静态工厂

先创建接口BookDao和类BookDaoImpl

public interface BookDao {
    public void save();
}


public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }

}

创建一个工厂类BookDaoFactory并提供一个静态方法 

public class BookDaoFactory {
    public static BookDao getOrderDao(){
        return new BookDaoImpl();
    }
}

配置文件 

class:工厂类的类全名 factory-mehod:具体工厂类中创建对象的方法名

 <bean id="bookDao" class="com.itheima.factory.BookDaoFactory" factory-method="getOrderDao"/>

编写AppForLifeCycle运行类,在类中通过工厂获取对象 

public class AppForLifeCycle {
    public static void main( String[] args ) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao orderDao = (BookDao) ctx.getBean("bookDao");
        orderDao.save();
    }
}

 

 在工厂的静态方法中,我们除了new对象还可以做其他的一些业务操作,

4.3实例工厂

 先创建接口BookDao和类BookDaoImpl

public interface BookDao {
    public void save();
}


public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }

}

创建一个工厂类BookDaoFactory并提供一个方法 -----此时不是静态方法

public class BookDaoFactory {
    public BookDao getOrderDao(){
        return new BookDaoImpl();
    }
}

配置文件 

实例化工厂运行的顺序是:

创建实例化工厂对象,对应的是第一行配置

调用对象中的方法来创建bean,对应的是第二行配置

factory-bean:工厂的实例对象 factory-method:工厂对象中的具体创建对象的方法名

  <bean id="bookDaoFactory" class="com.itheima.factory.BookDaoFactory"/>
  <bean id="bookDao" factory-method="getOrderDao" factory-bean="bookDaoFactory"/>

编写AppForLifeCycle运行类

public class AppForLifeCycle {
    public static void main( String[] args ) {
        BookDaoFactory bookDaoFactory = new BookDaoFactory();
        BookDao bookDao = bookDaoFactory.getOrderDao();
        bookDao.save();
    }
}

以Spring为了简化这种配置方 式就提供了一种叫FactoryBean的方式来简化开发。

创建一个BookDaoFactoryBean的类,实现FactoryBean接口,重写接口的方法

public class BookDaoFactoryBean implements FactoryBean<BookDao> {

   //代替原始实例工厂中创建对象的方法
    public BookDao getObject() throws Exception {
        return new BookDaoImpl();
    }

   //返回所创建类的Class对象
    public Class<?> getObjectType() {
        return BookDao.class;
    }
}

配置文件

  <bean id="bookDaoFactory" class="com.itheima.factory.BookDaoFactoryBean"/>

别的不需要更改

getObject(),被重写后,在方法中进行对象的创建并返回

getObjectType(),被重写后,主要返回的是被创建类的Class对象

isSingleton(),设置对象是否为单例,默认是true单例

5.bean的生命周期

项目中添加BookDao、BookDaoImpl、BookService和BookServiceImpl类

public interface BookDao {
    public void save();
}


public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    //表示bean初始化对应的操作
    public void init(){
        System.out.println("init...");
    }
    //表示bean销毁前对应的操作
    public void destroy(){
        System.out.println("destroy...");
    }

}


public interface BookService {
    public void save();
}

public class BookServiceImpl implements BookService {
    private BookDao bookDao;

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

为BookDao添加生命周期的控制方法,具体的控制有两个阶段:

bean创建之后,想要添加内容,比如用来初始化需要用到资源

bean销毁之前,想要添加内容,比如用来释放用到的资源 

init-method="init" destroy-method="destroy"

 <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>

运行方法

public class AppForLifeCycle {
    public static void main( String[] args ) {
        ApplicationContext ctx = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();

    }
}

init方法执行了,但是destroy方法却未执行

Spring的IOC容器是运行在JVM中 运行main方法后,JVM启动,Spring加载配置文件生成IOC容器,从容器获取bean对象,然后调方 法执行 main方法执行完后,JVM退出,这个时候IOC容器中的bean还没有来得及销毁就已经结束了 所以没有调用对应的destroy方法

解决办法1close关闭容器

想要执行destroy方法,ApplicationContext中没有close方法 需要将ApplicationContext更换成ClassPathXmlApplicationContext,实例化对象ctx之后,调用close()方法

public class AppForLifeCycle {
    public static void main( String[] args ) {
        ClassPathXmlApplicationContext ctx = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        ctx.close();

    }
}

解决办法1注册钩子关闭容器

将ApplicationContext更换成ClassPathXmlApplicationContext,实例化对象ctx之后,调用registerShutdownHook()方法

public class AppForLifeCycle {
    public static void main( String[] args ) {
        ClassPathXmlApplicationContext ctx = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        ctx.registerShutdownHook();
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();

    }
}

相同点:这两种都能用来关闭容器

不同点:close()是在调用的时候关闭,registerShutdownHook()是在JVM退出前调用关闭。

close()强制退出

事实上还有更简便的方法,Spring提供了两个接口来完成生命周期的控制,好处是可以不用再进行配置init-method和 destroy-method

修改BookServiceImpl类,添加两个接口InitializingBean, DisposableBean并实现接口中的两个方法afterPropertiesSet和destroy

初始化方法会在类中属性设置之后执行

public class BookServiceImpl implements BookService, InitializingBean, DisposableBean{
    private BookDao bookDao;

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("service destroy");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("service init");
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1.spring框架-----spring framework bean基础配置 bean生命周期 的相关文章

  • Java常见的集合面试题

    常见的集合有哪些 xff1f Java集合类主要由两个接口Collection和Map派生出来的 xff0c Collection有三个子接口 xff1a List Set Queue Java集合框架图如下 xff1a List代表了有序
  • Maven&Mybatis

    文章目录 Maven amp MyBatis1 xff0c Maven1 1 Maven简介1 1 1 Maven模型1 1 2 仓库 1 2 Maven安装配置1 3 Maven基本使用1 3 1 Maven 常用命令1 3 2 Mave
  • c语言输出初回忆

    温故而知新 今天做了几道c语言简单的输出题 xff0c 回忆了输出的精度问题 xff0c 记录一下 1 字符getchar 和putchar 的输入输出问题 输入的时候为 变量 61 getchar xff0c 输出的时候可以在putcha
  • Android开发(三):BottomNavigationView+Fragment实现底部导航栏和页面的切换

    创建新项目 xff0c 选择Empty Activity 点击Next 填写相关信息 xff0c 点击finish 创建四个类和对应的布局文件 在res下创建menu目录和navigation目录 在menu目录下创建menu bottom
  • 7-6 统计字母出现的次数 (20 分)

    7 6 统计字母出现的次数 20 分 从键盘输入一行只有小写英文字母的字符串 xff0c 用回车结束输入 统计26个英文字母出现的次数并依次输出 字符串长度不超过100个字符 输入格式 一行只有小写英文字母的字符串 xff0c 用回车结束输
  • 使用springmvc配置servlet

    使用springmvc配置servlet 文章目录 使用springmvc配置servlet将springmvc引入系统设置web xml设置配置springmvc的相关文件 新建controller包配置log4j配置网页 xff08 略
  • 实习面经分享 | 毫无面试经验的人该怎么去面试

    最近上网的时候 xff0c 看到很多24届的同学已经面了字节 蚂蚁 阿里云这些大厂的暑期实习 xff0c 大家还是非常优秀的 xff0c 也想到了自己去年找实习的点点滴滴 接下来打算分享一下下 本文内容主要分享一下当初我在准备暑期实习的时候
  • 实习面经分享 | 阿里云面试经验分享

    文章目录 实习面经分享 阿里云面试经验分享阿里云 后端开发 实习一面 xff1a 二面 xff1a hr面 xff1a 心得 xff1a 实习面经分享 阿里云面试经验分享 最近上网的时候 xff0c 看到很多24届的同学已经面了字节 蚂蚁
  • 实习面经分享 | 蚂蚁面试经验分享

    文章目录 实习面经分享 蚂蚁面试经验分享支付宝 后端开发 实习技术一面 xff1a 技术二面 xff1a 心得 xff1a 实习面经分享 蚂蚁面试经验分享 最近上网的时候 xff0c 看到很多24届的同学已经面了字节 蚂蚁 阿里云这些大厂的
  • DataWhale数据分析第三章模型建立和评估--评价

    第三章 模型搭建和评估 评估 根据之前的模型的建模 xff0c 我们知道如何运用sklearn这个库来完成建模 xff0c 以及我们知道了的数据集的划分等等操作 那么一个模型我们怎么知道它好不好用呢 xff1f 以至于我们能不能放心的使用模
  • 国企深度揭秘 | 移动总部网络事业部

    文章目录 国企深度揭秘 移动总部网络事业部1 公司情况2 招聘岗位3 招聘流程4 投递方式5 主观评价6 薪资待遇7 面经分享一面 xff1a 二面 xff1a 国企深度揭秘 移动总部网络事业部 大家好呀 xff0c 这里是小黛 最近想做这
  • ACM模式输入输出攻略 | C++篇

    文章目录 ACM模式输入输出攻略 C 43 43 篇1 核心代码模式与ACM模式2 C 43 43 常用的输入输出方法2 1 输入 xff08 1 xff09 cin xff08 2 xff09 getline xff08 3 xff09
  • 简历撰写攻略 | 互联网和国企的简历该怎么写,有何不同?

    文章目录 简历撰写攻略 互联网和国企的简历该怎么写 xff0c 有何不同 xff1f 1 写好简历是至关重要的2 如何写简历2 1 关于格式2 2 关于内容 3 总结 简历撰写攻略 互联网和国企的简历该怎么写 xff0c 有何不同 xff1
  • 自我介绍保姆级教学

    文章目录 自我介绍保姆级教学1 自我介绍的重要性2 自我介绍的形式和考察点3 如何进行自我介绍4 小结 自我介绍保姆级教学 大家好 xff0c 这里是小黛 xff01 今天打算来讲讲在面试中的第一关 xff0c 自我介绍 xff01 本文将
  • 国企央企OFFER收割全攻略 | 银行篇之行业整体介绍

    国企央企OFFER收割全攻略 银行篇之行业整体介绍 大家好 xff0c 这里是小黛 最近完成了一些工作上的事情 xff0c 因此更新推迟了一些 这篇银行求职全攻略 xff0c 千呼万唤始出来 xff0c 耗费了小黛非常非常非常多的心血 xf
  • 国企央企OFFER收割全攻略 | 银行篇之银行投递

    国企央企OFFER收割全攻略 银行篇之银行投递 大家好 xff0c 这里是小黛 最近完成了一些工作上的事情 xff0c 因此更新推迟了一些 这篇银行求职全攻略 xff0c 千呼万唤始出来 xff0c 耗费了小黛非常非常非常多的心血 xff0
  • 国企央企OFFER收割全攻略 | 银行篇之性格测评

    文章目录 国企央企OFFER收割全攻略 银行篇之性格测评3 性格测评3 1 考察内容3 2 题型3 3 注意事项 小结 国企央企OFFER收割全攻略 银行篇之性格测评 大家好 xff0c 这里是小黛 最近完成了一些工作上的事情 xff0c
  • 国企央企OFFER收割全攻略 | 银行篇之笔试

    文章目录 国企央企OFFER收割全攻略 银行篇之笔试4 笔试4 1 银行笔试的考察内容与题型4 2 不同银行笔试的侧重点4 3 如何准备银行笔试4 4 笔试的注意事项 小结 国企央企OFFER收割全攻略 银行篇之笔试 大家好 xff0c 这
  • 技术面面试高频考点总结-C++篇

    文章目录 技术面面试高频考点总结 C 43 43 篇一 C 43 43 常考考点枚举二 C 43 43 基础推荐学习资料三 小结 技术面面试高频考点总结 C 43 43 篇 大家好呀 xff0c 这里是小黛 xff01 在技术面面试中 xf
  • 国企央企OFFER收割全攻略 | 银行篇之面试

    文章目录 国企央企OFFER收割全攻略 银行篇之面试5 面试5 1 银行面试的考察内容与考察形式5 2 不同银行面试的面试内容5 3 银行面试流程与常考问题5 4 如何准备银行面试5 5 面试的注意事项 小结 国企央企OFFER收割全攻略

随机推荐

  • 基于机器学习的城市暴雨量预测

    背景 通过深圳气象局观测到的雷达图数据 xff0c 每个雷达图覆盖一个目标地点及其周边地区 xff0c 标记为m m网格 xff0c 其中每个网格点记录的是雷达反射率因子值z 这里Z值可以从非常小的数值到大的值 xff0c 为方便起见 xf
  • 国企央企OFFER收割全攻略 | 银行篇之差额体检&答疑

    文章目录 国企央企OFFER收割全攻略 银行篇之差额体检 amp 答疑6 体检6 1 体检是差额体检 xff0c 是招聘的一个环节6 2 体检的流程6 3 体检的注意事项 7 答疑8 结束语题外话 国企央企OFFER收割全攻略 银行篇之差额
  • 技术面面试高频考点总结-Redis篇

    文章目录 技术面面试高频考点总结 Redis篇一 Redis常考考点枚举二 Redis推荐学习资料三 小结 技术面面试高频考点总结 Redis篇 大家好呀 xff0c 这里是小黛 xff01 Redis是目前非常火的 xff0c 完全开源的
  • HR面与反问环节考点总结

    文章目录 HR面与反问环节考点总结1 HR面1 1 HR面的重要性与注意事项1 2 HR面常考问题枚举 2 反问2 1 反问是什么2 2 反问都问些什么 小结题外话 HR面与反问环节考点总结 大家好呀 xff0c 这里是小黛 xff01 本
  • 技术面面试高频考点总结-Linux篇

    技术面面试高频考点总结 Linux篇 大家好呀 xff0c 这里是小黛 xff01 Linux是一种类Unix操作系统 xff0c 是由芬兰的林纳斯 托瓦兹 xff08 Linus Torvalds xff09 在1991年首次发布 Lin
  • 技术面面试高频考点总结-操作系统篇

    技术面面试高频考点总结 操作系统篇 文章目录 技术面面试高频考点总结 操作系统篇一 操作系统必考考点列举二 操作系统推荐学习资料三 小结题外话 大家好呀 xff0c 这里是小黛 xff01 操作系统也是在面试中必考的内容 xff0c 那今天
  • 面试高频考点总结-云原生、微服务、K8s、分布式

    文章目录 技术面面试高频考点总结 云原生篇一 云原生简介二 云原生面试考题列举三 小结题外话 技术面面试高频考点总结 云原生篇 大家好呀 xff0c 这里是小黛 xff01 之前的文章呀 xff0c 也介绍了大部分计算机基础相关的八股文 x
  • 技术面面试高频考点总结-JAVA篇

    文章目录 技术面面试高频考点总结 JAVA篇一 Java基础二 JVM三 并发四 框架五 小结题外话 技术面面试高频考点总结 JAVA篇 大家好呀 xff0c 这里是小黛 xff01 今天呀 xff0c 来介绍大家最喜欢的Java篇 xff
  • 视图绑定【android jetpack】

    视图绑定 视图绑定 是通过对xml属性转化为对应的绑定类 会对xml布局中所有的具有id属性的组件创建直接的引用 视图绑定 与 传统的findviewbyid 视图绑定 xff1a 是对id属性组件的直接引用 相当于只要组件只要有了id属性
  • NLTK语料库下载

    仓库地址 https github com Trkly NLTK DATA 希望能够帮到大家并希望大家给个star 语料库的存放位置参考如下图
  • Manjaro入坑

    Manjaro入坑 没有技术还偏偏就是喜欢瞎折腾 xff0c 没错 xff0c 说的就是我 xff01 大一的时候装过 Ubuntu 43 Win10 以及 CentOS7 8 43 Win10 的双操作系统 xff0c 后来因为一些日常软
  • android 监听手机电量变化

    今天 xff0c 简单讲讲如何监听手机电量的变化 监听电量是不能静态注册的 后来上网搜索 xff0c 发现有五个不能静态注册的广播 xff0c 这里记录一下 xff0c 免得下次再后知后觉的发现并惊讶于自己的笨拙 不能静态注册的广播 and
  • 【笔记】libpcap安装与使用

    Ubuntu 20 04 文章目录 起步一 下载libpcap 库二 安装三 使用 完整程序 们 1 头文件集锦myheader h 2 打印报文内容sniff c 3 嗅探与伪造icmpspoof c 附加内容unmask 0 共享内存报
  • 2022基于Anaconda环境下Jupyter最全安装插件及配置相关知识及踩坑指南

    2022Jupyter 43 Anaconda最全安装相关知识及踩坑指南 一 简介1 概述2 下载网址以及参考文档3 优点 二 安装使用过程1 起始2 更改存储路径 xff08 踩坑 xff08 1 xff09 xff09 2 1 使用管理
  • 微信小程序整合WebScoket部署上线

    微信小程序整合WebScoket部署上线 在部署的服务器 中安装nginx xff0c 并作出如下配置 xff1a 思路 xff1a 此处监听的是外部的443端口和xcxapi wfeifei com域名 xff0c 当通过该域名和端口号进
  • Vue(v-show简介)

    v show简介 1 v show指令的作用是 xff1a 根据切换元素的显示状态 2 原理是修改元素 的display xff0c 实现显示隐藏 3 指令后面的内容 xff0c 最终都会解析为布尔值 4 值为true元素显示 xff0c
  • 使用python编写adb脚本实现自动化测试

    使用python编写adb脚本实现自动化测试 前言一 python与adb二 使用步骤1 基本原理2 方法1 xff1a 使用os system 函数实现2 方法2 xff1a 使用os popen 函数实现2 方法3 xff1a 使用su
  • 怎么在jupyter中安装tensorflow,并切换环境为tensorflow

    首先说一下遇到的问题是如下 xff08 前提是已经安装anaconda xff09 xff1a 一 进入jupyter打开终端 在cmd中输入jupyter notebook进入jupyter xff1a 然后进入终端 xff1a 进入之后
  • selenium 自动化测试

    selenium 是最广泛使用的开源Web UI xff08 用户界面 xff09 自动化测试套件之一 selenium测试脚本可以使用任何支持的编程语言进行编码 xff0c 并且可以直接在大多数现代Web浏览器中运行 在爬虫领域selen
  • 1.spring框架-----spring framework bean基础配置 bean生命周期

    目录 一 spring framework 1 IoC控制反转 Inversion of Control 2 DI依赖注入 Dependency Injection 3 bean基础配置 4 bean实例化 4 1构造方法 4 2静态工厂