Spring-IOC

2023-10-27

IOC相关(一)

Ioc(Inversion of Control)控制反转

传统的对象引用是采用“new 对象”的形式,例如,Book book = new Book,每次引用都需要重新创建,耦合性高。控制反转则是由主动创建转换为外部(IOC容器)自动创建,将对象交给外部容器管理,就自动实现了对象的创建,只需要引用即可。这就是控制反转。

这些被创建或者管理的对象就是统称为Bean。

DI(Dependency Injection)依赖注入

在容器中建立bean与bean之间的关系的整个过程,就是依赖注入:

例如:

public class UserService {

    private UserDao userDao;

    public  void addUserService() {
        userDao.addUserDao();
        System.out.println("UserService add!");
    }
//    属性需要set方法才能注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

UserService需要注入userDao属性,就需要先定义他们为Bean,才能建立联系。

<!--    1,配置bean对象,交给spring容器管理-->
    <bean class="com.wlb.Dao.UserDao" id="userDao1"/>
<!--    2,配置bean属性,依赖注入-->
    <bean class="com.wlb.service.UserService" id="userService">
<!--        属性的注入-->
        <property name="userDao" ref="userDao1"/>
    </bean>

Bean的基础配置

1,name属性,取别名,可以跟id一样被其他bean引用

2,作用范围,scope属性,默认为单例模式(singleton),可以直接复用bean的类型,避免多次创建浪费,对象的创建可以直接用。多例为(prototype)

适合用单例:表现层对象,业务层对象,数据层对象,工具对象

适合用多例:域对象 

例如:

<bean class="com.wlb.service.UserService" id="userService" scope="prototype">
        UserService userService = applicationContext.getBean("userService", UserService.class);
        UserService userService1 = applicationContext.getBean("userService", UserService.class);
        System.out.println(userService);
        System.out.println(userService1);

实例化Bean:(传统 Book book = new Book())

1,构造方法:spring创建Bean的时候,默认调用的是对象的无参构造方法,上述都是这种方法构建的。

2,使用静态工厂实例化Bean。(很少使用)

3,实例工厂初始化Bean,(了解)

4,使用FactoryBean()实例化bean。需要掌握。

bean工厂类,创建

public class BeanFactory implements FactoryBean<BookService> {
//    设置返回对象的类型
    public BookService getObject() throws Exception {
        return new BookServiceImpl();
    }
//返回对象的字节码对象
    public Class<?> getObjectType() {
        return BookService.class;
    }
//    默认是单例模式
    public boolean isSingleton() {
        return true;
    }
}

配置文件:

<bean class="com.wlb.factory.BeanFactory" id="beanFactory"/>

默认是单例模式

依赖注入的方式:(就是用方法往类里面传值)

1,普通方法(setter注入)

简单类型:

//创建setter方法

public class UserDao {
    private int age;
    private String name;

    public void setAge(int age) {
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public  void addUserDao() {
        System.out.println("my name is " + name + "," +age+"岁.");
    }
}

配置属性,用value配置简单类型

 <bean class="com.wlb.Dao.UserDao" id="userDao">
        <property name="age" value="13"/>
        <property name="name" value="李四"/>
    </bean>

引用类型:(参考上文注入方法)

2,构造器注入

简单类型:

构造方法:

public class UserDao {
    private int age;
    private String name;

    public UserDao(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public void addUserDao(){
        System.out.println(name+age);
    }
}

注入类型:方法有三种

<!--        方法一:-->
<!--        <constructor-arg name="name" value="zhangsan"/>-->
<!--        <constructor-arg name="age" value="13"/>-->
<!--        方法二-->
<!--        <constructor-arg index="0" value="13"/>-->
<!--        <constructor-arg index="1" value="wln"/>-->
<!--        方法三-->
<!--        <constructor-arg type="int" value="3"/>-->
<!--        <constructor-arg type="java.lang.String" value="ss"/>-->

引用类型:

构建构造方法

public class UserDao {
    private BookDao bookDao;

    public UserDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void addUserDao(){
        System.out.println("add UserDao!");
    }
    public void addBookDao(){
        bookDao.addBookDao();
    }
}

依赖注入:

