一文了解Spring框架

news2024/11/29 10:40:44

目录

SpringBoot VS Servlet

Spring是什么? 

loC:控制反转

DI

创建一个Spring项目

创建一个Spring IOC容器 

注册Bean对象 

获取Bean对象 

注意事项: 

类注解 

为什么有这么多类注解?

注册与注入 

方法注解 @Bean


SpringBoot VS Servlet

当我们用Servlet开发一个项目时步骤是:

  1. 创建Maven项目
  2. 配置pom.xml(添加需要的依赖包、添加webapp/WEB-INF/web.xml文件及内容)
  3. 添加Servlet代码:@WebServlet注解+重写doXXX方法
  4. 配置Tomcat:添加Tomcat
  5. 部署项目:破解版需要自己手动设置

当我们用框架开发一个项目时:

  1. 创建maven项目
  2. 修改pom.xml:添加ee框架的依赖包(ee框架搭建项目还可以创建一个Spring Initializer的项目,或者在Sring官网下载一个项目模板)
  3. 准备spring约定的文件

Spring是什么? 

Spring框架即Spring Framework,它是一个开源框架,支持广泛的应用场景。用一句话概括就是:Spring是包含了众多方法的loC(控制反转)容器。那什么是loC呢?

loC:控制反转

实例化对象及组织对象间的依赖关系,都交给loC容器来进行管理,控制权由程序自己控制,转变为loC容器控制,控制权发生反转,所以叫loC容器。

DI

说到 IoC 不得不提的一个词就是 “DI” DI Dependency Injection 的缩写,翻译成中文是 依赖注入 的意思。
所谓依赖注入,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI )和控制反转( IoC )是从不同的角度的描述的同一件事情,就是指通过引入 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦。
解耦:自己写代码来创建对象及组织依赖关系,属于强耦合的(就是一个地方改,依赖这个地方的其他地方都得改),使用框架后,框架自动给我们组织依赖关系,解耦。
loC与DI :loC是一个目标也是一种思想,而DI是这个目标的具体实现

创建一个Spring项目

我用的是Maven的方式创建一个Spring项目,可以分为以下三步:

  1. 创建一个普通的Maven项目
  2. 添加Spring框架支持(Spring-context、Spring-beans)
  3. 添加启动类

创建一个Spring IOC容器 

ApplicationContext context=new AnnotationConfigApplicationContext("org.example");

ApplicationContext就是Spring容器的顶级接口

AnnotationConfigApplicationContext是其中一个实现类,它的作用是

  1. 扫描指定的包路径下,使用Spring框架注解的类(在上面代码扫描的是org.example)
  2. 注册这些类到容器中(框架帮我们new对象,及注入对象的依赖关系) 

注册Bean对象 

@Controller
//@Service
//@Repository
//@Component
public class Bean对象1 {
    public void sayHello(){
        System.out.println("Hello");
    }
}

@Controller
//@Service
//@Repository
//@Component

以上四个类注解都是用于注册Bean对象

获取Bean对象 

获取bean对象的方式有两种

(1)通过Bean的类型

(1)通过Bean的类型获取
        Bean对象1 b1=context.getBean(Bean对象1.class);

(2)通过Bean的id

 (2)通过Bean的id
        Bean对象1 b1_1=(Bean对象1) context.getBean("bean对象1");

注意事项: 

  • 一定要被扫描到,才能注册到容器中(一定要在指定的包路径下,指定类注解)
  • 默认注册到容器中的bean id,是类名首字母小写,如果类名开始两个连续字母大写,bean id就是类名
  • @Controller
    @Service
    @Repository
    @Component

这四个注册Bean对象的类注解默认都是单例的方式注册,注册为普通的java bean对象,还有一个@Configuration注册为配置类对象

类注解 

想要将对象存储在Spring中,有两种注解类型可以实现:

类注解:@Controller(控制器存储)、@Service(服务存储)、@Repository(仓库存储)、@Component(组件存储)、@Configuration(配置存储)

