SSM【Spring SpringMVC Mybatis】—— Spring(二)

如果对于Spring的一些基础理论感兴趣可见👇

SSM【Spring SpringMVC Mybatis】—— Spring(一)

目录

1、Spring中bean的作用域

1.1 语法

1.2 四个作用域

2、Spring中bean的生命周期

2.1 bean的生命周期

2.2 bean的后置处理器

2.3 添加后置处理器后bean的生命周期

3、Spring中自动装配【基于XML】

3.1 Spring中提供两种装配方式

3.2 Spring自动装配语法及规则

3.3 总结

4、Spring中注解【非常重要】

4.1 使用注解将对象装配到IOC容器中

4.2 使用注解装配对象中属性【自动装配】

自动装配(Autowired):

限定装配(Qualifier):

字面量数值装配(Value):

5、Spring完全注解开发【0配置】

5.1 完全注解开发步骤

5.2 示例代码

6、AOP前奏

6.1 代理模式

6.2 为什么需要代理【程序中】

6.3 手动实现动态代理环境搭建

6.4 手动实现动态代理关键步骤


1、Spring中bean的作用域

1.1 语法

在bean标签中添加属性:scope属性即可

<bean id="myBean" class="com.example.MyBean" scope="singleton"/>

1.2 四个作用域

  • singleton(默认值):单例模式,容器中只存在一个bean实例。

    • 对象创建时机:当创建Spring容器时,bean实例会被创建并放入容器中。
  • prototype:原型模式,每次获取bean时都会创建一个新的实例。

    • 对象创建时机:当调用getBean()方法获取bean实例时,每次都会创建一个新的实例。
  • request:请求作用域,每个HTTP请求都会创建一个新的bean实例。

    • 对象创建时机:每次HTTP请求到达时,都会创建一个新的bean实例,并在当前请求结束后销毁。
    • 当前请求:即URL不变的情况下,同一个HTTP请求中的所有处理都处于同一个请求域中。
  • session:会话作用域,每个HTTP会话都会创建一个新的bean实例。

    • 对象创建时机:在用户会话开始时创建一个bean实例,并在用户会话结束后销毁。
    • 当前会话:即用户在浏览器上不关闭、不更换的情况下持续访问应用的时间段。

2、Spring中bean的生命周期

2.1 bean的生命周期

  1. 通过构造器或工厂方法创建bean实例:Spring容器根据配置信息和依赖关系,使用构造器或工厂方法创建bean实例。

  2. 为bean的属性设置值和对其他bean的引用:Spring容器注入bean的属性值和依赖的其他bean。

  3. 调用bean的初始化方法:如果bean配置了初始化方法,Spring容器会在属性注入完成后调用该方法进行初始化。

  4. bean可以使用了:bean初始化完成后,可以被其他bean或应用程序代码引用和使用。

  5. 当容器关闭时,调用bean的销毁方法:如果bean配置了销毁方法,当Spring容器关闭时,会调用该方法进行清理工作。

2.2 bean的后置处理器

作用:在调用初始化方法前后对bean进行额外的处理。

实现:

实现BeanPostProcessor接口

重写方法

postProcessBeforeInitialization(Object, String):在bean的初始化方法调用之前调用,允许修改bean的属性值或做其他处理。

postProcessAfterInitialization(Object, String):在bean的初始化方法调用之后调用,允许在bean初始化完成后进行额外的处理。

注意:装配后置处理器会为当前容器中每个bean均装配,不能为局部bean装配后置处理器

2.3 添加后置处理器后bean的生命周期

① 通过构造器或工厂方法创建bean实例

② 为bean的属性设置值和对其他bean的引用

postProcessBeforeInitialization(Object, String):在bean的初始化之前执行

③ 调用bean的初始化方法

postProcessAfterInitialization(Object, String):在bean的初始化之后执行

④  bean可以使用了

⑤ 当容器关闭时,调用bean的销毁方法

3、Spring中自动装配【基于XML】

3.1 Spring中提供两种装配方式

手动装配:通过XML文件或Java配置显式地指定bean之间的依赖关系。

自动装配:让Spring容器根据一定的规则自动将合适的bean注入到目标bean中,而不需要显式地在配置文件中声明这些依赖关系。

3.2 Spring自动装配语法及规则

在bean标签中添加属性:Autowire即可,

常用的有两种:

  • byName:根据属性名称自动装配。Spring会查找与属性名相同的bean,并将其注入到目标bean的属性中。

  • byType:根据属性类型自动装配。Spring会查找与属性类型相同的bean,并将其注入到目标bean的属性中。如果找到多个匹配的bean,则会报错。