  <bean class="com.wlb.Dao.UserDao" id="userDao">
<!--        1,通过构造方法注入类型-->
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>

自动装配

<bean class="com.wlb.Dao.UserDao" id="userDao" autowire="byName">
<bean class="com.wlb.Dao.UserDao" id="userDao" autowire="byType">

两者主要区别为byType会主动去寻找setter方法中的setBookDao

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

中的bookDao类型,要求该类型的Bean是唯一的,推荐。

而ByName中,必须保证容器中有这个bean的名字,也就是上面例子中,配置xml中必须有id=“bookDao”的类型,耦合性高,不推荐

一般来说,构造器注入和setter注入的优先级都比自动注入高,且不能有简单类型的自动装配,因为没必要。

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

Spring-IOC 的相关文章

  • Spring:url 无法正确解析链接

    尽管我对 Java 有丰富的经验 但我对 Spring 框架和 Web 应用程序还很陌生 当我在本地 tomcat 服务器上运行我的网站时 URL 为 http localhost 8080 myApp 现在 请求映射将我委托到我的主页 R
  • 理解 Spring AOP [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 Spring 3 0 框架 但仍然是新手 谁能通俗地解释一下什么是AOP编程 一个简短的例子肯定会有帮助 Spring 如
  • 如何在Spring webflux WebExceptionHandlder中将消息写入http body

    在 的帮助下这个帖子 https stackoverflow com questions 47631243 spring 5 reactive webexceptionhandler is not getting called 我通过自定义
  • java中使用多个分隔符分割字符串

    我正在研究一种数据挖掘算法 我需要使用多个单词来标记字符串 我有一个单独的文件 其中包含所有停用词 我需要做的是通过任何作为分隔符的单词 停用词 来标记输入字符串 例如 如果文件包含停用词 a is and of that 输入字符串变为
  • Motorola Android 2.2 相机忽略 EXTRA_OUTPUT 参数

    我以编程方式打开相机来拍摄视频 我告诉相机使用如下代码将视频文件放置到指定位置 Intent intent new Intent MediaStore ACTION VIDEO CAPTURE File out new File sdcar
  • 在 Java 中,对复杂模型使用接口是否会带来性能提升?

    标题很难理解 但我不知道如何以另一种方式总结 欢迎任何澄清的编辑 我被告知并建议使用接口来提高性能 即使在并不特别需要常规 接口 角色的情况下也是如此 在这种情况下 对象是大模型 MVC 意义上的 具有许多方法和字段 向我推荐的 好用处 是
  • hibernate 如何确保二级缓存使用数据库中的最新数据进行更新

    我读到 使用 hibernate 的二级缓存 它可以通过减少数据 对象检索的数据库命中来提高应用程序性能 但是hibernate是如何保证二级缓存与数据库中的数据是最新的呢 例如 假设下面的类是实体并持久化到数据库中 Entity clas
  • HttpURLConnection 中的 NTLM 身份验证在 JRE 中不起作用,但在 JDK 环境中起作用

    我正在使用 eclipse 开发应用程序的两个部分 Web 部件提供 REST 服务 并对服务的请求进行过滤waffle servlet NegotiateSecurityFilter它提取 Windows 登录信息来识别用户 客户端部分使
  • Apache James 学习资源 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 该计划是创建一个列表阿帕奇 詹姆斯 http james apache org学习资源 涉及从设置到使用
  • Java KeyListener:按下两个键时如何执行操作?

    请看下面的代码 import java awt event import javax swing import java awt public class KeyCheck extends JFrame private JButton ch
  • 我应该在哪里以 Java MVC 模式调用我的 swingworker

    我有一个程序 其设置基本上与此 MVC 示例中的程序一样 http www leepoint net notes java GUI struct 40mvc html http www leepoint net notes java GUI
  • org.apache.http 软件包在 API 级别 23 中被删除。替代方案是什么?

    在更新到最新的 android API 级别 23 Marshmallow 后 通过 build gradle 添加以下更改后 所有 org apache http 类都不起作用 android compileSdkVersion 23 b
  • Java中对象类的继承

    当我读java书时 我遇到了 每个类都扩展类 Object 但是如果想要 B 类扩展 A 类 但是 B 类现在将具有多重继承 一个来自 Object 类 一个来自 A 类 如何解决冲突 谁能解释一下吗 它是多级继承 而不是多重 class
  • Java 8 Streams - 嵌套映射到列表

    firstlist stream map x gt return secondList stream map y gt return a string collect Collectors toList Output I need Get
  • 针对未经身份验证的用户的 Spring Security 404 页面

    我正在使用 Spring Boot 和 Thymeleaf 我有一个自定义 404 模板页面定义在src main resources templates error 404 html 当用户登录时这可以正常工作 然而 当他们注销时 他们不
  • 信号量如何工作?

    信号量可以小于0吗 我的意思是 假设我有一个 N 3 的信号量 并且我调用 down 4 次 那么 N 将保持为 0 但一个进程将被阻塞 反之亦然 如果一开始我调用 N 可以大于 3 吗 因为在我看来 如果 N 可以高于 3 如果一开始我调
  • 为数组生成随机索引

    我知道对于普通整数来说这是这样 但是有索引这样的东西吗 Random dice new Random int n dice nextInt 6 System out println n 你是什 么意思 数组索引是普通数字 所以你可以轻松地做
  • Selenium WebDriver (java) 可以与浏览器的检查工具元素选择器交互吗?

    通过使用 selenium 我可以访问位于检查选项卡中的浏览器元素选择器 在浏览器中按 Ctrl Shift C 吗 我想使用该选择器 指向 一个元素 并使其在浏览器中突出显示 例如 简单的事情如下 WebElement elem driv
  • 正确检查 FTP 服务器连接

    我在程序开始时打开与 FTP 服务器的连接 在对服务器执行操作之前 我想检查连接是否已成功建立 最简单快速的方式 因此如果连接消失 我将尝试再次连接 我用这段代码来做到这一点 private boolean checkConnection
  • 从 HashMap 中查找对象键

    我有一个 HashMap 其键作为我自己的对象 键作为 String 的 ArrayList 有没有一种方法可以从映射中获取与另一个对象相同的关键对象 而无需迭代映射 请注意 我的对象已经实现了 equals 和 hashcode 并且它只

随机推荐

  • java 整合 Elastic 8.

    1 准备工作 使用docker 快速搭建的环境 官网docker compose 方式搭建的集群 设置了密码登录 elastic elastic 需要给jdk 导入证书 找到 证书对应目录 复制到桌面 主要导入下面2个证书 执行如下命令 k
  • 输入学生学号、姓名、三科成绩计算出平均分保存至指定文件中

    include
  • baichuan-53B VS ChatGLM-6B对比

    由于百川智能的内测模型是baichuan 53B 尽管模型大小不一致 为了方便 我们仍然选择百川智能baichuan 53B与ChatGLM 6B内测结果进行对比 其中ChatGLM 6B的结果来自https github com THUD
  • 常见编程错误

    编码示例 内存相关 内存相关 1 scanf d val 读一个整数到一个变量 正确应当传递变量地址 2 bss内存位置 诸如未初始化的全局X变量 总是被加载器初始化为0 但是对于堆内存却并不是这样的 需要程序员显示地将分配的堆内存初始化
  • 【智能时代的颠覆】AI让物联网不再是物联网

    自我介绍 我是秋说 研究人工智能 大数据等前沿技术 传递Java Python等语言知识 主页链接 秋说的博客 学习专栏推荐 MySQL进阶之路 C 刷题集 网络安全攻防姿势总结 欢迎点赞 收藏 留言 如有错误敬请指正 引言 人工智能 AI
  • iscsi删除已失效的链路

    有套rac环境 主机连接存储使用的iscsi方式 使用了一段时间 客户感觉网络设计不合理 需要调整网段vlan和ip地址 首先关闭实例和集群 调整存储端和主机端的ip地址和vlan 调整后可以ping通 使用如下命令配置 两台主机都需要配置
  • MyBatis自动生成实体类(逆向工程)

    mybatis自动生成代码工具 逆向工程 MyBatis自动生成实体类 逆向工程 MyBatis属于一种半自动的ORM框架 它需要我们自己编写sql语句和映射文件 但是编写映射文件和sql语句很容易出错 所以mybatis官方提供了Gene
  • 计算机视觉之三维重建(三)(单视图测量)

    2D变换 等距变换 旋转平移 保留形状 面积 通常描述刚性物体运动 相似变换 在等距变换的基础增加缩放特点 射影变换 共线性 四共线点的交比保持不变 仿射变换 面积比值 平行关系等不变 仿射变换是特殊的射影变换 影消点与影消线 2D无穷远点
  • 《C陷阱与缺陷》学习笔记

    C编译器判断符号的方式是 贪心法 即一直读入下一字符 看能否组成一个符号 直到不可能组成一个符号为止 单引号括起的一个字符表示一个整数 双引号括起的一个字符代表一个指针 float g g是一个函数 该函数的返回值类型为指向浮点数的指针 f
  • 日本核污水排海:普通民众的个人防护指南

    面对日本核污水排海的问题 普通民众需要采取一些个人防护措施 以确保自身的健康与安全 本文将提供一些实用的指南 帮助普通民众做好个人防护 减少潜在的风险 一 了解核污水排放的情况 首先 我们需要充分了解关于核污水排放的背景 科学依据以及相关的
  • SpringMVC:整合JQUERY与JSON

    原文地址 http liuzidong iteye com blog 1069343 参考资料 1 Spring3 MVC 笔记 二 json rest优化 http 7454103 iteye com show full true 2 j
  • 本翻译专栏的说明

    我是一名计算机专业在校学生 主攻C 我英语水平一般 请大家轻喷 我会利用课余时间来翻译cplusplus网站中我感兴趣的内容 最后 祝大家看得开心 有所收获 2023年3月27日制定的翻译计划 Reference的C library的
  • 第二篇 溢出标志 CF与OF

    在汇编学习中 个人感觉CF与OF这两个溢出标志还是有点难理解的 笔者也还是一知半解 若有错误之处 请指正 一 学习CF与OF 要始终牢记一点 CF是无符号数溢出标志 OF是有符号数溢出标志 通俗一点说就是 即使有符号数相加 相减导致了CF
  • STM32(HAL库)——光电编码器、M/T法测量电机转速

    目录 一 编码器 二 电机测试的三种方法 三 STM32CubeMx配置 四 程序编写 五 实验结果 一 编码器 常见的用于电机测速的编码器有霍尔编码器和光电编码器两种 两者测速的基本原理不同 但都是输出两路相位差90 的脉冲信号 这里以光
  • 【数据结构】二叉树的链式结构

    数据结构 二叉树的链式存储结构 二叉树的存储结构 typedef int BTDataType 二叉树的结构 typedef struct BinaryTreeNode BTDataType data 树的值 struct BinaryTr
  • 图像处理中饱和度、色调、对比度的定义

    目录 饱和度 色调 对比度 转自这里 图像处理 image processing 用计算机对图像进行分析 以达到所需结果的技术 又称影像处理 图像处理一般指数字图像处理 数字图像是指用工业相机 摄像机 扫描仪等设备经过拍摄得到的一个大的二维
  • MongoDB数据库

    介绍 1 MongoDB是非关系型文档型数据库 开源 高性能 高可用 高扩展 2 数据存储层级 文档 对应行 gt 集合 对应表 gt 数据库 3 关系型数据库中的一行对应MongoDB数据库中的一个文档 4 存储数据格式是BSON格式 相
  • VTK

    https blog csdn net www doling net article details 8763686
  • 毕业设计基于安卓的校园拍卖系统(附下载链接)

    基于安卓的校园拍卖系统 含导出APP 点我下载源码资源 介绍 基于安卓的校园拍卖系统 使用IDEA开发 SQLite作为数据库 支付宝沙盒作为支付工具 系统具有用户登录注册 管理员登录 发布商品 商品竞价 商品审核 支付尾款等功能 使用说明
  • Spring-IOC

    IOC相关 一 Ioc Inversion of Control 控制反转 传统的对象引用是采用 new 对象 的形式 例如 Book book new Book 每次引用都需要重新创建 耦合性高 控制反转则是由主动创建转换为外部 IOC容