首页 > 其他分享 >Spring学习笔记--1.IoC入门

Spring学习笔记--1.IoC入门

时间:2024-06-11 16:58:32浏览次数:19  
标签:service -- Spring bookDao BookDao new IoC public

Spring学习笔记

一、IoC入门

1.什么是IoC

IoC即控制反转,一个类不再主动控制创建自己所依赖的类,而是交给外部容器去控制创建自己所依赖的类。例如,有一个汽车厂,原本想要制作一辆汽车,需要自己制作发动机、轮胎、方向盘等零部件,汽车就是这个类,发动机和轮胎就是它的依赖项,这些依赖项需要汽车自己用new创建出来;使用IoC之后,这些零件就不需要汽车厂自己去制作了,都交给外部别的厂商去制作,汽车厂只需要把这些零件拼装起来。这里的外部厂商就是ApplicationContext.

2.IoC的好处

有了IoC之后,代码的耦合性就会大大降低,原本,当一个类的依赖改变时,这个类里面的源代码必须修改,因为在类内new了这个依赖,而现在不需要在类内new这个依赖,只需要修改对应的配置文件即可

3.例子

这是一个BookDao的实现类,代表一本book

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

这是一个sercice的实现类,其内部依赖于BookDao去调用save方法

public class serviceImpl implements service {
    private BookDao bookDao;
    @Override
    public void SaveBook(){
        System.out.println("BookService working");
        bookDao.save();
    }

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

这是main方法

  public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        service service = (service) context.getBean("serviceImpl");
        service.SaveBook();
    }

可以看到,在main方法中,并没有调用sercice中的setBookDao()这个方法,而service类的内部也没有new一个BookDao,但代码是可以正常执行的,没有报空指针异常,这是因为ApplicationContext这个容器自动调用了set方法创建了一个BookDao的对象,并赋值给了service内部的bookDao属性。而这是通过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">
    <bean id="bookDaoImpl" class="com.cexy.dao.impl.BookDaoImpl"/>
    <bean id="serviceImpl" class="com.cexy.service.impl.serviceImpl">
        <property name="bookDao" ref="bookDaoImpl"/>
    </bean>
</beans>

可以看到这里配置了两个bean,一个是bookDaoImpl,一个是serviceImpl。配置serviceImpl的作用是在main方法中,可以不用手动new一个serviceImpl的对象,而是可以直接通过

service service = (service) context.getBean("serviceImpl");

来获取。
主要到它的bean中还有property这个标签,这是用来说明依赖关系的,即告诉编译器类中有一个依赖,类型对应ref="??"中的类型,在创建这个类时,容器会自动new出这个依赖,并通过set方法赋值给类中的属性。在示例代码中,service的依赖就是BookDao,于是通过

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

让private BookDao bookDao;有了值。但是注意,配置中property标签的属性name对应的值并不是类中属性的名字,而是set函数中传递的形参的名字,即

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

中的形参名bookDao,与类本身属性名无关。

标签:service,--,Spring,bookDao,BookDao,new,IoC,public
From: https://blog.csdn.net/weixin_65795597/article/details/139602559

相关文章

  • NAT-DDNS内网穿透技术,快解析DDNS的优势
    进行NAT穿透,是为了使具有某一个特定源IP地址和源端口号的数据包不被NAT设备屏蔽而正确路由到内网主机。对于穿透类型,一般分为两大类,一是基础NAT,另一个是NAPT,大家可能并不怎么了解。今天小编来为大家详细说一说内网穿透技术中基础NAT和NAPT,以及NAPT中对称型NAT和非对称型N......
  • 简洁免费的内网穿透工具
    1.什么是内网穿透?内网穿透,即内网映射,本地服务器内网IP端口,提供到外网连接访问的实现和过程。通俗来说就是将局域网电脑访问和别人电脑访问通过快解析内网端口映射外网,互连互通,让本地内部内网的数据能在别人的电脑上可以获取。内网穿透可以将原本只能在本机上访问的项目网站等,......
  • 内网穿透的几种方式
    如何在任何地方都能访问自己家里的笔记本上的应用?如何让局域网的服务器可以被任何地方访问到?有很多类似的需求,我们可以统一用一个解决方案:内网穿透。内网穿透的工具及方式有很多,如Ngrok、Ssh、autossh、Natapp、Frp、Lanproxy、Spike、花生壳等等,今天给大家介绍一款小编亲自测......
  • 内网穿透的方式有哪些——快解析的优势
    外网穿透内网技术,即内网映射,是把目标本地内网地址和端口发布到互联网,是一种由内网开放到外网的权限操作。那么,内网穿透的方法有哪些呢?做映射外网的方法。需要结合自己本地网络环境和应用场景来实施。这里分享三种方法,只要是能上网的网络环境,都可以通过这三种方式实现内网穿透。......
  • NET8中增加的简单适用的DI扩展库Microsoft.Extensions.DependencyInjection.AutoActiv
    这个库提供了在启动期间实例化已注册的单例,而不是在首次使用它时实例化。单例通常在首次使用时创建,这可能会导致响应传入请求的延迟高于平时。在注册时创建实例有助于防止第一次Request请求的SLA以往我们要在注册的时候启动单例可能会这样写://注册:services.AddSingleton<Fil......
  • 智能蓝牙脂肪秤方案pcba模组
    随着各种疾病的知识普及和人们生活方式发生的改变,越来越多的人注意到健康问题,拿经常坐办公室的人群来说,他们对于腰颈椎和肥胖的问题就关注度比较高,因为经常久坐和点外卖,再加上工作量大没有空闲时间锻炼身体,久而久之就慢慢变胖。智能蓝牙脂肪秤方案具有人体称重和脂肪率两......
  • linux内存管理(四)- 用户空间的内存分配在kernel中的实现
    malloc是常用的用户态分配内存的接口,它会调用brk系统调用来请内存分配内存。下面看看该系统调用的实现。插一句,每次调用malloc的时候未必都会调用brk去从kernel分配实际的内存,因为每次系统调用都是有开销的,为了避免频繁的陷入内核,malloc会多申请一部分内存当作内存池,之后要申请内......
  • Image 32 动画演示1
    Image32自带的Demo,添加一些注解。 unituFrmAnimation;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Classes,System.Variants,System.Math,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls,Vcl.ExtCtrls,//......
  • 微信小程序支付、接单、取消订单和拒单都没在后端接收到参数,可能原因:
    原因是:支付要用到微信的接口weChatPayUtil进行pay操作接单、取消订单和拒单后,将进行退款,也要用到微信的接口weChatPayUtil退款//付款payJSONObjectjsonObject=weChatPayUtil.pay(ordersPaymentDTO.getOrderNumber(),//商户订单号newBigDecimal(0.01)......
  • Python 字符串
    Python字符串Python中的字符串是一种常见且重要的数据类型,用于存储文本信息。字符串是不可变的,即一旦创建,就不能更改其内容。但我们可以创建新的字符串作为修改的结果。以下是关于Python字符串的一些基本操作和功能的介绍。数据类型转字符串在Python中,你可以使用str()......