初识Spring框架~控制反转IoC、依赖注入DI以及Spring项目的创建方式

news2025/1/11 8:00:52

目录

Spring框架初识

Spring IoC

IoC(控制反转)

DI(依赖注入)

Spring项目的创建

创建一个maven项目

配置XML文件 

添加启动类 

简单了解Bean对象的存储与获取 

创建一个Spring IoC容器

注册Bean对象

获取并使用Bean对象 


Spring框架初识

通常所说的Spring是指Spring Framework(Spring框架),它是一个开源的框架,目前企业中开发JAVA项目,Spring框架几乎是标配,这个框架中包含了很多组件:Spring容器/IOC容器、SpringMVC、SpringAOP。Spring可以说是包含了众多工具方法的IOC容器

Spring IoC

上面说到是一个IoC容器,其具备两个最基础的功能:将对象存储到容器中、从容器中取出对象。因此,在学习Spring时,主要就是学会如何将对象存储到Spring中,再从Spring中获取对象的过程。

对于Spring IoC容器来说,是管理Bean对象的容器.单纯从存放数据这个角度来看,Spring IoC容器与普通的集合框架一样,但使用Spring容器存放对象,对象不需要程序员手动去new,需要进行管理的对象,直接放入到容器中。

· Bean对象即普通的java实例对象

IoC(控制反转)

IoC即控制反转,是面向对象编程中的一种设计原则。对于Spring容器来说,IoC将实例化对象以及组织间的依赖关系,都转交给IoC容器来进行管理。控制权由程序员自己控制,转变为IoC容器控制,控制权发生反转,因此称为IoC容器。

使用IoC容器,按照框架约定的写法,就可以实现,框架统一管理Bean'对象的生命周期、Bean对象之间的依赖关系。

DI(依赖注入)

DI,即依赖注入,也就是由IoC容器在运行时动态的将某种依赖关系注入到对象之中。

依赖注入和控制反转其实是从不同的角度描述同一件事,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦.也可以说IoC是是思想,而DI是其具体的实现。

Spring项目的创建

创建一个maven项目

配置XML文件 

关于pom.xml文件的配置可以直接从我的gitee中复制:Spirng项目pom.xml文件的配置

添加启动类 

package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 

简单了解Bean对象的存储与获取 

创建一个Spring IoC容器

package org.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class APP {
    public static void main(String[] args) {
        //ApplicationContext是Spring容器的顶级接口
        //AnnotationConfigApplicationContext其中的一个实现类,作用是:
        //(1)扫描指定的包路径下,使用了Spring框架注解的类
        //(2)扫描到后,注册这些类到容器中=>框架帮我们new对象,及注入对象的依赖关系(属性赋值)
        ApplicationContext context = new AnnotationConfigApplicationContext("org.example");
    }
}

注册Bean对象

使用类注解的方式来注册Bean对象

 

package org.example.model;

import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//以下四个注解,都是类注解,用于注册Bean对象
//注册的方式,默认是Bean ID(名称),是类名首字母小写
@Controller
//@Service
//@Repository
//@Component
public class Bean {
    public void sayHello() {
        System.out.println("hello");
    }
}

获取并使用Bean对象 

获取Bean对象有两种方式

①通过Bean的类型来获取

        // (1)通过bean的类型来获取
        Bean b1_1 = context.getBean(Bean.class);
        System.out.println(b1_1);

②通过Bean的id(名称)来获取

        //(2)通过bean的id(也叫bean的名称)
        Bean b1_2 = (Bean)context.getBean("bean");//这个方法要强制转换一下
        System.out.println(b1_2);

使用Bean 

上面已经获取到了bean对象,之后就可以直接使用

        //使用bean
        b1_1.sayHello();
        b1_2.sayHello();

完整代码 

package org.example;

