Spring中IOC容器

news2025/7/18 12:38:10

IOC入门案例思路分析

1.管理什么(Service和Dao)

2.如何将管理的对象存放到IOC容器(配置applicationContext.xml)第二步

3.将管理的对象存放到IOC容器,如何获取IOC容器 第三步

4.获取到IOC容器后,如何从容器中获取bean(即管理的对象)第四步

5.使用Spring导入坐标(pom.xml)第一步

基本内容

package com.huhu.dao;

public interface BookDao {
    void save();
}

package com.huhu.dao.impl;

import com.huhu.dao.BookDao;

public class BookDaoImpl implements BookDao {

    public void save() {
        System.out.println("Bookdao save ....");
    }
}
package com.huhu.service;

public interface BookService {
    void save();
}
package com.huhu.service.impl;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;

public class BookServiceImpl implements BookService {
    private BookDao bookDao=new BookDaoImpl();
    public void save() {
        System.out.println("BookService save ....");
        bookDao.save();
    }
}

第一步:导入坐标

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
    </dependencies>

第二步:配置bean

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

  <bean id="bookService" class="com.huhu.service.impl.BookServiceImpl"/>
 

第三步:获取IOC容器和 第四步:获取bean 

package com.huhu;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App2 {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        System.out.println();
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

实现结果: 

 

DI 入门案例

基本内容与上面差不多,唯一修改的就是BookServiceImpl类

package com.huhu.service.impl;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;

public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    public void save() {
        System.out.println("BookService save ....");
        bookDao.save();
    }

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

bean配置 ref中bookDao与bookDaoImpl类注入bean定义id属性值bookDao一致

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

    <bean id="bookService" class="com.huhu.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>

 测试结果依旧不变

bean起别名添加name属性 

获取bean可以使用name属性值也可以id属性值(建议id)

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

    <bean id="bookService" class="com.huhu.service.impl.BookServiceImpl">
        <property name="bookDao" ref="dao"/>
    </bean>

bean作用范围配置默认单例

package com.huhu;

import com.huhu.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        BookDao bookDao2 = (BookDao) ctx.getBean("bookDao");
        System.out.println(bookDao);
        System.out.println(bookDao2);
    }
}

修改单例的话在配置文件编辑scope域=prototype

<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl" scope="prototype"/>

    <bean id="bookService" class="com.huhu.service.impl.BookServiceImpl">
        <property name="bookDao" ref="dao"/>
    </bean>

 

bean创建方式

第一种:默认无参构造方法(可不写) (private也可以被调用使用反射)一旦加了有参就必须写上无参构造方法

<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl"/>
public class BookDaoImpl implements BookDao {
    private BookDaoImpl(int i){
        System.out.println("Bookdao constructor is running...");
    }
    public void save() {
        System.out.println("Bookdao save ....");
    }
}

没有无参构造方法后,报错Caused by: java.lang.NoSuchMethodException: com.huhu.dao.impl.BookDaoImpl.<init>() 

第二种:静态工厂 (早期使用最多,了解即可)(基本内容如下)

package com.huhu.dao;

public interface OrderDao {
    void save();
}
package com.huhu.dao.impl;

import com.huhu.dao.OrderDao;

public class OrderDaoImpl implements OrderDao {
    public void save() {
        System.out.println("OrderDao save ...");
    }
}
package com.huhu.factory;

import com.huhu.dao.OrderDao;
import com.huhu.dao.impl.OrderDaoImpl;

public class OrderDaoFactory {
    public static OrderDao getOrderDao(){
        return new OrderDaoImpl();
    }
}
package com.huhu;

import com.huhu.dao.OrderDao;
import com.huhu.factory.OrderDaoFactory;

public class AppForInstanceOrder {
    public static void main(String[] args) {
        //通过静态工厂创建对象
        OrderDao orderDao = OrderDaoFactory.getOrderDao();
        orderDao.save();
    }
}

使用静态工厂实例化bean

<!--使用静态工厂实例化bean-->
    <bean id="orderDao" class="com.huhu.factory.OrderDaoFactory" factory-method="getOrderDao"/>
package com.huhu;

import com.huhu.dao.OrderDao;
import com.huhu.factory.OrderDaoFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceOrder {
    public static void main(String[] args) {
        //通过静态工厂创建对象
//        OrderDao orderDao = OrderDaoFactory.getOrderDao();
//        orderDao.save();

        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
        orderDao.save();
    }
}

 

第三种:实例工厂 (基本内容如下) 

package com.huhu.dao;

public interface UserDao {
    void save();
}
package com.huhu.dao.impl;

import com.huhu.dao.UserDao;

public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("UserDao save ...");
    }
}
package com.huhu.factory;

import com.huhu.dao.UserDao;
import com.huhu.dao.impl.UserDaoImpl;

public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}
package com.huhu;

import com.huhu.dao.UserDao;
import com.huhu.factory.UserDaoFactory;

public class AppForInstanceUser {
    public static void main(String[] args) {
        UserDaoFactory userDaoFactory = new UserDaoFactory();
        UserDao userDao = userDaoFactory.getUserDao();
        userDao.save();
    }
}

 使用实例工厂实例化bean

