初始Spring与SpringIOC容器

news2024/11/15 17:53:58

一、 Spring框架的基本理解

Spring框架是一款轻量级的开发框架, 核心思想是IOC (控制反转) AOP (面向切面编程)
为Java 应用程序开发提供组件管理服务,用于组件之间的解耦,以及简化第三方JavaEE中间件技术的使用( JMS、任务调度、缓存、ORM 框架),是一个基础架构型的开发框架;


Spring框架包括: IOC 容器Validation 数据校验AOP 面向切面编程、Transaction
s事务管理
Spring JDBC Spring MVC框架、以及各类第三方JavaEE 中间件技术集成;
 

二、什么是SpringIOC?

  • IOC的作用是解耦,使用IOC容器管理项目组件之间的耦合关系
  • IOC:是Spring框架的核心思想之一,主要用于解耦。IOC是指将创建对象控制权转移给Spring框架 根据配置文件注解等方式,创建bean对象并管理各个bean对象之间的依赖关系。使对象之间形成松散耦合的关系,实现解耦;
  •         控制:指的是对象创建(实例化、管理)的权力
  •         反转:控制权交给外部环境(| Spring 框架、IoC容器)

三、Spring lOC容器的理解

(IOC容器的作用、存储形式、初始化过程)


IOC通常被理解为IOC Container容器,IOC容器其实就是一个Map,key是每个bean对象的ID,value是bean对象本身。IOC容器负责创建bean对象管理bean的生命周期。并且根据配置好的配置文件或注解管理IOC容器的每个bean,以及根据bean之间的依赖关系,完成bean之间的注入。


IOC容器属于Spring Core模块,用来创建和管理Bean,默认使用单例的方式将bean存储
DefaultListableBeanFactory 类beanDefinitionMap 中(一 个ConcurrentHashMap 类
型的Map集合
);


IOC容器使用ConcurrentHashMap 集合存储了BeanDefinition 对象,该对象封装了Sprin
g对一个Bean 所有配置信息,包括:类名属性,构造方法参数依赖是否延迟加载是否是
单例
等配置信息;

 四、Spring框架由哪些模块组成?

        官方文档描述,由7个模块组成

Spring Framework 根据官方文档的描述,主要包括以下常用5个模块

1.Core:核心模块

        包括:IOC  Container(loc容器),Events(事件通知机制)、Resources(资源加载机制)、i18n(国际化)、Validation(数据校验)、Data Binding(数据绑定)、Type Conversion(类型转换),SpEL(Spring表达式)、AOP(面向切面编程)

2.Testing:测试模块
        包括:Mock 0biects(测试模拟对象),TestContext Framework(测试框架),Spring MVCTest(用于测试Spring Mvc),webTestclient(用于测试 Webclient、Restful、 webflux 等);

3.Data Access:数据访问模块

        包括:Transactions(事务管理),DA0support(统一的 Data Access 0bject DA0 模式封装),JDBc(Spring对于DC的操作封装),0/RMapping(Spring 对于对象关系映射框架的封装,例如 Hibernate等框架)等;
4.Web Servlet:基于Servlet的Web应用开发
        包括:Spring MVc( Spring 基于 MVC 模式设计封装的 Web框架),Websocket(Spring集成 Websocket,websocket 是一个服务器与客户端双向通信的技术)等;
5.Integration:企业级系统集成模块(不同系统之间的交互集成)
        包括:Remoting(spring 用于在分布式系统中进行远程服务调用的通讯框架),IMS(Spring集成各类Java消息中间件、Java消息服务[JavaMessage Service]、例如ActiveMQ等),Java Emai1(邮件发送),Tasks Scheduling(任务调度);

 五、Spring项目——硬编码实现解耦

SpringIOC(控制反转):解耦

思想:高内聚,低耦合编程思想

硬编码实现解耦:

        1.不要直接new对象,通过反射创建

        2.将需要创建的对象独立报讯在资源文件中,动态加载

 jdbc.properties配置文件:

msg1 = com.mysql.cj.jdbc.Driver
msg2 = jdbc:mysql://localhost:3306/schoolp?serverTimezone=GMT
msg3 = root
msg4 = password

 1.高耦合(直接new对象)

        /** 高耦合*/
        DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
        Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/schoolp?serverTimezone=GMT","root","password");
        System.out.println(root);

2.中耦合(反射)

//1.加载驱动(反射)       
 Class.forName("com.mysql.cj.jdbc.Driver()");
        
