当前位置: 首页 > news >正文

spring框架介绍

c07fb55e3fee4cc09f68c0e1893fedec.jpgspring

 

1.优点

  1)针对接口编程,解耦合

  2)aop:变向切面编程,动态增加功能

  3)方便集成框架,mybatis,hibernate,strust等

  4)降低j2ee接口的使用难度

 

2.spring是干什么的

  管理bean及bean的依赖关系的一个容器,为降低bean之间耦合度问题而开发,核心是控制反转(IOC)和面向切面编程(AOP)

    控制反转(IOC:):对象的创建交给容器来完成

    面向切面编程(AOP):系统级服务和主业务逻辑分开,降低耦合度,使系统级服务织入主业务逻辑

 

IOC:

3.(配置式开发)spring容器都干了什么

  读取配置文件

  创建bean对象(使用反射机制调用无参构造方法),将对象保存在内存Map中

  给有依赖关系的对象赋值

 

4.spring容器的实现接口有哪些

  ApplicationContext:创建容器时就创建了bean对象,并将对象放到内存中

  BeanFactory:创建容器对象时不创建bean对象(懒加载模式:用的时候才创建)

 

5.spring框架中bean对象的创建过程,有几种创建方式

  在配置文件中使用bean标签注册bean对象

  2种方式:

    默认创建方式:调用bean对象的无参构造方法

    (实例)工厂模式创建bean:需要在配置文件中注册工厂对象以及注册工厂对象的方法(此方式耦合度高,因为实例工厂中写死了Java对象)

 

6.什么是工厂模式,什么时候用工厂模式

  工厂模式:当创建对象时若比较繁琐,可以将这些繁琐的创建过程封装到一个方法中,调用此方法来创建对象,这就是工厂模式

  什么时候用:创建复杂对象时

 

7.spring框架中bean的作用域

  在配置文件中,使用scope关键子给bean指定作用域

  spring支持5种作用域:singleton(单例作用域,spring默认的作用域)、prototype(原型作用域:每创建一次都是新的对象)、request、session、globalSession

 

8.spring中给bean对象的属性赋值(也叫注入)

  对bean对象属性赋值同样是由容器完成的

  根据注入方式不同分为2种:

    设值注入:调用bean对象的set方法给属性赋值(常用)

    构造注入:调用bean对象的构造方法时给属性赋值并创建对象(不常用)

  根据注入的实现方式不同也分2种:

    1.基于配置文件:(掌握,内容较多,不常用)

    2.基于注解:(掌握,常用)

 

9.注解式开发bean对象的创建,创建前需要做什么

  在配置文件中使用context:component-scan标签注册组件扫描器

  多个包下都使用了注解怎么解决:

    1.使用多次context:component-scan标签

    2.base-package值中使用逗号或分号分隔(推荐使用此方法)

    3.指定父包(不推荐使用)

 

10.基于注解方式开发,创建bean对象有哪些注解,怎么用

  以下注解均是用于创建对象:

    @Repository:用在Dao层的类上

    @Service:用在Service层的类上

    @Controller:用在UI层的类上

    @Component:以上三个注解都不能使用或者不合格使用时就使用此注解,不使用value属性时,对象的名称默认是类名的首字母小写

 

11.基于注解方式开发,设置bean对象的作用域

  使用@Scope注解,在value值中设置

 

12.基于注解方式开发,给bean对象赋值有哪些注解,怎么用

  以下注解均是用于给属性赋值:

    @Value:给简单类型属性赋值,可以放在属性定义上(不需要set方法的),可以放在属性的set方法上

    @Autowired:spring框架中的。给引用类型的属性赋值,默认是按类型注入的。若按名称来注入需同时使用@Qualifier(value="BeanID")注解

      Autowired有一个属性required,默认为true,意思是必须成功给引用类型赋值,否则程序终止并报错。若为false意思是不能成功赋值则为null

    @Resource:不是spring框架中的,是jdk中的。给引用类型的属性赋值,默认是按类型注入的。若按名称来注入需要使用@Resource注解的name属性,name属性指定BeanID

  给属性赋值一般是设值注入,不使用构造注入。

 