注意:基于XML方式的自动装配只能装配非字面量数值(即不是直接指定的常量值)。

3.3 总结

在基于XML的自动装配中,底层实际上是通过setter方法进行注入的。但通常不推荐使用byName和byType方式进行自动装配,因为它们可能会导致不可预期的结果,特别是在大型项目中容易出现问题。相反,建议使用注解方式进行自动装配。

4、Spring中注解【非常重要】

4.1 使用注解将对象装配到IOC容器中

约定:约束>配置【注解>XML】>代码

位置:在类上面标识

注意:

Spring本身不区分四个注解【四个注解本质是一样的@Component】,提供四个注解的目的只有一个:提高代码的可读性

在使用注解装配对象时,Spring会默认将类名的首字母小写作为bean的ID。你也可以使用value属性来指定bean的ID。

装配对象四个注解

@Component:装配普通组件到IOC容器

@Repository:装配持久化层组件到IOC容器

@Service:装配业务逻辑层组件到IOC容器

@Controller:装配控制层|表示层组件到IOC容器

使用注解步骤

导入相关jar包【已导入】

开启组件扫描

    <!--    开启组件扫描

            base-package:设置扫描注解包名【当前包及其子包】

    -->

    <context:component-scan base-package="com.atguigu"></context:component-scan>

使用注解标识组件

4.2 使用注解装配对象中属性【自动装配】

自动装配(Autowired):
  • 使用@Autowired注解可以实现对象属性的自动装配。
  • 装配原理基于反射机制,Spring会尝试按照byType进行匹配。
  • 如果匹配到一个对象,则正常使用。
  • 如果匹配不到对象,默认情况下会报错,但可以通过设置@Autowired(required=false)来避免报错。
  • 如果匹配到多个对象,会尝试按照byName进行唯一筛选,如果筛选失败则报错。
  • @Autowired注解的required属性可以设置为true或false,表示是否必须装配对象。

          /*expected at least 1 bean which qualifies as autowire candidate.   Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

          */
限定装配(Qualifier):

@Qualifier注解

作用:配合@Autowired一起使用,将设置beanId名称装配到属性中

注意:不能单独使用,需要与@Autowired一起使用

字面量数值装配(Value):

@Value注解

作用:装配对象中属性【字面量数值】

5、Spring完全注解开发【0配置】

5.1 完全注解开发步骤

5.1.1. 创建配置类

5.1.2. 在class上面添加注解

@Configuration:标识当前类是一个配置类,作用:代替XML配置文件

@ComponentScan:设置组件扫描当前包及其子包

5.1.3. 使用AnnotationConfigApplicationContext容器对象

5.2 示例代码

@Configuration

@ComponentScan(basePackages = "com.atguigu")

public class SpringConfig {

}

  @Test

    public void test0Xml(){

        //创建容器对象

//        ApplicationContext context =

//                new ClassPathXmlApplicationContext("applicationContext.xml");

        //使用AnnotationConfigApplicationContext容器对象

        ApplicationContext context =

                new AnnotationConfigApplicationContext(SpringConfig.class);

        DeptDaoImpl deptDao = context.getBean("deptDao", DeptDaoImpl.class);



        System.out.println("deptDao = " + deptDao);

    }

6、AOP前奏

6.1 代理模式

代理模式:我们需要做一件事情,又不期望自己亲力亲为,此时,可以找一个代理【中介】

我们【目标对象】与中介【代理对象】不能相互转换,因为是“兄弟”关系

  

6.2 为什么需要代理【程序中】

需求:实现【加减乘除】计算器类

在加减乘除方法中,添加日志功能【在计算之前,记录日志。在计算之后,显示结果。】

实现后发现问题如下

日志代码比较分散,可以提取日志类

日志代码比较混乱,日志代码【非核心业务代码】与加减乘除方法【核心业务代码】书写一处

总结:在核心业务代码中,需要添加日志功能,但不期望在核心业务代码中书写日志代码。

此时:使用代理模式解决问题【先将日志代码横向提取到日志类中,再动态织入回到业务代码中】

6.3 手动实现动态代理环境搭建

实现方式

基于接口实现动态代理: JDK动态代理

基于继承实现动态代理: Cglib、Javassist动态代理

实现动态代理关键步骤

 一个类:Proxy

概述:Proxy代理类的基类【类似Object】

作用:newProxyInstance():创建代理对象

一个接口:InvocationHandler

概述:实现【动态织入效果】关键接口

作用:invoke(),执行invoke()实现动态织入效果

6.4 手动实现动态代理关键步骤

注意:代理对象与实现类【目标对象】是“兄弟”关系,不能相互转换

创建类【为了实现创建代理对象工具类】

