spring IOC 控制反转详解生命周期

2023-11-04

spring IOC 控制反转:

通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
AOP:切面编程
声明式事务的支持
方便程序的测试
方便集成各种优秀框架
降低 JAVAEE API的使用难度

使用 Spring的IOC解决程序耦合问题:

    1 实例的前期准备  (解决 业务层和 持久层的依赖关系)
      1.1准备spring的开发包
              官网:http://spring.io/
           下载地址:
             http://repo.springsource.org/libs-release-local/org/springframework/spring
          解压:(Spring目录结构:)
      1.2基于XML的配置:
               第一步:拷贝必备的jar包到工程的lib目录中
               第二步:在类的根路径下创建一个任意名称的xml文件(不能是中文)
                给配置文件导入约束:

  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
   </beans>
    第三步:让spring管理资源,在配置文件中配置service和dao
   <!-- bean标签:用于配置让spring创建对象,并且存入ioc容器之中
   id属性:对象的唯一标识。
   class属性:指定要创建对象的全限定类名
    -->
<!-- 配置service -->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
</bean>
<!-- 配置dao -->
<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"></bean>

IOC中bean标签和管理对象细节

作用:
用于配置对象让spring来创建的。
默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
属性:
id:给对象在容器中提供一个唯一标识。用于获取对象。
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围。

  • singleton :默认值,单例的.
  • prototype :多例的.
  • request :WEB项目中,Spring创建一个Bean的对象,将对象存入到request域中.
  • session :WEB项目中,Spring创建一个Bean的对象,将对象存入到session域中.
  • global session :WEB项目中,应用在Portlet环境.如果没有Portlet环境那么globalSession相当于session.
    init-method:指定类中的初始化方法名称。
    destroy-method:指定类中销毁方法名称。

bean的作用范围和生命周期

单例对象:scope=“singleton”
一个应用只有一个对象的实例。它的作用范围就是整个引用。
生命周期:
对象出生:当应用加载,创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
多例对象:scope=“prototype”
每次访问对象时,都会重新创建对象实例。
生命周期:
对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被java的垃圾回收器回收了。

实例化Bean的三种方式

第一种方式:使用默认无参构造函数
在默认情况下:
它会根据默认无参构造函数来创建类对象。如果bean中没有默认无参构造函数,将会创建失败。

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"/>

第二种方式:spring管理静态工厂-使用静态工厂的方法创建对象

/**
* 模拟一个静态工厂,创建业务层实现类
*/
public class StaticFactory {
public static IAccountService createAccountService(){
return new AccountServiceImpl();
}
}

此种方式是:
使用StaticFactory类中的静态方法createAccountService创建对象,并存入spring容器
id属性:指定bean的id,用于从容器中获取
class属性:指定静态工厂的全限定类名
factory-method属性:指定生产对象的静态方法

<bean id="accountService"     class="com.itheima.factory.StaticFactory"
factory-method="createAccountService">                    </bean>

第三种方式:spring管理实例工厂-使用实例工厂的方法创建对象

/**
* 模拟一个实例工厂,创建业务层实现类
* 此工厂创建对象,必须现有工厂实例对象,再调用方法
*/
public class InstanceFactory {
public IAccountService createAccountService(){
return new AccountServiceImpl();
}
}

此种方式是:
先把工厂的创建交给spring来管理。
然后在使用工厂的bean来调用里面的方法
factory-bean属性:用于指定实例工厂bean的id。
factory-method属性:用于指定实例工厂中创建对象的方法。

对应在 xml 文件中的配置

<bean id="instancFactory" class="com.itheima.factory.InstanceFactory"></bean>
<bean id="accountService"
factory-bean="instancFactory"
factory-method="createAccountService"></bean>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring IOC 控制反转详解生命周期 的相关文章