13.bean对象的生命始末

  基于配置文件:在bean标签中使用属性init-method、destroy-method

  基于注解方式:在方法上使用@PostConstruct(bean对象初始化后执行)、@PreDestroy(bean对象销毁之前执行)

 

14.spring框架中配置文件和注解同时使用,谁的优先级高

  配置文件的优先级高

 

15.spring框架中配置文件和注解的优缺点

  配置文件:(灵活)对其所作的修改无需编译代码,只需重启服务器即可

  注解:(高效)配置方便,直观,但修改代码后需重新编译

 

AOP:

16.什么是代理模式,什么时候用代理模式

  代理模式:为目标对象提供代理服务,从而控制对目标对象的访问及对目标对象的功能增强

  什么时候用:当访问一个目标对象时达不到想要的效果,可以访问代理对象,代理对象可以对其进行访问控制及功能增强

  代理模式的作用:功能增强(对目标对象目标方法的返回值做处理)和控制访问(比如控制在某些条件下可以调用目标对象的方法,某些条件下不能调用)

  代理模式的分类:

    静态代理:代理对象在程序运行前就已经定义好了,其与目标对象的关系在程序运行前就已经确立了

    动态代理:目标对象的代理对象是由代理生成工具在程序运行时由JVM通过反射机制动态生成的,代理对象与目标对象的关系也是在程序运行时才确定的

      jdk动态代理:

        1.目标对象实现接口方法(有了目标对象、目标方法)(jdk动态代理要求目标对象要实现接口)

        2.实现InvocationHandler接口创建调用处理器类,并且实现invoke方法(调用处理器的作用是截取对目标方法的调用)

          public Object invoke(Object proxy,Method method, Object[] args)

            Object proxy:代理对象

            Method method:目标方法

            Object[] args:目标方法的参数

            返回值Object:目标方法的返回值

        3.通过Proxy接口的newProxyInstance方法创建代理对象

          static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

            ClassLoader loader:目标对象的类加载器(target.getClass().getClassLoader())

            Class[] interfaces:目标对象的接口(target.getClass().getInterfaces())

            InvocationHandler h:调用处理器

        4.通过代理对象调用目标方法

      cjlib动态代理:(当目标对象没有实现接口时可以使用cglig动态代理)cglib动态代理原理是生成目标对象的子类(继承过来的),对子类进行增强,子类即是代理对象(cglib动态代理要求目标类不能是final的)

        1.导入cglib库

        2.创建目标对象(不需要实现接口,且不能是final修饰的)

        3.实现MethodInterceptor接口创建调用处理器,并且实现intercept方法(相当于cglib中的invoke方法)

          public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy)

            Object proxy:代理对象

            Method method:目标方法

            Object[] objects:目标方法的参数

            MethodProxy methodProxy:方法的代理对象(与cglib的区别)

            返回值object:目标方法的返回值

        4.通过Enhancer(增强器)类创建代理对象

          Enhancer enhancer = new Enhancer();

          // 设置enhancer对象的父类

          enhancer.setSuperclass(target.class);

          // 设置enhancer的回调对象

          enhancer.setCallback(new MyMethodInterceptor());

          // 创建代理对象

          ProxyObject proxy= (ProxyObject)enhancer.create();

        5.通过代理对象调用目标方法

17.什么是AOP

  面向切面编程,动态的将与主业务逻辑无关的代码(如事务、日志等)织入到主业务逻辑当中,代码上不会出现混杂。AOP的底层采用的是动态代理,默认采用的是jdk的动态代理。

 

18.AOP中几个重要的编程术语

  切面:反之交叉业务逻辑(例如事务、日志)。实际上就是对主业务逻辑的功能增强。常用的切面实现有通知和顾问。

  织入:将切面代码插入到目标对象的过程。

  连接点:可以被切面织入的方法,通常业务接口中的方法均是连接点。

  切入点:织入了切面代码的方法,即业务接口中被增强了的方法是切人点,未被增强的方法是连接点。

  目标对象:要被增强的对象。

  通知:切面的一种实现。通知决定了切入的时间点(切入点决定了可以切入的位置)。例如是在目标方法执行之前执行切入,还是在目标方法执行之后执行切入

  顾问:切面的一种实现。是一种高级的通知。

 