import org.example.model.Bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class APP {
    public static void main(String[] args) {
        //ApplicationContext是Spring容器的顶级接口
        //AnnotationConfigApplicationContext其中的一个实现类,作用是:
        //(1)扫描指定的包路径下,使用了Spring框架注解的类
        //(2)扫描到后,注册这些类到容器中=>框架帮我们new对象,及注入对象的依赖关系(属性赋值)
        ApplicationContext context = new AnnotationConfigApplicationContext("org.example");
        //获取Bean对象有两种方式:
        // (1)通过bean的类型来获取
        Bean b1_1 = context.getBean(Bean.class);
        //(2)通过bean的id(也叫bean的名称)
        Bean b1_2 = (Bean)context.getBean("bean");//这个方法要强制转换一下
        //使用bean
        b1_1.sayHello();
        b1_2.sayHello();
    }
}

 

 

 

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

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

相关文章

java知识梳理 第十五章 I/O流

一、文件 1.1 文件流 值得一提的是,这里的流的概念是围绕java程序展开的 1.2 常用的文件操作 1.2.1 创建文件对象相关构造器和方法 代码演示如上,读者可自行实验 1.2.2 获取文件的相关信息 代码演示如上,读者可自行实验 1.2.3 目录的操作和删…

NodeJs实战-待办列表(6)-前端绘制表格显示待办事项详情

NodeJs实战-待办列表6-前端绘制表格显示待办事项详情定义服务器返回的 json 数据前端绘制动态表格后端返回列表数据验证执行添加查看数据库中的数据是否与页面一致使用浏览器debug表格绘制过程项目地址前面几节显示的列表,看不到事项创建时间,完成时间&a…

springmvc-day03

springmvc-day03 第一章 拦截器 1.概念 1.1 使用场景 1.1.1 生活中坐地铁的场景 为了提高乘车效率,在乘客进入站台前统一检票: 1.1.2 程序中的校验登录场景 在程序中,使用拦截器在请求到达具体 handler 方法前,统一执行检…

基于stm32单片机的智能恒温自动加氧换水鱼缸

资料编号:105 下面是相关功能视频演示: 105-基于stm32单片机的智能恒温自动加氧换水鱼缸Proteus仿真(源码仿真全套资料)功能讲解:采用stm32单片机,ds18b20测量温度,LCD1602显示温度&#xff0c…

C语言第十一课(上):编写扫雷游戏(综合练习2)

目录 前言: 一、文件建立: 1.头文件game.h: 2.函数定义文件game.c: 3.工程测试文件test.c: 二、编写井字棋游戏: 1.程序整体执行思路: 2.menu菜单: 3.game游戏函数逻辑&#xff…

【Detectron2】代码库学习-5.标注格式- 矩形框, 旋转框,关键点, mask, 实例标注,IOU计算, 旋转框IOU计算,

文章目录Detectron2 内置的标注格式BoxMode 表示方式实用APIRotatedBoxesInstances 实例标注KeypointsMasks结语Detectron2 内置的标注格式 BoxesRotatedBoxesBitMasksPolygonMasksROIMasksKeypointsInstancesImageList BoxMode 表示方式 XYXY_ABSXYWH_ABSXYXY_REL # 相对模…

Windows安装mysql并且配置odbc

文章目录 mysql下载ODBC驱动下载安装mysql使用测试安装ODBC驱动添加ODBC数据源配置完成了用户不能远程访问的问题mysql下载 https://dev.mysql.com/downloads/installer/ ODBC驱动下载 https://dev.mysql.com/downloads/connector/odbc/ 安装mysql 点击mysql安装包,选择…

【25-业务开发-基础业务-品牌管理-图片管理-图片上传方式的三种实现方式-第三方公共服务模块集成到项目中-服务端生成签名实战】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了,请点击这里!】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

【第三部分 | 移动端开发】1:移动端基础概要

目录 | 概述 | 手机端调试 | 视口 ViewPort 三种视口 meta标签 设置视口 代码适配PE端的要点 | 二倍图 物理像素和物理像素比 利用二倍图解决图片在PE端默认放大失真 背景缩放 background-size | 移动端的开发选择 | 移动端的相关开发注意点 | 概述 | 手机端调试 打…