//2.获取连接对象
Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/schoolp?serverTimezone=GMT","root","password");

//3.测试
System.out.println(root);

3.低耦合

步骤:

        1.创建工具类

        2.加载文件

        3.通过key获取value

        4.获取连接

 具体实现:

        //1.创建工具类
        Properties properties = new Properties();

        //2.加载文件
        InputStream inputStream = Test01.class.getClassLoader().getResourceAsStream("jdbc.properties");
        properties.load(inputStream);

        //3.通过key获取value
        String driver = properties.getProperty("msg1");
        String url = properties.getProperty("msg2");
        String name = properties.getProperty("msg3");
        String pwd = properties.getProperty("msg4");

        //4.获取连接
        Class.forName(driver);
        Connection root = DriverManager.getConnection(url, name, pwd);
        System.out.println(root);

六、创建SpringIOC容器

(1)坐标

(2)配置文件

用beans.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="student" class="com.zad.pojo.Student"/>
    <!-- 注入类 -->
    <bean id="dao" class="com.zad.dao.UserDaoImpl"/>
    <!-- 注入日期类 -->
    <bean id="date" class="java.util.Date"/>
</beans>

 pom.xml:

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

    </dependencies>

dao层:

IUserDao:
public interface IUserDao {
    public void save();
}

UserDaoImpl:

public class UserDaoImpl implements IUserDao{

    @Override
    public void save() {
        System.out.println("===dao的新增方法===");
    }
}

pojo层:Student类

public class Student {
    
}

测试类:

public class Test1 {
    public static void main(String[] args) {
        //1.加载spring核心配置文件,获取spring容器对象
        BeanFactory applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        //2.获取对象
        Student student = (Student) applicationContext.getBean("student");
        System.out.println(student);

        IUserDao dao = (IUserDao) applicationContext.getBean("dao");
        dao.save();

        Date date = (Date) applicationContext.getBean("date");
        System.out.println(date);
    }
}

用 BeanFactory:

beans.properties:

dao=com.zad.dao.UserDaoImpl
service=com.zad.service.UserServiceImp

util包:BeansFactory

public class BeansFactory {

    //按照用户需求以解耦的方式创建对象
    public static Object getBean(String key)  {
        try {
            //1.创建工具类:用来读取配置文件中的键值对数据
            Properties properties = new Properties();
            //2.加载文件
            InputStream inputStream = Text01.class.getClassLoader().getResourceAsStream("beans.properties");
            properties.load(inputStream);
            //3.通过key获取value
            String classPath = properties.getProperty(key);
            return
                    Class.forName(classPath).newInstance();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return  null;


    }
}

controller层:

IUserController:
public interface IUserController {
    public void save();
}
UserControllerImpl:
public class UserControllerImpl implements IUserService {

    //高耦合
//    IUserService service = new UserServiceImp();
    //低耦合
    IUserService service = (IUserService) BeansFactory.getBean("service");

    @Override
    public void save() {
        System.out.println("===controller的新增方法===");
        service.save();

    }
}

dao:

IUserDao:
public interface IUserDao {
    public void save();
}
UserDaoImpl:
public class UserDaoImpl implements IUserDao{

    @Override
    public void save() {
        System.out.println("===dao的新增方法===");
    }
}

 service:

public interface IUserService {
    public void save();
}
UserServiceImp:
public class UserServiceImp implements IUserService{
    //低耦合
    IUserDao dao = (IUserDao) BeansFactory.getBean("dao");

    @Override
    public void save() {
        System.out.println("===service的新增方法===");
        dao.save();
    }
}

测试类:

public class Text01 {
    public static void main(String[] args) {
        UserControllerImpl controller = new UserControllerImpl();
        controller.save();
    }
}
spring两大思想:

一.IOC控制反转 DI依赖注入
    IOC容器:springIOC搭建spring容器管理程序中的各个组件(class)让程序可以实现高内聚,低耦合的编程

二.AOP面向切面编程


spring环境搭建:
    1.坐标
    2.配置文件

springIOC:
    1.找到需要以解耦方式获取实例对象的类
    2.将需要spring管理的类注入spring容器
        <bean id="唯一标识" class="类"></bean>
    3.向spring容器中索取java实例(解耦)
            3.1.加载spring核心配置文件,获取spring容器对象
                ApplicationContext applicationContext =  new ClassPathXmlApplicationContext("beans.xml");
            3.2.获取对象
                Student student = (Student) applicationContext.getBean("student");

Demo02                  Demo3
beans.properties        beans.xml
key=value               id=class
BeansFactory            ApplicationContext
getBean(key)            getBean(id)

SpringIOC:
    ● IOC名词解释,作用是解耦,使用IOC容器管理项目组件之间的耦合关系
    ● IOC( Inversion of Control,中文释义:控制反转  ) 是Spring框架的核心思想之一,
        主要用于解耦。IOC是指将创建对象的控制权转移给Spring框架进行管理。由Spring框架根
        据配置文件或注解等方式,创建bean对象并管理各个bean对象之间的依赖关系。使对象之间
        形成松散耦合的关系,实现解耦;
      ○ 控制 :指的是对象创建(实例化、管理)的权力
      ○ 反转 :控制权交给外部环境(Spring框架、IoC容器)

关键字:
    BeanFactory(父)
    ApplicationContext(子)

