01-32-spring5-bean-ioc-aop

news2024/11/23 12:11:29

01-spring5:

spring

1、spring概念

1、什么是spring及优点

Spring框架使Java EE应用程序的开发更加简捷,通过使用POJO为基础的编程模型促进良好的编程风格。

轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。

控制反转(IoC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。 把创建对象过程交给 Spring进行管理

面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。 不修改源代码进行功能增强

容器:Spring包含并管理应用程序对象的配置及生命周期。

MVC框架:Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。

事务管理:Spring对下至本地业务上至全局业务(JAT)提供了统一的事务管理接口。

异常处理:Spring提供一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为一致的、Unchecked异常。

2、spring架构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GHa7pxq0-1670856538698)(png/1650956297897.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uHhKUU6z-1670856538700)(png/1650956306556.png)]

2、spring-IOC-DI

1、IOC

IOC 负责创建管理对象(通过依赖注入DI,装配对象,配置对象,并且管理这些对象的整个生命周期。

使用IOC目的:为了降低耦合度

1、IOC底层(面试)

xml解析、工厂模式、反射

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvxNRJWN-1670856538701)(png/1650446405723.png)]

在这里插入图片描述

2、I0C容器实现的两种方式(两个接口)

(1)BeanFactory接口:IOC容器基本实现是Spring内部接口的使用接口,不提供给开发人员进行使用(加载配置文件时候不会创建对象,在获取对象时才会创建对象。)
(2)ApplicationContext接口:BeanFactory接口的子接口,提供更多更强大的功能,提供给开发人员使用(加载配置文件时候就会把在配置文件对象进行创建)推荐使用!

3、ApplicationContext通常的实现是什么?(面试)

FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean配置文件的全路径名必须提供给它的构造函数。
ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。

2、依赖注入DI

1、 什么是Spring的依赖注入?
依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。

2、有哪些不同类型的IOC(依赖注入)方式?
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
3、哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?
你两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。

3、spring-Bean

1、spring-bean概念定义

1、什么是Spring beans?
Bean: 在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。Bean是由Spring IoC容器实例化,组装和以其他方式管理的对象。否则,bean仅仅是应用程序中许多对象之一。Bean及其之间的依赖关系反映在容器使用的配置元数据中。

Spring Beans是构成Spring应用核心的Java对象。这些对象由Spring IoC容器实例化、组装、管理。这些对象通过容器中配置的元数据创建,例如,使用XML文件中定义的创建。

2、 一个 Spring Bean 定义包含什么?
一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。

3、如何给Spring 容器提供配置元数据?
这里有三种重要的方法给Spring 容器提供配置元数据。

(1)XML配置文件。
(2)基于注解的配置。
(3)基于Java的配置

2、spring-xml注入

1、使用xml配置注入属性,set方式注入属性,有参构造方法注入

2、使用P名称空间注入

3、注入一些特殊类型的属性 【其他对象】

4、注入外部Bean 【比如数据库连接】

5、注入内部Bean属性 【对象包含对象】

6、注入集合属性 【list,map,set…】

3、FactoryBean

1、Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)

  • 普通 bean:在配置文件中定义 bean 类型就是返回类型
  • 工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样

案例演示

  • 第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
  • 第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型

4、Spring Bean作用域

1、怎样在 Spring 里定义类的作用域
给这个bean声明一个作用域。可通过bean 定义中的scope属性来定义。

2、解释Spring支持的几种bean的作用域。

singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:将单个bean定义的范围限定为单个HTTP请求的生命周期; 也就是说,每个HTTP请求都有一个自己的bean实例,它是在单个bean定义的后面创建的。 仅在基于Web的Spring ApplicationContext上下文中有效。
session:将单个bean定义的作用域限定为HTTP会话的生命周期。 仅在web的Spring ApplicationContext上下文中有效。
application:将单个bean定义的作用域限定为ServletContext的生命周期。 仅在基于web的SpringApplicationContext上下文中有效。
websocket:将单个bean定义的作用域限定为WebSocket的生命周期。 仅在基于web的Spring ApplicationContext上下文中有效。

5、 Spring框架中的单例bean是线程安全的吗?

不,Spring框架中的单例bean不是线程安全的。

6、Spring Bean生命周期

https://blog.csdn.net/apeopl/article/details/82964799