随机推荐

  • 3dmax渲染计算机内存不足怎么办,解决3dmax渲染内存不够导致渲染失败的三种方法...

    3dmax渲染内存不够导致渲染失败应该怎么解决 在使用3dmax渲染效果图的过程之中 如果弹窗提示3dmax渲染内存不足 导致无法渲染或者渲染失败 这种情况我们要怎么办呢 本期 就来和模型云一起看看3dmax提示渲染内存不够导致渲染失败的三
  • 2021年电工杯数学建模A题高铁牵引供电系统运行数据分析及等值建模求解全过程论文及程序

    2021年电工杯数学建模 A题 高铁牵引供电系统运行数据分析及等值建模 原题再现 我国是世界上电气化铁路运营里程最长 服役电力机车型号最多 运营最繁忙的国家 截至 2020 年底 我国铁路年消耗电量约 800 亿千瓦时 约占三峡年总发电量的
  • node.js详解+案例

    系列文章目录 提示 node基础 系统模块 第三方模块 node js 对数据库的操作 增删改查 使用node实现对列表简单的增删改查功能 博客项目连接数据库 博客项目前端 文章目录 系列文章目录 前言 一 node js 是什么 二 No
  • web html做菜单,Web元素设计之导航菜单

    1 横向导航菜单 导航菜单实际上相当于一个列表 自然地 我们可以选择HTML中的列表元素ul来进行实现 HTML 首页 探索 观察 解密 关于 ul本身是一个块级元素 其中包含的列表项li同样也是块级元素 所以要实现横向菜单 我们需要使用到
  • Apache-ant 使用总结

    文章目录 指定特定的 jdk 指定特定的 jdk
  • 【STM32】STM32CUBEMX + ADC(单通道,双通道DMA)

    STM32CUBEMX ADC 单通道 双通道DMA 案例应用 使用ADC采集电压 单通道 单通道 DMA 双通道 DMA 并利用串口打印采集转换后的电压值 1 工具 IAR STM32CUBEMX 开发板STM32F411VET6 预备知
  • 读取云服务器文件列表,读取云服务器文件列表

    读取云服务器文件列表 内容精选 换一换 当卸载数据盘时 支持离线或者在线卸载 即可在挂载该数据盘的云服务器处于 关机 或 运行中 状态进行卸载 弹性云服务器在线卸载磁盘 详细信息请参见在线卸载磁盘 裸金属服务器当前支持将SCSI类型磁盘挂载
  • nginx 神奇的斜线,各种斜线的搭配访问结果

    两台服务器 一台客户端 服务器B1 192 168 1 1 服务器B2 192 168 2 2 客户端C1 127 0 0 1 1 代理模式 在客户端中请求服务器B1 请求路径为 http 192 168 1 1 test api B1 配
  • 计算机条件格式设置方法,excel怎样利用条件格式把

    2013 09 08 怎么设置excel复制默认复制文本 谁知道 可以分几种情况来解决 1 如果是从文本文件复制过来 可以利用EXCEL的外部数据导入功能 点击菜单数据 导入外部数据 导入数据 在打开的对话框中 把文件类型选择为 所有文件
  • docker好难用啊!为啥说它移植性好?

    刚刚接触docker 真的好麻烦啊 不明白为什么要选择docker 我都搞了两天还在搭环境 又告诉我Windows版本过低不适配docker 转而在Ubuntu里装docker 然后MySQL php Nginx又得重新装一遍 好麻烦啊 1
  • C++基础知识 - STL(标准模板库)

    STL主要分为分为三类 algorithm 算法 对数据进行处理 解决问题 步骤的有限集合 container 容器 用来管理一组数据元素 Iterator 迭代器 可遍历STL容器内全部或部分元素 的对象 容器和算法通过迭代器可以进行无缝
  • 软件测试面试题:有验证码的功能,怎么做性能测试?

    有验证码的功能 怎么做性能测试 1 将验证码暂时屏蔽 完成性能测试后 再恢复 2 使用万能的验证码 个人简介 我是一名测试兼开发工程师 目前25K 目前做的是无人驾驶 欢迎和大家一起交流测试技术 一起高薪就业 我们还有一起打妖怪的群哦 还有
  • hdu 1050 Moving Tables

    http acm hdu edu cn showproblem php pid 1050 简单的题目 就是求交叉的路线最多次数 注意 房间可能从大到小 也可能从小到大 1和2属于同一个 2和3也是 等等 include
  • 将桌面文件映射至E盘

    打开 计算机 gt Administrator gt 桌面 DOS添加盘符 不是真实存在的 subst H C 123subst 为创建的意思H 为盘符C 123为C盘下的文件subst H d为删除盘符H Windows7中有一个问题记录
  • linux之安装java教程,一看就会

    一 第一种 1 直接用yun安装jdk yum install java 1 8 0 openjdk x86 64 2 执行完直接直接查看版本就好了 java version 二 第二种 1 进入下载目录 cd usr local src
  • python进阶:python高级编程技巧(中)

    1 通过实例方法名字的字符串调用方法 getattr object name default None 得到一个对象中的name方法 如果没有则返回默认值 map func iterables 第一个传递函数名称 第二个传递一个可迭代的对象
  • 世界首位 AI 机器人「女老板」:24 小时待命,全年无休!

    整理 朱珂欣 出品 CSDN程序人生 ID coder life 作曲 写稿 编代码 眼看 AI 轻松胜任种种工作 如今还成了 老板 近日 波兰酒精饮料公司 Dictador 宣布 已聘请一位机器人担任 CEO 并称 这是全球公司中第一位
  • JS-----数据结构与算法(1)

    目录 一 初识数据结构与算法 1 常见的数据结构 2 算法 二 数组结构 数据类型分类 1 创建一个数组 2 数组的 length 3 数组的索引 4 数组的常用方法 数组常用方法之 push 数组常用方法之 pop 数组常用方法之 uns
  • 线程池创建线程

    定义 使用池化技术来管理和使用现成的技术 就叫做线程池 线程池的优势 总体来说 线程池有如下的优势 1 降低资源消耗 通过重复利用已创建的线程降低线程创建和销毁造成的消耗 2 提高响应速度 当任务到达时 任务可以不需要等到线程创建就能立即执
  • spring IOC 控制反转详解生命周期

    spring IOC 控制反转 通过Spring提供的IoC容器 可以将对象间的依赖关系交由Spring进行控制 避免硬编码所造成的过度程序耦合 用户也不必再为单例模式类 属性文件解析等这些很底层的需求编写代码 可以更专注于上层的应用 AO