提供属性【目标对象:实现类】

提供方法【创建代理对象】

提供有参构造器【避免目标对为空】


package com.atguigu.beforeaop;



import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;





public class MyProxy {



    /**

     * 目标对象【目标客户】

     */

    private Object target;



    public MyProxy(Object target){

        this.target = target;

    }



    /**

     * 获取目标对象的,代理对象

     * @return

     */

    public Object getProxyObject(){

        Object proxyObj = null;



        /**

            类加载器【ClassLoader loader】,目标对象类加载器

            目标对象实现接口:Class<?>[] interfaces,目标对象实现所有接口

            InvocationHandler h

         */

        ClassLoader classLoader = target.getClass().getClassLoader();

        Class<?>[] interfaces = target.getClass().getInterfaces();

        //创建代理对象

        proxyObj = Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {

            //执行invoke()实现动态织入效果

            @Override

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

                //获取方法名【目标对象】

                String methodName = method.getName();

                //执行目标方法之前,添加日志

                MyLogging.beforeMethod(methodName,args);

                //触发目标对象目标方法

                Object rs = method.invoke(target, args);

                //执行目标方法之后,添加日志

                MyLogging.afterMethod(methodName,rs);

                return rs;

            }

        });

        return proxyObj;

    }



//    class invocationImpl implements InvocationHandler{

//    }



}




@Test

    public void testBeforeAop(){



//        int add = calc.add(1, 2);

//        System.out.println("add = " + add);



        //目标对象

        Calc calc = new CalcImpl();

        //代理工具类

        MyProxy myProxy = new MyProxy(calc);

        //获取代理对象

        Calc calcProxy = (Calc)myProxy.getProxyObject();

        //测试

//        int add = calcProxy.add(1, 2);

        int div = calcProxy.div(2, 1);



    }













 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

upload-labs靶场通关详解(1-15)

1.pass-01 查看源代码 是js&#xff0c;属于前端校验 可以通过禁用js来上传文件 2.pass-02 根据提示是MIME绕过 MIME&#xff1a;是设定某种扩展名的文件 用一种应用程序来打开的方式类型&#xff0c;当该扩展名文件被访问的时候&#xff0c;浏览器会自动使用指定应用程序来…

OpenAI发布新品GPT-4o,电影《HER》演绎的世界真的来了!

5月14日&#xff0c;OpenAI宣布推出最新旗舰生成式AI模型GPT-4o&#xff0c;它可以实时处理音频、视觉、并对文本进行推理。可以说这是一种全新的交互模式&#xff0c;它完美复刻电影《Her》的世界&#xff0c;标志着人工智能全感知时代的到来。 GpuMall智算云 | 省钱、好用、…

swiper 点击事件失效问题

在刚开始使用是 swiper 时&#xff0c;点击事件有时失效&#xff0c;这些个问题的原因是&#xff1a;swiper设置looptrue时&#xff0c;会生成虚拟slide进行填充&#xff0c;对这些虚拟slide元素进行操作是无效的。 简单粗暴的方法就是将 loop 置为 false ....................…

JVM面试题:85道JVM虚拟机面试题及答案

面试题 1 .简述Java堆的结构&#xff1f;什么是堆中的永久代(Perm Gen space)? JVM整体结构及内存模型 试题回答参考思路&#xff1a; 1、堆结构 JVM的堆是运行时数据区&#xff0c;所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自…

开发测试必须知道的 10种 常见软件架构模式

你是否想知道企业大规模系统是如何设计的? 在软件开发开始之前&#xff0c;我们必须选择一个合适的架构&#xff0c;能提供所需的功能和质量特性。因此&#xff0c;在将架构应用到我们的设计之前&#xff0c;我们应该了解各种不同架构的特点。 01 什么是架构模式 根据维基百…

一文分享:抖音外卖城市合伙人如何申请合作?

在当今数字化时代&#xff0c;外卖和团购业务蓬勃发展&#xff0c;商家们纷纷寻求在多个平台上拓宽销售渠道&#xff0c;以获取更多的订单和利润&#xff0c;这也给创业者提供创来机会。在这其中&#xff0c;抖音外卖作为一股新势力&#xff0c;自然吸引了众多创业者的目光&…

解锁客户需求密码:银行业数据分析在业务决策中的关键作用

一、引言 在数字化和大数据时代的浪潮下&#xff0c;银行业正经历着前所未有的变革。作为数据分析领域的资深专家&#xff0c;我深知数据分析在银行业务发展中的重要性和价值。本文将从银行业数据分析的角度出发&#xff0c;深入探讨相关业务场景下的数据分析应用&#xff0c;…

斥巨资!韩国力撑芯片产业