1、Spring框架中bean的生命周期。

  • Spring容器 从XML 文件中读取bean的定义,并实例化bean。

  • Spring根据bean的定义填充所有的属性。

  • 如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。

  • 如果Bean实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory方法。

  • 如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。

  • 如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。

  • 如果有BeanPostProcessors 和bean关联,这些bean的postProcessAfterInitialization()方法将被调用。

  • 如果bean实现了 DisposableBean,它将调用destroy()方法。

2、哪些是重要的bean生命周期方法? 你能重载它们吗?

​ 初始化和销毁的时候(xml中init-method和destroy-method)(@PostConstruct和@PreDestroy)。

​ 有两个重要的bean 生命周期方法,第一个是setup , 它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。

7、Spring Bean自动装配

1、什么是bean装配?
装配指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。

2、什么是bean的自动装配?
Spring 容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。

3、解释不同方式的自动装配 。

no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
byName:通过参数名自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
byType::通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
constructor:这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。

8、Spring注解

1、什么是基于Java的Spring注解配置
@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。

2、Spring 针对 Bean 管理中创建对象提供注解
(1) @Component
(2) @Service
(3) @Controller
(4) @Repository

上面四个注解功能是一样的,都可以用来创建bean 实例
3、什么是基于注解的容器配置?
相对于XML,注解使用时开发时直接在相应的类,方法,属性上使用注解进行bean对象的组装和注入。

开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。

4、怎样开启注解装配?
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 context:annotation-config/元素。

5、@Required 注解
这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。

6、@Autowired 注解
@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。

7、@Qualifier 注解
当有多个相同类型的bean却只有一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的bean。

4、Spring-AOP

1、AOP 基本概念

(1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能

(3)使用登录例子说明 AOP

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2vunSDoG-1670856538705)(png/1651026791022.png)]

2、AOP(底层原理)

1)AOP 底层使用动态代理 ,动态代理有两种情况:

第一种 有接口情况,使用 JDK 动态代理 ;创建接口实现类代理对象,增强类的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qOLANORK-1670856538706)(png/1651026844671.png)]

第二种 没有接口情况,使用 CGLIB 动态代理;创建子类的代理对象,增强类的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lswRAfrt-1670856538706)(png/1651026892473.png)]

3、AOP(JDK 动态代理)

1)使用 JDK 动态代理,使用 Proxy 类里面的方法创建代理对象

调用 newProxyInstance 方法,方法有三个参数:

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)

第一参数,类加载器

第二参数,增强方法所在的类,这个类实现的接口,支持多个接口

第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分

4、AOP(术语)

a)连接点:类里面哪些方法可以被增强,这些方法称为连接点(一个类里面所有的方法都可成为连接点)

b)切入点:实际被真正增强的方法称为切入点(真正被增强的方法,比如给类中的add()方法进行增强。add就是实际切入点)

c)通知(增强):实际增强的逻辑部分称为通知,且分为以下五种类型:

​ 1)前置通知 2)后置通知 3)环绕通知 4)异常通知 5)最终通知

d)切面:把通知应用到切入点过程(一个过程)

5、AOP操作

a)Spring 框架一般都是基于 AspectJ 实现 AOP 操作,AspectJ 不是 Spring 组成部分,独立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使 用,进行 AOP 操作

b)基于 AspectJ 实现 AOP 操作:1)基于 xml 配置文件实现 (2)基于注解方式实现(使用)

c)引入相关jar包

d)切入点表达式,如下:

(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强
(2)语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称 )
(3)例子如下:

例 1:对 com.zh.dao.BookDao 类里面的 add 进行增强
	execution(* com.zh.dao.BookDao.add(..))
例 2:对 com.zh.dao.BookDao 类里面的所有的方法进行增强
	execution(* com.zh.dao.BookDao.* (..))
例 3:对 com.zh.dao 包里面所有类,类里面所有方法进行增强
    execution(* com.zh.dao.*.* (..))
execution: For matching method execution join points. This is the primary pointcut designator to use when working with Spring AOP.
execution:用于匹配到方法级别的连接点,这也是spring aop中最为常用的PCD。

within: Limits matching to join points within certain types (the execution of a method declared within a matching type when using Spring AOP).
within:只能匹配到具体类的类型级别

this: Limits matching to join points (the execution of methods when using Spring AOP) where the bean reference (Spring AOP proxy) is an instance of the given type.
this : 只能匹配目标类的代理类是否是this中指定的类型

target: Limits matching to join points (the execution of methods when using Spring AOP) where the target object (application object being proxied) is an instance of the given type.
target:只能匹配目标类是否是target中指定的类型