【操作系统习题】假定某多道程序设计系统供用户使用的主存空间为100 KB ,磁带机2台,打印机1台

4.假定某多道程序设计系统供用户使用的主存空间为100 KB ,磁带机2台,打印机1台。采用可变分区方式管理主存,采用静态分配方式分配磁带机和打印机,忽略用户作业I/O时间。现有如下作业序列,见表2-8。 采用先来…

Linux磁盘分区中物理卷(PV)、卷组(VG)、逻辑卷(LV)创建和(LVM)管理

文章目录一 基础定义二 创建逻辑卷2-1 准备物理设备2-2 创建物理卷2-3 创建卷组2-4 创建逻辑卷2-5 创建文件系统并挂载文件三 扩展卷组和缩减卷组3-1 准备物理设备3-2 创建物理卷3-3 扩展卷组3-4 查看卷组的详细信息以验证3-5 缩减卷组四 扩展逻辑卷4-1 检查卷组是否有可用的空…

Python实现全自动输入文本

文章目录1. 效果图2. 示例代码3. 代码解释1. 效果图 该Python脚本可以实现自动用Notepad打开文本文件,然后自动输入文本,最后保存并关闭文件,从而实现全面自动化处理文本。 2. 示例代码 Python脚本源码如下,主要使用了win32gui、…

Modern Radar for Automotive Applications(用于汽车应用的现代雷达)

目录 1 引言 2 汽车雷达系统的工作原理 2.1 基本雷达功能 2.2 汽车雷达架构 2.2.1 发射机 2.2.2 接收机 2.2.3 天线和天线阵 2.3 信号模型 2.3.1 振幅模型 2.3.2 噪声模型 2.4 雷达波形和信号处理 2.4.1 距离处理 2.4.2 多普勒处理 2.4.3 FMCW汽车雷达应用的典型波形参数…

[Unity好插件之PlayMaker]PlayMaker如何扩展额外创建更多的脚本

学习目标: 如果你正在学习使用PlayMaker的话,那么本篇文章将非常的适用。关于如何连线则是你自己的想法。本篇侧重于扩展适用更多的PlayMaker行为Action,那么什么是PlayMaker行为Action呢? 就是这个列表。当我们要给PlayMaker行为…

CSS的元素显示模式和CSS的背景

🍓个人主页:bit.. 🍒系列专栏:Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 HTML和CSS3 目录 一.CSS的元素显示模式 1.1什么是元素的显示模式 1.2块元素 1.3行内元素 1.4 行内块元素 1.5元素显示模式总结 1.6…

JavaEE——HttpServletRequest

HttpServletRequest 核心方法 方法功能String getProtocol()返回请求协议的名称和版本。String getMethod()返回请求的 HTTP 方法的名称String getRequestURI()从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。String getContextPath…

DolphinScheduler3.1简介、部署、功能介绍以及架构设计

DolphinScheduler3.1简介、部署、功能介绍以及架构设计1.DolphinScheduler简介 1-1.关于DolphinScheduler Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处…

Day08--自定义组件的数据监听器案例

1.案例效果: 我的操作: 1》新建一个组件test4 2》在app.json里面将test4设置为全局组件 3》在home.wxml里面是用这个test4组件。 4》在test4.js中编写代码:【需要的配置项都弄一下呗。】 *********************************************…

anaconda3报错Can‘t find libdevice directory解决方案

anaconda3报错Cant find libdevice directory解决方案1. 问题描述2. 解决方案3. 原理分析4. 其他解决方案1. 问题描述 使用anaconda3运行tensorflow进行单机多GPU运算时报错: error: Cant find libdevice directory ${CUDA_DIR}/nvvm/libdevice较的全报错如下&…

【Wayland】QtWayland框架分析

QtWayland框架分析 QtWayland概念介绍 QtWayland是Qt官方基于Wayland开发的一款Toolbox,根据其官网介绍 The QtWayland module consists of two parts: Wayland platform plugin: Enables Qt applications to be run as Wayland clients. QtWaylandCompositor API…