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 的相关文章

  • JavaFX Platform.runLater 的使用以及从不同线程访问 UI

    我有几个问题Platform runLater 我有一个 JavaFX 应用程序类 在这个类中 我运行一个线程 该线程从网络套接字读取数据 现在当我创建一个新的Stage在线程内部 系统抛出异常 JavaFX 事件调度程序线程和我的网络读取
  • 实现与扩展:何时使用?有什么不同?

    请用易于理解的语言进行解释或提供某些文章的链接 extends is for 延伸一类 implements is for 实施一个接口 接口和常规类之间的区别在于 在接口中您不能实现任何声明的方法 只有 实现 接口的类才能实现方法 C 中
  • 在 IntelliJ 上进行 Google App Engine Java 开发?

    令人烦恼的是 Google App Engine 已成为其中的另一个项目 他们只发布 Eclipse 插件 如 Spring Webflow 而我更喜欢 IntelliJ 你能用IntelliJ成功运行本地测试环境吗 并调试 部署本地或实时
  • 是否可以从另一个方法传递 args[] 来调用 main 方法?

    我试图从另一个传递参数的方法调用类的主要方法 就像从命令行运行该类时一样 有没有办法做到这一点 您可以致电main方法就像您调用任何其他 静态 方法一样 MyClass main new String arg1 arg2 arg3 Exam
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • BlackBerry SQLite:将一个 SQLite 数据库连接到另一个

    我正在尝试使用 SQLite 将一个 SQLite 数据库附加到 BlackBerry 上的另一个数据库附加数据库 http www sqlite org lang attach html命令 Database d1 d2 Statemen
  • Java 泛型:如何为泛型类型指定类类型?

    我有一个 POJO 指定为 MyClass u where U是泛型类型参数 我正在尝试编写一个接受类引用的实用方法Class u
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • Java:使用 Java.util.concurrent 线程访问读取线程串行端口

    我正在尝试编写一个 Java 串行设备驱动程序并想使用 对我来说是新的 java util concurrent包裹 我有一种发送数据包然后等待 ACK 的方法 我打算有炭 接收在不同的线程中运行 如果接收线程收到 ACK 它应该使用发送数
  • 如何从 Google Custom Search API 获取超过 100 个结果

    我正在尝试使用 Google Custom Search API 在 Java 中进行研究 因此 我需要为每个查询提供一个大的结果集 然而 我似乎仅限于前 100 个结果 这比我需要的要少得多 我使用这样的列表方法 list setStar
  • HTTP PUT 在 Java 中上传文件

    Edit 我想我已经弄清楚如何执行二进制数据部分 仔细检查代码 但我很确定我做对了 现在 当我尝试按照中所述完成上传时遇到新错误Vimeo API 文档 http vimeo com api docs upload streaming Ed
  • 是否可以为 azure blob 存储中的给定目录生成具有写入权限的 SAS(共享访问签名)

    我们的 blob 存储帐户结构 容器名称 simple 在这个容器内我们有 blob aa one zip aa two zip bb ss zip bb dd zip 是否可以生成对aa 目录 有写权限 但对bb 目录 没有访问权限的SA
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 从命令行运行 Maven 插件的语法是什么。

    我看到这里已经有人问过这个问题 如何从命令行执行maven插件 https stackoverflow com questions 12930656 how to execute maven plugin from command line
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor
  • 使用 Runtime.getRuntime().exec() 进行重定向不起作用

    我需要从程序执行命令 命令行是可以的 我在终端试了一下 但是在程序中不行 我从我的代码中添加一个副本 File dir new File videos String children dir list if children null Ei
  • java.io.EOFException:没有更多可用数据 - 预期结束标记 关闭开始标记

    我正在使用 xmpp 开发一个聊天应用程序 根据我们的要求 我们有三台服务器 Apache Tomcat 7 ejabbered 2 1 11 和 mysql 5 5 to run xmppbot on tomcat used below
  • 如何使用剪辑来减少绘画时间?

    我正在尝试使用 Clip 来减少 CPU 负载 但剪辑在屏幕上留下了一些我似乎无法摆脱的垃圾 另外 打开和关闭剪辑似乎对 CPU 负载没有影响 在任一情况下 大部分时间似乎都花在重绘管理器和绘制缓冲图像上 import static jav

随机推荐

  • 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容