args: Limits matching to join points (the execution of methods when using Spring AOP) where the arguments are instances of the given types.
args:仅仅按照目标方法的参数类型来进行匹配,与方法所在类的包名和参数名无关。

@target: Limits matching to join points (the execution of methods when using Spring AOP) where the class of the executing object has an annotation of the given type.
@target:匹配目标类中有@target指定的注解

@args: Limits matching to join points (the execution of methods when using Spring AOP) where the runtime type of the actual arguments passed have annotations of the given types.
@args:匹配参数中有@args中指定的注解类型的方法

@within: Limits matching to join points within types that have the given annotation (the execution of methods declared in types with the given annotation when using Spring AOP).
@within:匹配目标类有@within中指定的注解的类

@annotation: Limits matching to join points where the subject of the join point (the method being executed in Spring AOP) has the given annotation.
@annotation:匹配方法上有@annotation中指定的注解类型的方法。

e the given annotation (the execution of methods declared in types with the given annotation when using Spring AOP).
@within:匹配目标类有@within中指定的注解的类

@annotation: Limits matching to join points where the subject of the join point (the method being executed in Spring AOP) has the given annotation.
@annotation:匹配方法上有@annotation中指定的注解类型的方法。


参考:https://blog.csdn.net/qq_35843514/article/details/114287046?spm=1001.2014.3001.5501



学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230

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

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

相关文章

【推荐系统学习笔记】-- 2、特征工程

1、可利用的特征 1.1 用户行为特征 显性反馈行为&#xff1a;点赞、评分、评价等隐形反馈行为&#xff1a;点击、浏览、播放、加入购物车等 1.2 用户关系数据 显性&#xff1a;关注、好友关系隐形&#xff1a;点赞、共同观影使用Graph Embedding生成用户和物品的Embedding …

[附源码]Python计算机毕业设计SSM基于web的托育园管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

蓝牙遥控小车基础篇

开发环境&#xff1a; STM32F103R8T6最小系统板&#xff08;IO顺序引出&#xff09; 3D建模蓝牙遥控小车STL 蓝牙遥控小车纯HAL库代码 TP-Bluetooth-Car.apk蓝牙apk 原理&#xff1a;&#xff08;写代码前必须要知道模块的参数&#xff09; 蓝牙模块HC-05使用指南 HC-05蓝…

C++入门——函数重载

C入门——函数重载与缺省 先说说什么是缺省 大家生活中都知道什么关于缺省这个词的例子吗&#xff1f; 肯定是一头雾水&#xff0c;没事我举一个例子&#xff0c;给大家解释一下。 假如小菜是一个舔狗&#xff0c;他天天跟女神买早餐、嘘寒问暖。可是女神还是天天不为所动&am…

基于LabVIEW单片机的抢答器的设计

实训题目&#xff1a;基于LabVIEW单片机的抢答器的设计 1 系统设计 1.1 设计要求 1.1.1 设计任务 设计一个基于LABVIEW的6人抢答器&#xff0c;实现抢答器的基本功能。 1.1.2 性能指标要求 需要自己设计电路并焊接电路板。基本要求&#xff1a;有一个主持人控制开关和…

【华为机试真题详解】投篮大赛【2022 Q4 | 100分】

文章目录 前言题目描述示例 1题目解析参考代码前言 《华为机试真题详解 Python实现》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优)…

WeOps上新啦 | WeOpsV3.13网络设备监控全新改造,支持拓展不同品牌型号

本次WeOpsV3.13版本更新主题总结为&#xff1a; 优化网络设备监控&#xff0c;支持拓展不同品牌和型号的设备监控新增3D立体应用全景大屏&#xff0c;全方位展示应用和监控情况新增事件订阅&#xff0c;支持资产的到期提醒监控告警/IT服务台等模块持续更新&#xff0c;简化操作…

基于Android的太原市景点推荐系统的设计与实现

毕业设计 基于Android的太原市景点 推荐系统的设计与实现 1&#xff0e;课题意义及目标 随着人们生活水平的提高&#xff0c;外出旅游已经成了人们放松休闲的主要活动之一。现在移动端设备已是人们必备&#xff0c;最重要的是携带方便&#xff0c;基于Android的太原市景点推…

数图互通公用房基础数据管理与维护