方法注解:@Bean

为什么有这么多类注解?

这么多类注解,就是让程序员看到类注解之后,就能直接了解当前类的用途。

程序的工程分层,调用流程如下:

@Component:一般组件使用,除了以上明确含义的类注解作用,之前的作用,就可以使用AComponent注解。 

注册与注入 

注册bean对象:按框架约定的写法(目前是几个类注解),框架给我们new对象。

注入依赖关系:按框架约定的写法(属性注解),框架给我们组织依赖关系(把容器中的对象赋值给属性)

方法注解 @Bean

类注解是添加到某个类上的,而方法注解是放到某个方法上的。

@Configuration
public class AppConfig {

    @Bean
    public Bean对象1 test_1(){
        Bean对象1 bean对象1=new Bean对象1();
        bean对象1.sayHello();
        return bean对象1;
    }

}

注意点:

  1. 只有类被扫描到,且注册到容器中,方法上的@Bean注解才生效
  2. @Bean注解的方法,所在的类,需要五种类注解之一(一般是在@Configuration配置类中)

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

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

相关文章

《R语言数据分析》2022-2023第一学期课程分析报告

1 (30分)基本操作题 1.1 (10分) 请写出下面问题的R代码 1.(2分)安装并加载gtools扩展包。 install.packages(“gtools”) library(gtools) 2.(2分)查看当前已经加载的所有包。 as.data.frame(installed.packages())$Package 3.(2分)查看gtools包的帮助网页。 ?gtools…

《清单革命》内容梳理随笔

《清单革命》内容梳理&随笔 起 书即是将四散的知识按照逻辑和网状联系编排起来。你应该这样去读,高屋建瓴、层次有秩、显得貌似自己有经验(褒义)的读,读出一些感想和方法论,无论是读出书里的还是书外的&#xff…

【MySQL高级】SQL优化

