Spring Framework系统框架

news2024/9/16 9:54:06

序号表示的是学习顺序

IoC(控制反转)/DI(依赖注入):

ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。


我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean

用对象的时候不用new,直接外部提供(bean)

当外部的对象有关系的时候,IOC给它俩绑好(DI)

DI和IOC组合起来:在容器中建立bean与bean之间的依赖关系的整个过程,因为啥就是比如说

private Dao dao;把它俩对象都装进bean里面(Ioc)然后因为它俩依赖,耦合度太高了,就把它俩关系绑定(DI)。

最终效果:使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系。

IOC入门案例:

1.先在pom.xml中导入spring-context坐标

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

2.创建applicationContext文件

3.在applicationContext文件中配置对应类作为spring管理的bean

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

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

4.初始化IOC容器,通过容器获取bean

ClassPathXmlApplicationContext()是ApplicationContext的实现类,因为ApplicationContext是一个接口,不能创建对象

这里还涉及类型强转,原本是Object现在变成了 BookService

public class App2 {
    public static void main(String[] args) {
        //获取IOC容器
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        BookService bookService= (BookService) ctx.getBean("bookService");
        bookService.save();



    }
}

但是现在还在用new,下面就把new删去

重点就是获取容器,获取bean

DI入门案例:

思路:

1.要删除使用new形式创建的Dao对象

2.然后提供依赖对象对应的setter方法,使需要的Dao对象进入Service中

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

3.配置service与dao之间的关系,也就是绑定dao与service的关系

property标签中的name指的是BookService中的bookDao属性,ref指的是对应bean的id

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

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!--        配置service与dao的关系-->
        <property name="bookDao" ref="bookDao"/>
    </bean>
<!--    2.配置bean-->
<!--    bean标签表示配置bean-->
<!--    id表示给bean起名字-->
<!--    class属性表示给bean定义类型-->

bean的基础配置:

1.基础属性

name:和id差不多,可以给起bean别名,可以用逗号(,)分号(;)空格( )分隔

class:bean的类型或者是说配置bean的全路径类名

<bean id="bookService" name="bookService BOOK" class="com.itheima.service.impl.BookServiceImpl" scope="singleton">

</bean>

注意:如果bean无法通过id或name获取,将无法获取,会抛出异常

NoSuchBeanDefinitionException: No bean named 'bookService1' available

scope:设置bean对象是一个还是多个,默认一个,也就是作用范围

scope="prototype这个是非单例模式,可以创建出多个对象
scope="singleton这个是单例模式,只能创建出一个对象,并且默认就是单例

Bean的实例化(三种):

第一种:构造方法(常用)

java创建对象可以通过直接new和构造方法

public class Person {
    String name;
    int age;
    // 无参构造方法
    public Person() {
        this.name = "未知";
        this.age = 0;
    }

    // 带参数的构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

// 使用无参构造方法创建对象
Person person1 = new Person();

// 使用带参数的构造方法创建对象
Person person2 = new Person("张三", 25);

Bean创建对象是使用的无参构造方法:需要提供一个无参的构造方法,所以配置没有任何变化

如果没有提供无参构造方法会抛出异常:

使用无参构造方法创建bean对象例子:

第二种:静态工厂:

首先创建出一个工厂文件夹,然后注意是static静态工厂

这里配置会有变化

这里的factory-method是工厂里面真正造对象的那个方法

这里的class用于指定工厂类

<bean id="orderDao" factory-method="getBookDao"
class="com.itheima.factory.BookServiceFactory"></bean>

第三种:实例工厂(了解)

配置上有改变:先创建出工厂的对象,还要告诉用工厂里的哪个方法造对象。

第二个bean就没有class了,factory-bean用于指定工厂bean的名称。