19.spring框架对AOP思想的实现之一:通知

  spring框架对AOP的思想进行了实现,实现的方式是通知。通知有四个接口:前置通知(MethodBeforeAdvice)、后置通知(AfterReturningAdvice)、环绕通知(MethodInterceptor)、异常通知(ThrowsAdvice)

 

20.spring框架之前置通知

  实现MethodBeforeAdvice接口的类为前置通知,是对目标方法的增强。

  MethodBeforeAdvice接口中只有一个before方法:public void before(Method method,Object[] args,Object target)

    Method method:目标方法

    Object[] args:目标方法的参数

    Object target:目标对象

  前置通知的特点:

    1.前置通知中before方法是在目标方法执行之前执行的

    2.前置通知不能改变目标方法的执行流程

    3.前置通知不能改变目标方法的执行结果

  配置文件方式实现步骤,需要在配置文件中配置如下信息:

    1.注册目标对象

    2.注册通知类(切面)

    3.注册代理工厂类:

      3.1在代理工厂内指定目标对象

      3.2在代理工厂内指定目标对象实现的接口

      3.3在代理工厂内指定切面

 

 

相关文章:

spring框架介绍

spring 1.优点 1)针对接口编程,解耦合 2)aop:变向切面编程,动态增加功能 3)方便集成框架,mybatis,hibernate,strust等 4)降低j2ee接口的使用难度 2.spring是干什么的 管理bean及bean…...

如果在 Ubuntu 系统中两个设备出现两个相同的端口号解决方案

问题描述: 自己的移动机器人在为激光雷达和IMU配置动态指定的端口时,发现激光雷达和深度相机配置的 idVendor 和 idProduct 相同,但是两个设备都具有不同的ttyUSB号,如下图所示 idVendor:代表着设备的生产商ID,由USB设…...

随手分享的APP链接,可能会让你“大型社死”

早晨上班路上,你在地铁百无聊赖地刷着短视频,看到一则好笑的,随手分享给了你的公司“饭搭子”,并配上了一串“哈哈哈哈哈哈”。 晚上下班路上你再次打开视频APP,发现首页弹窗给你推荐了一组“可能认识的人”&#xff…...

国内AI大模型已近80个,哪个最有前途?

根据中国新一代人工智能发展战略研究院发布的报告显示,目前全国已有3k+家人工智能企业,国内的AI大模型应该也近在200了!!! (原图图片过长了,这里就先放了20个) 面对如…...

美团一面:说说synchronized的实现原理?问麻了。。。。

引言 在现代软件开发领域,多线程并发编程已经成为提高系统性能、提升用户体验的重要手段。然而,多线程环境下的数据同步与资源共享问题也随之而来,处理不当可能导致数据不一致、死锁等各种并发问题。为此,Java语言提供了一种内置…...

P1123 取数游戏(dfs算法)

题目描述 一个 NM 的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻 8个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少。 输入格式 第…...

交叉验证(Cross-Validation)

交叉验证的基本概念 交叉验证通常用于评估机器学习模型在未知数据上的性能。它将数据集分成k个不同的子集,然后进行k次训练和验证。在每次迭代中,选择一个子集作为测试集,其余的子集作为训练集。这样,每个子集都用作过测试集&…...

【kears】(01)keras使用介绍

文章目录 一.特点二.keras如何支持TensorFlow、CNTK 和 Theano2.1 使用 TensorFlow 后端引擎训练和评估模型2.2 使用 TensorFlow 后端引擎训练和评估模型2.3 使用 Theano后端引擎训练和评估模型2.4 不同深度学习框架如何选择1.1 keras.datasets:包含多种常用数据集1…...

2. TypeScript 安装与环境配置指南

TypeScript 是 JavaScript 的一个超集,它为 JavaScript 增加了类型系统和对 ES6 的支持。TypeScript 不仅能够帮助开发者捕获代码中的错误,还能提供更好的编辑器支持,包括代码补全、接口提示等。本文将详细介绍如何在您的开发环境中安装和配置…...