5. SQL优化 5.1 大批量插入数据 环境准备 : CREATE TABLE tb_user_2 (id int(11) NOT NULL AUTO_INCREMENT,username varchar(45) NOT NULL,password varchar(96) NOT NULL,name varchar(45) NOT NULL,birthday datetime DEFAULT NULL,sex char(1) DEFAULT NULL,…

【数据库】实验五 数据库综合查询|多表查询、聚集函数、orderby、groupby

文章目录参考文章本文在实验四的基础上增加了orderby、聚集函数、groupby、多表查询的知识点,相较于上一次实验的难度变大了,嵌套表达更多了,逐渐开始套娃…… 其实可以看成一个偏正短语来拆分,再写成SQL语句,比如查询…

微信小程序|基于小程序实现人脸数量检测

一、文章前言二、具体流程及准备三、开发步骤四、完整代码一、文章前言 此文主要通过小程序实现检测图片中的人脸数量并标记出位置信息。 当近视的小伙伴看不清远处的人时,用小程序一键识别就可以在手机上看清楚啦,是不是很实用呢。 典型应用场景&#x…

2022年还在做手动测试?是该好好反思了

为什么会写这篇文章呢?主要是前段时间有个朋友在QQ上和我交流,说他干了10年的手工测试了,现在还能不能转行。 说实话,当时我听完非常惊讶!由此,我写了今天这篇文章。内容纯属个人观点,如果对你…

STM32CubeMX学习笔记(46)——USB接口使用(HID自定义设备)

一、USB简介 USB(Universal Serial BUS)通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、…

浅刷牛客链表题,逐步深入链表,理解链表

作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:手把手带你刷牛客 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 目录 1、反转链表 2、删除链表的倒数第n个…

RocketMQ 消息重新投递 解析——图解、源码级解析

🍊 Java学习:Java从入门到精通总结 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2022年11月4日 &#x…

35、Java——一个案例学会Dao+service层对数据表的增删改查

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:乐趣国学的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java案例分…

deployment html--->JDBC--->mysql

spec: 相关属性定义 spec.selector: 符合该条件的收到该deployment管理 #spec.selector.matchLables 和 spec.template.metadata.labels 标签要一致 mysql Service metadata.name: Service的服务名 spec.ports: 虚拟端口 spec.selector: 哪些pod(实列&…

《Java》深浅拷贝解析(还不会区分深浅拷贝吗?快进来)

目录 一、深浅拷贝的意义 浅拷贝 深拷贝 二、深浅拷贝举例 浅拷贝 深拷贝 一、深浅拷贝的意义 首先我们来了解一下深浅拷贝的意义 浅拷贝 浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用&#xff0c…

全网最全【数据结构与算法】408真题实战(含代码+详解)—— 线性表专题(持续更新...)

线性表专题 每道题目均有对应的代码&#xff0c;大家自行查看哦&#xff01; 顺序表 ADT&#xff1a;SeqList 文件名&#xff1a;SeqList.hpp #include <iostream> #include <cstdlib> using namespace std; // 以上是实际运行所需依赖&#xff0c;考试不用写t…

怎样编写裸片启动程序-ARMv8的Boot Code和ROM程序

ROM程序就是固化在芯片的ROM里面&#xff0c;把应用程序从存储器里加载/搬移到RAM中并使处理器开始执行应用程序的一段程序 1 Boot Code和ROM程序 从多普通单核MCU&#xff08;如STM32&#xff09;的使用者的角度来看&#xff0c;只需要把编译好的hex文件烧写到片上Flash中&am…

JavaScript(WebAPI) (前端)

文章目录前言一、WebAPI二、DOM1.选中元素2.事件3.获取/修改元素内容4.获取/修改元素属性5.获取/修改表单元素属性6.操作复选框7.获取/修改样式属性①行内样式②通过css class 指定的样式8.新增节点9.删除节点总结前言 虽然学了一些js的语法,但是仍然无法写出页面的动态效果~~…

【JavaScript高级进阶】构造函数和原型,学会prototype

目录 前言 1.构造函数和原型 1.1使用prototype解决内存浪费的问题 1.2constructor构造函数构造器构造函数 2.原型链 2.1js中成员查找规则 2.2原型对象this指向 2.3扩展内置对象 3.call作用 4.继承 4.1利用原型对象继承 写在最后 前言 哈喽哈喽大家好&#xff0c;因为…

【Day1】零基础学java--》记事本运行java程序,通熟语言让你彻底明白为什么配置java环境变量

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#xff0c;从今天开始我将协同大家一起从零基础学习Java&#xff0c;期待与君为伴&#xff0c;走向海的彼岸。&#x1f495;&#x1f495;&#x1f495; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;所属专栏&a…

C语言之数组练习题

第1关&#xff1a;数组插入元素 300 任务要求参考答案评论106 任务描述相关知识 数组数组元素的表示方法编程要求测试说明任务描述 本关需要你将一个数插入到一组已经排好序的数组并输出。 相关知识 数组在程序设计中&#xff0c;为了处理方便&#xff0c; 把具有相同类型…

【C++】多态 — 多态的原理 (下篇)

文章目录&#x1f4d6; 前言1. 虚函数表1.1 虚函数表的引入&#xff1a;1.2 基类的虚表&#xff1a;1.3 派生类虚表&#xff1a;2. 多态的原理2.1 多态虚函数的调用和普通函数的调用&#xff1a;2.1 - 1 到底什么是多态&#xff08;重点&#xff09;2.1 - 2 父类的指针实现多态…

Allegro基本规则设置指导书之Analysis Modes

Allegro基本规则设置指导书之Analysis Modes 下面介绍基本规则设置指导书之Analysis Modes 点击set-up-constrains-Modes 调出Analysis Modes,这个是所有DRC的总开关 下面介绍常用的一些开关设置 Design Options (Soldermask) 从上往下 阻焊到阻焊的间距 阻焊到pad和走线…