<!--使用实例工厂实例化bean-->
    <bean id="userFactory" class="com.huhu.factory.UserDaoFactory"/>
    <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
package com.huhu;

import com.huhu.dao.UserDao;
import com.huhu.factory.UserDaoFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceUser {
    public static void main(String[] args) {
//        UserDaoFactory userDaoFactory = new UserDaoFactory();
//        UserDao userDao = userDaoFactory.getUserDao();
//        userDao.save();

        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) ctx.getBean("userDao");
        userDao.save();
    }
}

 

优化创建UserDaoFactoryBean类代替UserDaoFactory类(实用)

package com.huhu.factory;

import com.huhu.dao.UserDao;
import com.huhu.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;

public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //代替原始实例工厂中创建对象的方法
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    //获取对象类型
    public Class<?> getObjectType() {
        return UserDao.class;
    }
}
<!--使用FactoryBean实例化bean-->
    <bean id="userDao" class="com.huhu.factory.UserDaoFactoryBean"/>

bean生命周期 

暴力关闭容器(实际开发不使用)

package com.huhu.dao.impl;

import com.huhu.dao.BookDao;

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

    public void init(){
        System.out.println("init ...");
    }

    public void destroy(){
        System.out.println("destroy ...");
    }
}
<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
ClassPathXmlApplicationContext子类型替代ApplicationContext父类型,才可关闭容器
package com.huhu;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

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

 设置关闭钩子(哪个位置都可以)在虚拟机退出前先关闭容器在退出虚拟机

package com.huhu;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

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

优化篇实现接口(了解即可)

<bean id="bookService" class="com.huhu.service.impl.BookServiceImpl">
        <property name="bookDao" ref="dao"/>
    </bean>
package com.huhu.service.impl;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;
    public void save() {
        System.out.println("BookService save ....");
        bookDao.save();
    }

    public void setBookDao(BookDao bookDao) {
        System.out.println("set...");
        this.bookDao = bookDao;
    }

    public void destroy() throws Exception {
        System.out.println("BookService destroy ...");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("BookService init ...");
    }
}
package com.huhu;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

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

结果如下:

总结:初始化容器

步骤:1创建对象 2执行构造方法 3执行属性注入(set)4执行bean初始化方法 

使用bean:执行业务操作

关闭/销毁容器:执行bean销毁方法(容器关闭前触发bean的销毁)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

纷繁复杂见真章,华为云产品需求管理利器CodeArts Req解读

摘要&#xff1a;到底什么是需求&#xff1f;又该如何做好需求管理&#xff1f;本文分享自华为云社区《纷繁复杂见真章&#xff0c;华为云产品需求管理利器 CodeArts Req 解读》&#xff0c;作者&#xff1a;华为云头条 。 2022 年 8 月&#xff0c;某国国税局获得数十亿美元新…

【Keras计算机视觉OCR文字识别】文字检测算法中CTPN、CRAFT的讲解(图文解释 超详细)

觉得有帮助麻烦点赞关注收藏~~~ 一、OCR文字识别的概念 OCR&#xff08;Optical Character Recognition&#xff09;图像文字识别是人工智能的重要分支&#xff0c;赋予计算机人眼的功能&#xff0c;可以看图识字。如图6-1所示&#xff0c;图像文字识别系统流程一般分为图像采…

干掉满屏的 try-catch,这样写太香了!

背景 软件开发过程中&#xff0c;不可避免的是需要处理各种异常&#xff0c;就我自己来说&#xff0c;至少有一半以上的时间都是在处理各种异常情况&#xff0c;所以代码中就会出现大量的try {...} catch {...} finally {...} 代码块&#xff0c;不仅有大量的冗余代码&#xf…

Windows系统如何部署Rabbit和启动Rabbit服务

如何部署Rabbit和启动Rabbit服务第一步&#xff1a;安装otp下载OPT应用&#xff1a;安装OPT第二部&#xff1a;安装Rabbit下载Rabbit安装Rabbit执行命令&#xff0c;添加可视化插件第三步&#xff1a;启动Rabbit服务第四步&#xff1a;在网页验证rabbit服务器启动第一步&#x…

题目给出一个字符串s1,我们可以用递归的方法将字符串分成两个非空的子串来将s1表示成一个二叉树

题目给出一个字符串s1&#xff0c;我们可以用递归的方法将字符串分成两个非空的子串来将s1表示成一个二叉树 下面是s1“coder”的一种二叉树的表现形式&#xff1a; 将字符串乱序的方法是&#xff1a;选择任意的非叶子节点&#xff0c;交换它的两个孩子节点。 例如&#xff1…

图扑虚拟现实解决方案,实现 VR 数智机房

如今&#xff0c;虚拟现实技术作为连接虚拟世界和现实世界的桥梁&#xff0c;正加速各领域应用形成新场景、新模式、新业态。 效果展示 图扑软件基于自研可视化引擎 HT for Web 搭建的 VR 数据中心机房&#xff0c;是将数据中心的运营搬到 VR 虚拟场景。以数据中心实际场景为…