python pygame库的略学

文章目录 概述1. pygame的初始化和退出2. 创建游戏窗口(1)set_mode()(2)set_capyion()(3)update() 3. 游戏循坏与游戏时钟4. 图形和文本绘制(1)图形绘制(2)文…...

大模型日报2024-04-09

大模型日报 2024-04-09 大模型资讯 苹果预告超越ChatGPT的新AI模型ReaLM 摘要: 苹果公司最新宣布,即将推出一款名为ReaLM的人工智能模型。这款AI技术在理解复杂屏幕用户指令方面表现出高超的能力,并能与用户进行自然流畅的对话。ReaLM的推出预示着苹果在…...

抖音视频如何下载保存(方法分享)

有时刷抖音视频,看的喜欢的视频想要下载到本地,但是有很多视频无法下载或者下载下来是有水印的,那怎么办呢?   抖音视频下载有两种情况: 一种是可以直接点击分享下载,然后可以直接点击保存到相册。 视频就自动下载…...

MySQL-用户与权限管理:用户管理、权限管理、角色管理

用户与权限管理 用户与权限管理1.用户管理1.1 登录MySQL服务器1.2 创建用户1.3 修改用户1.4 删除用户1.5 设置当前用户密码1.6 修改其它用户密码 2. 权限管理2.1 权限列表2.2 授予权限的原则2.3 授予权限2.4 查看权限2.5 收回权限 访问控制连接核实阶段请求核实阶段 3. 角色管理…...

Vue.js中如何使用Vue Router处理浏览器返回键的功能

在Vue.js中,Vue Router默认提供了处理浏览器返回键的功能。当用户点击浏览器的返回键时,Vue Router会自动导航到历史记录中的上一个路由。然而,如果你想自定义返回键的行为或者在特定的页面上进行特殊处理,你可以使用Vue Router的…...

QT drawPixmap和drawImage处理图片模糊问题

drawPixmap和drawImage显示图片时,如果图片存在缩放时,会出现模糊现象,例如将一个100x100 的图片显示到30x30的区域,这个时候就会出现模糊。如下: 实际图片: 这个问题就是大图显示成小图造成的像素失真。 当…...

YOLOv9改进策略 :小目标 | 新颖的多尺度前馈网络(MSFN) | 2024年4月最新成果

💡💡💡本文独家改进:多尺度前馈网络(MSFN),通过提取不同尺度的特征来增强特征提取能力,2024年最新的改进思路 💡💡💡创新点:多尺度前馈网络创新十足,抢先使用 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特征的提取能力;2)放在detect…...

从零开始:一步步学习爬虫技术的实用指南(一)

从零开始:一步步学习爬虫技术的实用指南(一) Urllib1.什么是互联网爬虫2.爬虫核心3.爬虫的用途4.爬虫的分类4.1 通用爬虫:4.1 聚焦爬虫: 5.反爬手段5.1 User‐Agent:5.2.代理IP5.3.验证码访问5.4.动态加载网…...

Python面向对象详解

文章目录 类和继承变量保护类装饰器 类和继承 Python虽然以函数式著称,但在Python中,万物皆对象,其对面向对象编程是有着非常不错的支持的。类是面向对象的核心数据类型,下面代码就创建了一个Person类。 class Person:count 0d…...

思维题锻炼-最小数字

思维题锻炼-最小数字 目录题目描述输入样例输出样例代码 目录 题目描述 给一串数字&#xff0c;求出最小的整数&#xff0c;不能是原数字串中的数字&#xff0c;也不能由数字串中的数字相加得到 输入样例 5 2 1输出样例 4代码 #include<bits/stdc.h> #include<s…...

ubuntu20.04 运行 lio-sam 流程记录

ubuntu20.04 运行 lio-sam 一、安装和编译1.1、安装 ROS11.2、安装 gtsam1.3、安装依赖1.4、下载源码1.5、修改文件1.6、编译和运行 二、官方数据集的运行2.1、casual_walk_2.bag2.2、outdoor.bag、west.bag2.3、park.bag 三、一些比较好的参考链接 记录流程&#xff0c;方便自…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...