公用房情况信息化&#xff0c;包括公用房位置、面积参数等&#xff0c;可便捷维护&#xff0c;并提供查询统计&#xff1b;实现二级单位对分配公用房的管理&#xff0c;可便捷维护&#xff0c;并提供查询统计&#xff1b;实现公用房使用人&#xff0c;对使用公用房的管理&#…

C++ Reference: Standard C++ Library reference: Containers: list: list: clear

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/clear/ 公有成员函数 <list> std::list::clear C98 void clear(); C11 void clear() noexcept;清除内容 从list容器中删除所有元素&#xff08;已销毁&#xff09;&#xff0c;并将容器的size保留为…

设计模式-外观模式

前言 在聊外观模式之前&#xff0c;我们先来聊聊体检过程。一般体检过程就是我们根据网上预定得日期空腹去体检中心。根据预定得项目&#xff0c;有一般检查、内科、外科、眼科、彩超、心电图、血常规、尿常规等等项目。 而我们往往第一次去是不知道这些房间是在哪里的&#…

XenServer7.6安装教程

XenServer7.6安装安装步骤其他XenServer 7.0 系统 yum 出错解决办法XenServer其他部署问题安装步骤 进入系统启动界面 > 按回车&#xff0c;等待加载&#xff1a; 1、键盘布局选择 > 选择us&#xff1a; 2、欢迎界面 > 选择ok&#xff1a; 3、用户协议 > 选…

【大数据入门核心技术-Flume】(三)使用Flume采集数据到HDFS

目录 一、准备工作 1、Hadoop环境安装 2、Flume安装部署 二、采集数据到HDFS 1、配置任务文件 2、启动传输 3、查看是否同步成功 三、常见问题 1、运行flume-ng agent时报错com.google.common.base.Preconditions.checkArgument 2、ERR: File name has been re-used w…

tomcat配置https

tomcat配置前提需要开放需要配置端口&#xff0c;尤其是云服务器需要单独去提供商控制面板放行好再进行配置HTTPS&#xff0c;常见配置的端口&#xff1a;443、8443&#xff0c;另外配置过程如果项目正常运行&#xff0c;建议备份一份配置文件。 tomcat配置https步骤 一、我们…

EEMD(集合经验模态分解)

1. EEMD(集合经验模态分解)的概念 EEMD(Ensemble Empirical Mode Decomposition)是最常见的一种EMD改进方法。他的优势主要是解决EMD方法中的模态混叠现象。 说到模态混叠,顾名思义就是不同模态的信号混叠在一起,一般有两种情况:一是不同特征尺度的信号在一个IMF分量中…

更多自有品牌创新好物,尽在2023深圳国际自有品牌展暨新消品展

受整体环境的影响&#xff0c;以及内容购物、兴趣电商、O2O、团长等新消费方式崛起&#xff0c;传统商场、大卖场等实体零售市场发展呈下滑趋势。让零售行业可以重拾信心&#xff0c;迫切需要寻找新的业绩突破形式。这些年自有品牌&#xff0c;被越来越多的国内零售商所关注&am…

BL101助力于采集光伏电流电压

能源危机在世界范围内愈演愈烈&#xff0c; 俄乌冲突后&#xff0c;美国加大对俄罗斯能源的制裁力度&#xff0c;禁止从俄罗斯进口能源&#xff0c;也想办法让其欧洲盟友对俄罗斯进行抵制。导致油价高企&#xff0c;天然气价格也是一路飙升。各国都在发展新能源&#xff0c;风电…

【工具】JS脚本|网页任意视频倍速播放(包括MOOC、本地视频、其他的视频)

只要浏览器播放视频时用的是<video>&#xff0c;而且当前页面只有这一个视频&#xff0c;就可以用这个脚本。 刚好也是世界杯 CSDN 博客的活动了&#xff0c;虽然对活动没什么兴趣但是还是写一句和活动相关的话吧——世界杯为什么要看直播呢&#xff01;不如一起来倍速观…

ssm+Vue计算机毕业设计校园洗衣机预约系统(程序+LW文档)

ssmVue计算机毕业设计校园洗衣机预约系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

Linux内存查看通用方法(二): kernel空间

接上文&#xff1a; Linux内存查看通用方法&#xff08;一&#xff09;&#xff1a; user空间_红桃Jk的博客-CSDN博客_linux内存查看在嵌入式linux上&#xff0c;统计内存情况的一般方法https://blog.csdn.net/qq_34597963/article/details/126023451?spm1001.2014.3001.5501…