 <bean id="BookServiceFactory" class="com.itheima.factory.BookServiceFactory"/>
 <bean id="BookService" factory-method="getBookDao" factory-bean="BookServiceFactory"/>

Spring改进版(实用):FactoryBean(迷迷糊糊)

配置的时候简单了,不用两步了

<bean id="BookService" class="com.itheima.factory.BookServiceFactoryBean"/>

其它代码:把上面的那个getuserDao变成getObject,就是一直固定了,但是也

Bean生命周期:

配置:

init-method:开始的那个方法
destory-method:结束的那个方法

不能因为你写了一个Public init(){}方法,bean就开始,所以这个init-method是标记的。

<bean id="BookService" class="com.itheima.dao.impl.BookServiceImpl" init-method="init"
destory-method="destory"/>

代码如下:

bean的关闭:

用close方法比较暴力,直接关闭

ctx.registerShutdownHook():这个方法用于向 JVM 注册一个关闭挂钩。当 JVM 关闭时,这个挂钩会被执行。它通常用于执行一些清理操作,比如关闭数据库连接、释放资源等。

public class App {
   public static void main(String[] args) {
            //3.获取IOC容器
       ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
           ctx.registerShutdownHook();
           BookService bookService= (BookService) ctx.getBean("bookService");
           bookService.save();
           ctx.close();
        }
    }

setter注入(构造器注入):

如果是传入非引用类型,比如String,int等

先在相应的类下设置这个变量并且创建出它的setter方法

public class BookServiceImpl implements BookService {
    private String chenName;

    public void setChenName(String chenName) {
        this.chenName = chenName;
    }
}

配置上:

主要是第二句

<property name="chenName" value="abcc"></property>

name是属性的名字,value是属性的值