new String 到底创建几个对象的问题困扰

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

Sharding-Proxy查询分库分表数据,很方便!!

##背景 目前公司不大&#xff0c;没有方便的数据库平台支持分库分表数据的查询&#xff0c;每次只能拿到分表的数据字段&#xff0c;手动hash获得标的索引&#xff0c;再去物理表查询&#xff0c;费时费力 ##改造 目前市面上有很多mysql分库分表的代理&#xff0c;自己选择了S…

24.前端笔记-CSS-vertical-align属性

1、vertical-align属性使用场景 经常用于设置图片或表单&#xff08;行内块元素&#xff09;和文字垂直对齐。 只对行内元素或行内块元素有效 vertical-align:baseline|top|middle|bottom值描述baseline默认&#xff0c;元素放在父元素的基线上top把元素顶端与行种最高元素顶…

这款 Java 性能调优的可视化工具,你真的会用吗?

VisualVM 是Netbeans的profile子项目&#xff0c;已在JDK6.0 update 7 中自带&#xff0c;能够监控线程&#xff0c;内存情况&#xff0c;查看方法的CPU时间和内存中的对 象&#xff0c;已被GC的对象&#xff0c;反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来…

以太网 VLAN(VLAN划分方式)

2.8.3 以太网 VLAN&#xff08;VLAN划分方式&#xff09; VLAN的划分方式有2.8.3 以太网 VLAN&#xff08;VLAN划分方式&#xff09;一、基于端口划分二、基于MAC地址划分三、基于IP子网划分四、基于协议划分五、基于策略划分一、基于端口划分 简述&#xff1a;端口上进行手动…

python安装 yaml、pymysql、python-docx

python安装 yaml E:\python3.10.7>pip install pyyaml python安装 pymysql E:\python3.10.7>pip install pymysql python安装 python-docx E:\python3.10.7>pip install python-docx python安装 sqlalchemy E:\python3.10.7>pip install sqlalchemy

客快物流大数据项目(九十四):ClickHouse的SummingMergeTree入了解

文章目录 ClickHouse的SummingMergeTree深入了解 一、创建SummingMergeTree引擎表的的语法 二、创建Su

Dubbo SPI机制核心原理,你掌握了吗?|原创

这篇文章内容很干&#xff0c;做好心理准备&#xff01;本文详细讲解了 Dubbo SPI 诞生原因以及它的用法&#xff0c;并且详细解读了核心类 ExtensionLoader 的关键属性&#xff0c;再根据demo 对 SPI 的加载原理进行详细解读。文章较长&#xff0c;建议收藏&#xff01;文末有…

【BP回归预测】基于matlab随机蛙跳算法SFLA优化神经网络数据回归预测【含Matlab源码 2272期】

⛄一、蛙跳算法 1 改进的免疫蛙跳算法 免疫蛙跳算法具有混合蛙跳算法的全局优化与局部细致搜索优点, 可以优化连续问题和离散问题, 具有较强的鲁棒性;同时, 群体具有的免疫机制对群体进行控制和调节, 把目标函数和制约条件作为青蛙群体的抗原, 保证生成的青蛙群体直接与问题相…

亚马逊爆锤之下,中国跨境电商出路何在?

跨境电商服务行业已经发展了十几年了&#xff0c;加之新冠疫情的影响&#xff0c;众多卖家企业都将视线转向了跨境电商市场&#xff0c;行业里一直不断涌现着众多的服务平台&#xff0c;今年&#xff0c;许多像Starday这样的新生跨境电商服务平台在行业里势头猛进&#xff0c;而…

ImmunoChemistry丨ICT艾美捷一氧化氮合酶说明书

ImmunoChemistry艾美捷一氧化氮合酶测定为评估亚硝化应激抑制剂和活化剂的效力提供了一个很好的筛选选择&#xff0c;并将有助于确定氧化和亚硝化应激如何调节不同的细胞内途径。该试剂盒使用二氨基荧光素-2二乙酸酯&#xff08;DAF-2DA&#xff09;染料评估细胞内游离一氧化氮…

原生API编写简单富文本编辑器003

原生API编写简单富文本编辑器003 系列文章快速阅读&#xff1a; 富文本编辑器开发系列-1-基础概念 富文本编辑器开发系列2-document.execCommand 的API 富文本编辑器开发系列3-selection 富文本编辑器开发系列4——Range对象 富文本编辑器开发系列5——浏览器Selection API探究…

思科设备中STP生成树协议及其配置

目录 一、网络冗余存在的问题 1.广播风暴 2.MAC地址表震荡 二、STP简介 1.BPDU简介与字段含义 2.网桥ID 3.路径开销 4.端口ID 5.BPDU计时器 &#xff08;1&#xff09;Hello Time &#xff08;2&#xff09;Forward Delay转发延迟 &#xff08;3&#xff09;Max Ag…

[附源码]JAVA毕业设计小区物业管理系统录像展示.mp4(系统+LW)

[附源码]JAVA毕业设计小区物业管理系统录像展示.mp4&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09…