KlipC报道&#xff1a;韩国为加强本国半导体产业竞争力&#xff0c;将推进一项超过10万亿韩元的支持计划。 大型科技公司微软、亚马逊和谷歌为了保持自己大型语言模型的竞争力&#xff0c;投入了大量的资金&#xff0c;全球对可生成AI应用的需求在不断增长&#xff0c;市场上对…

Vision Mamba 代码调试---Pycharm+AutoDL

《AutoDL使用手册》 1. 服务器租用与配置 先上项目链接&#xff1a; GitHub - hustvl/Vim: Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 1.1 服务器租用与配置 根据环境要求&#xff0c;去租一个服务器&#xff1a;AutoDL算…

Ajax 学习

文章目录 1. 前置知识1.1 ajax 介绍1.2 XML 简介 2. AJAX 学习2.1 AJAX基础学习&#xff08;1&#xff09;AJAX的特点&#xff08;2&#xff09;AJAX 初体验&#xff08;3&#xff09;服务端响应json 数据 2.2 IE 缓存问题2.3 请求超时和网络异常2.4 手动取消请求2.5 重复请求2…

鸿蒙 DevEcoStudio:用户名密码获取保存

【使用首选项实现用户名密码保存获取】 打开src/main/ets/entryability路径下的EntryAbility.ts文件 在 export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {hilog.info(0x0000, testTag, %{public}s, Ability onCreate);下边添加内容&…

【JVM】调优工具

这里简单介绍一下各种调优用到的工具 一&#xff0c;环境准备 首先我们需要准备好Java环境&#xff0c;和win上的jdk环境&#xff08;图形化界面如jconsole只有jdk中有&#xff09;。 有这样一个类Prolem&#xff0c;每个线程都会带来100个垃圾对象&#xff0c;线程new完100…

智慧公厕,提升公共厕所管理效率的信息化变革

现代社会中&#xff0c;公共厕所的管理成为一个不可忽视的问题。随着城市化进程的加快&#xff0c;人们对公厕的需求日益增加&#xff0c;但公厕的管理却面临诸多困难。为了解决这一问题&#xff0c;智慧公厕应运而生&#xff0c;通过信息化的变革&#xff0c;提高公厕的管理效…

QT函数整理

目录 1. 适应高分辨率函数 1. 适应高分辨率函数 自动适应调整设备安装QT的UI分辨率&#xff1a; QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 加载位置&#xff1a;

第四届辽宁省大学生程序设计竞赛

比赛经历&#xff1a;2024.5.14简单vp了一个小时只写出了签到题4个然后跑路了 补题&#xff1a;感觉其他题有点太抽象了主要补了一题&#xff0c;在区间问题中数据结构的使用 比赛链接[点我即可] 目录 A.欢迎来到辽宁省赛 B.胜率 F.隔板与水槽 H.取石子 L.区间与绝对值 …

第188题|幂级数的展开的常规方法(一)|武忠祥老师每日一题

解题思路&#xff1a;求幂级数有两种方法&#xff0c;一种是直接法&#xff0c;这里显然不太好求&#xff0c;还有一种是利用现有展开式展开&#xff0c;我们看到分母 可以分解因式成(x6)(x-1),进而拆解成一次式。拆解成一次式的目的是为了使用一下两个展开式。 第一步&#xf…

NARUTO 复现记录

1 环境配置 下载项目&#xff0c;一定要 git 下载全项目&#xff0c;下载完后要检查third_parities 里面的coslam和neural_slam_eval 文件全不全。 git clone --recursive https://github.com/oppo-us-research/NARUTO.git 环境配置 注意 bash scripts/installation/conda…

【哔哩哔哩下载】Bilidown,B站下载工具网站,永久免费使用NO.98

本文一共:448 个字,需要阅读:2 分钟,更新时间:2024年5 月14日,部分内容具有时效性,如有失效请留言,阅读量:0 输入B站视频网址就可以下载了 除了可以下载视频&#xff0c;还能获取弹幕、查看封面&#xff0c;如果你想解锁1080P画质&#xff0c;就需要扫码登录。 点击右下角的齿…

python “名称空间和作用域” 以及 “模块的导入和使用”

七、名称空间和作用域 可以简单理解为存放变量名和变量值之间绑定关系的地方。 1、名称空间 在 Python 中有各种各样的名称空间&#xff1a; 全局名称空间&#xff1a;每个程序的主要部分定义了全局的变量名和变量值的对应关系&#xff0c;这样就叫做全局名称空间 局部名称…

0508GoodsContent的Maven项目

0508GoodsContent的Maven项目包-CSDN博客 数据库字段 页面需求