 <bean id="bookService" name="bookService" class="com.itheima.service.impl.BookServiceImpl" scope="singleton">
       <property name="chenName" value="abcc"></property>
    </bean>

以前prooerty经常和ref放在一起,ref属性是用来引用been的,常用于引用类型

构造器注入:

这次就不是用setter方法传,而是用构造方法传

配置上也有变化:用了一个constructor-arg标签

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

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

相关文章

HomeAssistant添加HACS绑定米家与苹果HomeKit设备并实现远程管理

文章目录 前言1. 下载HACS源码2. 添加HACS商店3. 绑定米家设备 前言 之前介绍过如何实现在群晖NAS使用Docker部署HomeAssistant&#xff0c;通过内网穿透在户外控制家庭智能设备。本文将介绍如何在HA平台安装HACS插件商店&#xff0c;将米家&#xff0c;果家设备接入 Home Ass…

推荐清晖一套不错的讲解沟通的线上讲座

推荐清晖一套不错的讲解沟通的线上讲座&#xff0c;比较实际贴地&#xff0c;听完了推荐给大家&#xff1a; 《项目管理中的沟通策略&#xff0c;听出弦外之音&#xff0c;变身沟通达人》 地址&#xff1a;项目管理中的沟通策略&#xff0c;听出弦外之音&#xff0c;变身沟通达…

数据结构(1):ArrayList和顺序表

数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 下面我们就开一个新坑&#xff0c;数据结构。数据结构&#xff0c;简单来说就是存放数据的方式&#xff0c;这些方式多种多样&#xff0c;我们来一点一…

Statcounter Global Stats 提供全球统计数据信息

Statcounter Global Stats 提供全球统计数据信息 1. Statcounter Global Stats2. Mobile & Tablet Android Version Market Share WorldwideReferences Statcounter Global Stats https://gs.statcounter.com/ Statcounter Global Stats are brought to you by Statcounte…

C++ 定时器

这是第一次独立设计一个模块&#xff0c;从接口定义&#xff0c;模块组合到多线程并发可能遇到的各种问题&#xff0c;虽然定时挺简单的&#xff0c;但是想设计精度高&#xff0c;并且能应对高并发似乎也不是很容易&#xff0c;当然&#xff0c;最后没有测试定时器的代码&#…

架构模式:MVC

引言 MVC&#xff0c;即 Model&#xff08;模型&#xff09;-View&#xff08;视图&#xff09;-Controller&#xff08;控制器&#xff09;&#xff0c;是广泛应用于交互式系统中的典型架构模式&#xff0c;尤其在 GUI 和 Web 应用中。 MVC 的概念源自 GOF&#xff08;Gang …

JS解密工具之**如何续期 Charles 的 SSL 证书**

本文由 jsjiami加密/一键JS解密 独家赞助 有问题请私聊加密官方客服 Charles 是一款常用的 HTTP 代理工具&#xff0c;用于调试网络请求。然而&#xff0c;Charles 的 SSL 证书会定期过期&#xff0c;如果 SSL 证书失效&#xff0c;你将无法对 HTTPS 请求进行抓包。本文将详细…

SQL语句中in条件超过1000怎么办?

博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 引言 当遇到SQL语句中IN条件超过1000个的情况时&#xff0c;可以采取以下几种策略来有效处理这一问题&#xff1a; 使用临时表&#xff1a;将IN列表中的值存储在临时表中&#xff0c;并将该临时表与查询表进行J…

【Python 千题 —— 算法篇】寻找最长回文子串

Python 千题持续更新中 …… 脑图地址 &#x1f449;&#xff1a;⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 回文串是指一个字符串从左到右和从右到左读都是一样的。寻找一个字符串中的最长回文子串是许多经典算法问题之一&#xff0c;广泛应…

2024年9月最新界面:自己如何在电脑上注册新的Google谷歌账号,图文详解和关键点解析、常见问题

有一些朋友需要通过谷歌账号来工作、学习或娱乐&#xff08;例如很多游戏需要用谷歌账号来注册和使用&#xff09;&#xff0c;但是不知道如何注册谷歌账号&#xff0c;或者知道如何注册&#xff0c;但是对于一些步骤或者注意事项不太熟悉&#xff0c;导致注册不成功&#xff0…

什么是LED智能会议一体机?COB超微小间距LED会议一体机大势所趋

LED智能会议一体机&#xff0c;作为现代会议室革新的核心装备&#xff0c;正逐步颠覆传统会议模式的界限。它不仅仅是一台集成了高清显示、触控互动、音视频处理及远程协作等功能于一体的智能设备&#xff0c;更是推动会议效率与体验双重飞跃的关键力量。随着技术的不断进步&am…

【重学 MySQL】十八、逻辑运算符的使用

【重学 MySQL】十八、逻辑运算符的使用 AND运算符OR运算符NOT运算符异或运算符使用 XOR 关键字使用 BIT_XOR() 函数注意事项 注意事项 在MySQL中&#xff0c;逻辑运算符是构建复杂查询语句的重要工具&#xff0c;它们用于处理布尔类型的数据&#xff0c;进行逻辑判断和组合条件…

【Protobuf】初识protobuf以及详细安装教程

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 目录 序列化概念 ProtoBuf是什么 ProtoBuf在window下的安装 下载ProtoBuf编译器 配置环境变量 ​编辑 检查是否配置成功 ​编辑 ProtoBuf在Linux下的安装 下载ProtoBuf 安装ProtoBuf 序列化概念 首先我们…

小白开发中遇到的问题和解决方案

小白开发中遇到的问题和解决方案 文章目录 小白开发中遇到的问题和解决方案问题一 问题一 问题&#xff1a;端口别占用可能开开启多个应用 解决方法–在cmd执行下方红框中的命令关闭所有应用

MyBatis-MappedStatement什么时候生成?QueryWrapper如何做到动态生成了SQL?

通过XML配置的MappedStatement 这部分MappedStatement主要是由MybatisXMLMapperBuilder进行解析&#xff0c;核心逻辑如下&#xff1a; 通过注解配置的MappedStatement 核心逻辑就在这个里面了&#xff1a; 继承BaseMapper的MappedStatement 我们看看这个类&#xff0c;里…

idea如何配置模板

配置生成代码指令模板 注&#xff1a;我们常用的有sout,main等指令 第一步打开设置面板 1)按如下操作 2&#xff09;或者CtrlAltS快捷键直接弹出 第二步找 Editor>LiveTemplates 如下图 第三步创建模板 步骤如下 1&#xff09;创建分组名字 2)分组名字 3&#xff09;创…

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

pycharm如何安装selenium

在pycharm中打开一个项目后,点击Setting(ALTCtrlS快捷键) 然后点击install package完成后点击关闭这个窗口,就可以在代码中使用selenium了 成功后出现如下界面 编写一段正常可以运行操作chorme浏览器的 from selenium import webdriver # 指定ChromeDriver的路径driver we…

关于 PC打开“我的电脑”后有一些快捷如腾讯视频、百度网盘、夸克网盘、迅雷等各种捷方式在磁盘驱动器上面统一删除 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142029325 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

淘宝开放平台交易类API解析以及如何测试?

调用淘宝开放平台的订单接口&#xff0c;主要可以通过以下几种途径进行&#xff1a; 1. 直接使用淘宝开放平台提供的API接口 步骤概述&#xff1a; 注册淘宝开放平台账号&#xff1a;首先&#xff0c;你需要在淘宝开放平台注册一个开发者账号。创建应用&#xff1a;在注册并…