        ClassPathXmlApplicationContext============>通过加载主配置文件的相对路径,获取spring容器
        FileSystemXmlApplicationContext===========>通过加载主配置文件的绝对路径,获取spring容器
        AnnotationConfigApplicationContext========>加载配置类,获取spring容器

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

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

相关文章

python XML2SRS

step 1:练习XPATH 选取text-property标签具有nametext 属性值的标签的值 //text-property[nametext] import os import lxml.etree as etree dir "E:\\" for file in os.listdir(dir):if file.endswith(.rptdesign):with open(dirfile,r,encodingutf-8) as f:firs…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(五)卡尔曼滤波器一:认知卡尔曼滤波器;协方差矩阵与方差;

卡尔曼滤波器 为了研究卡尔曼&#xff0c;我阅读了大量博文。不敢说完全吃透&#xff0c;但是在做一件什么事&#xff0c;可以通过下面这文章来理解&#xff0c;我读了不下五遍。并整理标准重点&#xff0c;添加自己的一些见解。 自动驾驶传感器融合算法 - 自动驾驶汽车中的激…

mprpc框架的应用示例

一、注册 有一个本地服务&#xff0c;我想把它发布成远程服务&#xff0c;首先在user.proto中定义rpc方法的描述&#xff0c;定义参数和响应的消息类型 然后在userservice.cc文件中通过继承UserServiceRpc这个类&#xff0c;重写一下响应的方法&#xff08;打四个动作&#xf…

深入了解Synchronized原理

深入了解Synchronized原理 第一章&#xff1a;并发编程中的三个问题1.1 可见性1.2 原子性1.3 有序性 第二章&#xff1a;Java内存模型(JMM)2.1 计算机结构简介2.2 Java内存模型 Java Memory Molde 第三章&#xff1a;synchronized保证三大特性3.1 synchronized保证原子性3.2 sy…

收藏!AIGC创业者必备,AI绘画商业变现保姆级全攻略

随着AI爆火后&#xff0c;AI绘画也随之兴起&#xff0c;每次都有人问我&#xff0c;AI绘画如何变现。来&#xff0c;既然大家对商业赚钱这一块还是很关心的&#xff0c;那今天给大家分享我正在做的AI绘画的商业项目保姆级攻略&#xff0c;重点会偏向于术。全程很干&#xff0c;…

六、8 TIM编码器计数和测速代码

&#xff08;1&#xff09;所用函数 &#xff08;2&#xff09; 1&#xff09; 上拉输入和下拉输入选择&#xff1a;与外部模块保持一致 若外部模块空闲默认输出高电平&#xff0c;就选择上拉输入&#xff0c;默认输入高电平&#xff1b;若外部模块空闲默认输出低电平&#x…

sql注入——二次注入

二次注入 简介工具环境具体实施 简介 二次注入是一种较为隐蔽的 SQL 注入攻击方式。它并非直接在输入时进行攻击&#xff0c;而是先将恶意数据存储到数据库中&#xff0c;这些数据看似正常。随后&#xff0c;应用程序在后续的操作中&#xff0c;再次使用或处理这些之前存储的恶…

黑马微服务—Docker

Docker 文章目录 Docker1 快速入门1.1 部署MySQL1.2 命令解读 2 Docker基础2.1 常见命令2.2 数据卷2.2.1 数据卷**2.2.2 数据卷命令**2.2.3 挂在本地目录或文件 2.3 自定义镜像2.3.1 镜像结构2.3.2 Dockerfile2.3.3 构建镜像 2.4 容器网络 3 项目部署3.1 部署java项目3.2 部署前…

MySQL 实战 45 讲(01-05)

本文为笔者学习林晓斌老师《MySQL 实战 45 讲》课程的学习笔记&#xff0c;并进行了一定的知识扩充。 sql 查询语句的执行流程 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存、分析器、优化器和执行器。 连接器负责接收客…

【第14章】Spring Cloud之Gateway路由断言(IP黑名单)

文章目录 前言一、内置路由断言1. 案例&#xff08;Weight&#xff09;2. 更多断言 二、自定义路由断言1. 黑名单断言2. 全局异常处理3. 应用配置4. 单元测试 总结 前言 Spring Cloud Gateway可以让我们根据请求内容精确匹配到对应路由服务,官方已经内置了很多路由断言,我们也…

天润融通助力车企做好战败线索分析,实现商机转化最大化

激烈的行业竞争&#xff0c;让车企越来越重视战败客户分析。 对于每一个汽车品牌来说&#xff0c;大约会有80%甚至更多的留资顾客未在本店购车&#xff0c;最终成为广义上的战败客户。因此&#xff0c;挖掘战败背后的原因对车企意义重大。 作为大宗商品&#xff0c;汽车的交易…

基于Python的Bilibili视频信息分析与可视化

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍研究背景研究现状研究目的及意义数据采集及预处理数据清洗数据分析与可视化总结每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 …

浅谈用二分和三分法解决问题(c++)

目录 问题引入[NOIP2001 提高组] 一元三次方程求解题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路分析AC代码 思考关于二分和三分例题讲解进击的奶牛题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 思路AC代码 平均数题目描述输入格式输出格式样例 …

【Material-UI】Icon Button 组件详解

文章目录 一、基础用法1. 禁用状态 二、大小&#xff08;Sizes&#xff09;1. 小尺寸&#xff08;Small&#xff09;2. 大尺寸&#xff08;Large&#xff09; 三、颜色&#xff08;Colors&#xff09;1. 主题颜色2. 自定义颜色 四、高级用法和最佳实践1. 无障碍性&#xff08;A…

【香橙派系列教程】(七)香橙派下的Python3安装

【七】香橙派下的Python3安装 为接下来的Linux图像识别智能垃圾桶做准备。 图像处理使用京东SDK只支持pyhton和Java接口&#xff0c;目的是引入C语言的Python调用&#xff0c;感受大厂做的算法bug 此接口是人工智能接口&#xff0c;京东识别模型是通过训练后的模型&#xff0c;…

打靶记录7——Hacker_Kid-v1.0.1

靶机下载地址 https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova难度 OSCP 风格的中级难度靶机&#xff08;只需要获取root权限即可&#xff0c;CTF 风格的靶机就还需要获取flag&#xff09; 涉及的攻击方法&#xff1a; 主机发现端口扫描Web信息收集DNS区域传…

数组——对数组进行更加全面的理解

1.数组的概念 数组是一组相同类型元素的集合。数组可分为一维数组和多维数组&#xff0c;多维数组常见的是二维数组。 2.一维数组的创建和初始化 2.1 数组的创建 一维数组的创建的基本语法是&#xff1a; type arr_name[常量值] 例如&#xff0c;我们现在想要存储某个班级…

【C语言】qsort函数的介绍和使用

0. 引言 我们日常生活中经常能碰到需要给一组数据排序的情况&#xff0c;如将班上同学的身高&#xff0c;年龄从大到小排序&#xff0c;平时网上购物时对商品价格从低到高排序等等场景&#xff0c;那么电脑是根据什么程序完成这些排序的&#xff1f;接下来就来给大家介绍一下C语…

上升探索WebKit的奥秘:打造高效、兼容的现代网页应用

嘿&#xff0c;朋友们&#xff01;想象一下&#xff0c;你正在浏览一个超级炫酷的网站&#xff0c;页面加载飞快&#xff0c;布局完美适应你的设备&#xff0c;动画流畅得就像你在看一场好莱坞大片。这一切的背后&#xff0c;有一个神秘的英雄——WebKit。今天&#xff0c;我们…

MySQL数据库——数据库的基本操作

目录 三、数据库的基本操作 1.数据库中库的操作 ①创建数据库 ②字符集和校验规则 ③操纵数据库 ④备份与恢复 2.数据库中表的操作 ①创建表 ②查看表 1> 查看表位于的数据库 2>查看所有表 3>查看表中的数据 4>查看创建表的时候的详细信息 ③修改表 …