1、Spring基础概念总结

news2024/9/28 11:16:54
  1. Spring概述:

    1. Spring体系结构

    在这里插入图片描述

  2. IOC的概念和作用

    1. 耦合指的是对象之间的依赖关系,耦合越小越好

    2. 以jdbc为例

      1. 通过反射来注册驱动,那么会造成驱动名称写死在程序当中,这种结果显然是不太合理的
      2. 通过配置文件的形式可以解决这种耦合问题
    3. 控制反转模式

      1. 之前程序之间获取对象是通过new的方式
      2. 现在由框架主动线程生成对象,程序被动接受框架生成的对象
    4. IOC作用就是削减计算程序之间的耦合关系

    5. BeanFactory and ApplicationContext的区别

      1. BeanFactory才是Spring容器的顶层接口,Application是BeanFactory的子接口
      2. ApplicationContext只要读取配置文件,默认情况下就会创建对象
      3. BeanFactory 什么时候使用,什么时候在创建对象
      4. ApplicationContext接口的实现类:
        1. ClassPathXmlApplicationContext:是从类的根路径下加载配置文件
        2. FileSystemXmlApplicationContext:是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
        3. AnnotationConfigApplicationContext:当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解
    6. IOC中的bean标签和管理对象细节

      1. bean标签:配置对象给Spring来创建,默认情况下调用的是无参构造函数,如没有无参构造函数则不能创建成功

      2. 实例化对象Bean的三种方式

        1. 使用默认的午餐构造函数:
        2. spring 管理静态工厂-使用静态工厂的方法创建对象
        3. spring 管理实例工厂-使用实例工厂的方法创建对象
      3. 依赖注入

        1. 实现持久层对象传入业务层
        2. 构造函数注入
              <!--构造函数注入:
                  使用的标签:constructor-arg
                  标签出现的位置:bean标签的内部
                  标签中的属性
                      type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
                      index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
                      name:用于指定给构造函数中指定名称的参数赋值                                        常用的
                      =============以上三个用于指定给构造函数中哪个参数赋值===============================
                      value:用于提供基本类型和String类型的数据
                      ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
          
                  优势:
                      在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
                  弊端:
                      改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。
              -->   
          <bean id="accountService" class="com.SpringDemo4springDI.service.IAccountServiceImpl">
                  <constructor-arg name="name" value="泰斯特"></constructor-arg>
                  <constructor-arg name="age" value="18"></constructor-arg>
                  <constructor-arg name="birthday" ref="now"></constructor-arg>
              </bean>
          
        3. set方法注入
              <!-- set方法注入                更常用的方式
                  涉及的标签:property
                  出现的位置:bean标签的内部
                  标签的属性
                      name:用于指定注入时所调用的set方法名称
                      value:用于提供基本类型和String类型的数据
                      ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
                  优势:
                      创建对象时没有明确的限制,可以直接使用默认构造函数
                  弊端:
                      如果有某个成员必须有值,则获取对象是有可能set方法没有执行。
              -->  
          
          <!-- 配置一个日期对象 -->
              <bean id="now" class="java.util.Date"></bean> 
          <bean id="accountService2" class="com.SpringDemo4springDI.service.IAccountServiceImp2">
                  <property name="name" value="TEST" ></property>
                  <property name="age" value="21"></property>
                  <property name="birthday" ref="now"></property>
              </bean>
          
        4. 集合注入
              <!-- 复杂类型的注入/集合类型的注入
                  用于给List结构集合注入的标签:
                      list array set
                  用于个Map结构集合注入的标签:
                      map  props
                  结构相同,标签可以互换
              -->
            <bean id="accountService3" class="com.itheima.service.impl.AccountServiceImpl3">
                  <property name="myStrs">
                      <set>
                          <value>AAA</value>
                          <value>BBB</value>
                          <value>CCC</value>
                      </set>
                  </property>
          
                  <property name="myList">
                      <array>
                          <value>AAA</value>
                          <value>BBB</value>
                          <value>CCC</value>
                      </array>
                  </property>
          
                  <property name="mySet">
                      <list>
                          <value>AAA</value>
                          <value>BBB</value>
                          <value>CCC</value>
                      </list>
                  </property>
          
                  <property name="myMap">
                      <props>
                          <prop key="testC">ccc</prop>
                          <prop key="testD">ddd</prop>
                      </props>
                  </property>
          
                  <property name="myProps">
                      <map>
                          <entry key="testA" value="aaa"></entry>
                          <entry key="testB">
                              <value>BBB</value>
                          </entry>
                      </map>
                  </property>
              </bean>
          
      4. 基于注解实现

        1. Component:用于把当前类对象存入到Spring容器当中
        2. Controller:表现层
        3. @Service 业务层
          1. @Autowired 自动类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功;
          2. @Qualifier 用于指定注入bean的id;
          3. @Resource 可独立使用 类似Autowired
        4. @Repository 持久层

      5. 基于注解的IOC配置

        1. 注解解决容易问题
          在测试类中,每个测试方法都有以下两行代码:
          ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
          IAccountService as = ac.getBean("accountService",IAccountService.class);
          这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。
          
          解决方案:
          依靠 spring 框架,因为它提供了一个运行器,可以读取配置文件(或注解)来创建容器。我
          们只需要告诉它配置文件在哪就行
          
          /**
           * 使用Junit单元测试:测试我们的配置
           * Spring整合junit的配置
           *      1、导入spring整合junit的jar(坐标)
           *      2、使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的
           *             @Runwith
           *      3、告知spring的运行器,spring和ioc创建是基于xml还是注解的,并且说明位置
           *          @ContextConfiguration
           *                  locations:指定xml文件的位置,加上classpath关键字,表示在类路径下
           *                  classes:指定注解类所在地位置
           *
           *   当我们使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上
           @RunWith 注解替换原有的运行器
           @ContextConfiguration 指定Spring配置文件的位置
           @AutoWired给测试类中的变量注入数据
           
           
           */    
              
          @RunWith(SpringJUnit4ClassRunner.class)
          @ContextConfiguration(classes = SpringConfiguration.class)
          public class AccountServiceTst {
          
              @Autowired
              private IAccountService accountService;
          
              @Test
              public void testFindAll(){
                  List<Account> accounts = accountService.findAllAccount();
                  for (Account account : accounts) {
                      System.out.println(account);
                  }
              }
          
          
          }
          
          
  3. AOP的相关概念:

    1. AOP 面向切面编程

    2. 使用动态代理技术实现代码运行期间,不修改源码对已有方法进行增强的操作

      private IAccountDao accountDao = new AccountDaoImpl();
          @Override
          public void saveAccount(Account account) {
              try {
                  TransactionManager.beginTransaction();
                  accountDao.save(account);
                  TransactionManager.commit();
              } catch (Exception e) {
                  TransactionManager.rollback();
                  e.printStackTrace();
              }finally {		
              	TransactionManager.release();
          }
      }
      @Override
      public void updateAccount(Account account) {
          try {
              TransactionManager.beginTransaction();
              accountDao.update(account);
              TransactionManager.commit();
          } catch (Exception e) {
              TransactionManager.rollback();
              e.printStackTrace();
          }finally {
              TransactionManager.release();
          }
      }
      // 以上有很多重复的事务代码,需要进一步优化处理
      // 解决方案: 使用动态代理技术解决重复代码问题
      
      public class BeanFactory {
      // 创建代理对象工厂
      
          private IAccountService accountService;
          private TransactionManager transactionManager;
      
          public final void setAccountService(IAccountService accountService) {
              this.accountService = accountService;
          }
      
          public void setTransactionManager(TransactionManager transactionManager) {
              this.transactionManager = transactionManager;
          }
      
      
          public IAccountService getAccountService(){
              return (IAccountService) Proxy.newProxyInstance(accountService.getClass().getClassLoader(),
                      accountService.getClass().getInterfaces(),
                      new InvocationHandler() {
                          @Override
                          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                              if("test".equals(method.getName())){
                                  return method.invoke(accountService,args);
                              }
                              Object returnValue = null;
                              try {
      
                                  transactionManager.beginTransaction();
                                  returnValue = method.invoke(accountService, args);
                                  transactionManager.commit();
                                  return  returnValue;
      
                              }catch (Exception e){
                                  transactionManager.rollback();
      
                                  throw new RuntimeException(e);
                              }finally {
      
                                  transactionManager.release();
                              }
                          }
                      });
          }
      }
      
      
  4. Spring 中的 AOP

    1. AOP 相关术语

      1. **Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点;
      2. **Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知;通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知;
      3. Introduction:运行期为类动态地添加一些方法或Field;
      4. Target: 代理目标的对象;
      5. Weaving:增强应用到目标对象来创建新的代理对象的过程;Spring采用的是动态代理织入;
      6. Proxy:一个类被AOP织入增强后产生一个结果代理类;
      7. 切入点和通知的结合:
      8. 切面通常是需要被增强的野望 代码,
        1. 切入点方法一般是业务层,加强的方法一般是在切入点之前执行并且通过AOP进行配置增强
        2. 增强方式有两种配置通知的类型:1.配置前置通知,后置通知,异常通知,最终通知;2配置环绕通知

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

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

相关文章

微服务--一篇入门kubernets

Kubernetes 1. Kubernetes介绍1.1 应用部署方式演变1.2 kubernetes简介1.3 kubernetes组件1.4 kubernetes概念 2. kubernetes集群环境搭建2.1 前置知识点2.2 kubeadm 部署方式介绍2.3 安装要求2.4 最终目标2.5 准备环境2.6 系统初始化2.6.1 设置系统主机名以及 Host 文件的相互…

成为AI产品经理——模型稳定性评估(PSI)

一、PSI作用 稳定性是指模型性能的稳定程度。 上线前需要进行模型的稳定性评估&#xff0c;是否达到上线标准。 上线后需要进行模型的稳定性的观测&#xff0c;判断模型是否需要迭代。 稳定度指标(population stability index ,PSI)。通过PSI指标&#xff0c;我们可以获得不…

Python类型注解必备利器:typing模块解读指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python 3.5版本后引入的typing模块为Python的静态类型注解提供了支持。这个模块在增强代码可读性和维护性方面提供了帮助。本文将深入探讨typing模块&#xff0c;介绍其基本概念、常用类型注解以及使用示例&am…

ssm农业信息管理系统源码和论文

摘 要 网络的广泛应用给生活带来了十分的便利。所以把农业信息管理与现在网络相结合&#xff0c;利用java技术建设农业信息管理系统&#xff0c;实现农业信息管理的信息化。则对于进一步提高农业信息管理发展&#xff0c;丰富农业信息管理经验能起到不少的促进作用。 农业信息…

JVM 运行时内存(三)

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。 1. 新生代 是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象&#xff0c;所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、…

分享全球顶尖的AIGC文生图资源

1 引言 人工智能正在改变许多行业的格局&#xff0c;而其中改变最直观和影响最大的就是AIGC领域的图像创作。文生图技术作为AIGC的一个重要分支&#xff0c;展现了人工智能在视觉创作领域的巨大潜力。发展至今已经有很多AI文生图平台&#xff0c;这是一次革命性的突破&#xf…

详解Hotspot的经典7种垃圾收集器原理特点与组合搭配

# 详解Hotspot的经典7种垃圾收集器原理特点与组合搭配 HotSpot共有7种垃圾收集器&#xff0c;3个新生代垃圾收集器&#xff0c;3个老年代垃圾收集器&#xff0c;以及G1&#xff0c;一共构成7种可供选择的垃圾收集器组合。 新生代与老年代垃圾收集器之间形成6种组合&#xff0c…

代码写完直接调试!IDEA插件还能这么用

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件&#xff1a;Api…

Apache Sqoop使用

1. Sqoop介绍 Apache Sqoop 是在 Hadoop 生态体系和 RDBMS 体系之间传送数据的一种工具。 Sqoop 工作机制是将导入或导出命令翻译成 mapreduce 程序来实现。在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。 Hadoop 生态系统包括&#xff1a;HDFS、Hi…

单片机系统

我们来看单片机 的例子&#xff0c;读者可能会担心单片机&#xff08;又称MCU&#xff0c;或微控制器&#xff09; 过于专业而无法理解。完全没必要&#xff01;在这里我们仅借它谈论一下有关时间的话题&#xff0c;顺带提一下单片机系统的概念。 单片机顾名思义是集成到一个芯…

【五分钟】熟练使用numpy的histogram函数(干货!!!)

histogram函数重要参数详解 def histogram(a, bins10, rangeNone, normedNone, weightsNone, densityNone):...位置参数a&#xff1a; The histogram is computed over the flattened array.&#xff08;源码对参数a的解释&#xff09; 从源码对参数a的解释来看&#xff0c;参…

[树莓派3B+][内核版本6.1]的linux内核编译+替换 (超详细)

学习Linux的内核编译&#xff0c;我使用的是x86 64位的18.04的ubuntu-linux虚拟机&#xff1a; 目录 树莓派的Linux内核源码安装 操作系统的启动过程 & Bootloader 单片机裸机&#xff1a;C51,STM32 X86&#xff0c;Intel&#xff1a;windows 嵌入式产品&#xff1a;…

深圳市左下右上百度坐标

爬取百度POI的时候&#xff0c;别人的代码中有提到左下&#xff0c;右上坐标&#xff0c;但是没有说从哪里来&#xff0c;而且还是百度的坐标。 经纬度:左下角,右上角&#xff1a;113.529103,37.444122;115.486183,38.768031 墨卡托坐标:左下角,右上角&#xff1a;12638139.45,…

由11月27日滴滴崩溃到近两个月国内互联网产品接二连三崩溃引发的感想

文章目录 知乎文分析微信聊天截图微信公众号 滴滴技术 发文k8s 官方文档滴滴官方微博账号 近两个月国内互联网产品“崩溃”事件2023-10-23 语雀崩溃2023-11-12 阿里云崩溃2023-11-27 滴滴崩溃2023-12-03 腾讯视频崩溃总结 我的感想 知乎文分析 最近连续加班&#xff0c;打车较…

d3dx9_43.dll丢失原因以及5个解决方法详解

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“d3dx9_43.dll缺失”。这个错误提示通常表示我们的电脑上缺少了DirectX的一个组件&#xff0c;而DirectX是游戏和多媒体应用所必需的软件。本文将介绍d3dx9_43.dll缺失对电脑的影响以及其原因…

第0篇红队笔记-APT-HTB

nmap 80 port-web尝试 searchploit-无结果 资源隐写查看-无结果 135 port rpcclient rpcinfo.py rpcdump.py rpcmap.py rpcmap.py爆破UUID 查看该UUID的表代表的服务能搜到UUID的漏洞 IOXIDResolver提取IPv6地址 IPV6-nmap smb smb探测目录 文件下载 测试其他目录 zip文件…

不再只是android,华为自爆Harmony将对标iOS

今年10月&#xff0c;华为官方宣布&#xff0c;鸿蒙OS 4升级设备数量已突破1亿&#xff0c;成为史上升级最快的鸿蒙OS版本。 日前&#xff0c;据数码博主“定焦数码”消息&#xff0c;大厂技术员工做适配&#xff0c;通过线下沟通时&#xff0c;华为反复提到一个问题&#xff…

很多人忽略的另外一种伦敦银交易计划

做伦敦银我们需要有交易计划&#xff0c;通过计划来执行交易&#xff0c;很多投资者清楚这一点。但是&#xff0c;实际交易中我们需要的计划不是一个&#xff0c;而是两个&#xff0c;那是哪两个计划呢&#xff1f;下面我们就来讨论一下。 具体交易的计划。怎么在一笔交易中取得…

BiseNet实现遥感影像地物分类

遥感地物分类通过对遥感图像中的地物进行准确识别和分类&#xff0c;为资源管理、环境保护、城市规划、灾害监测等领域提供重要信息&#xff0c;有助于实现精细化管理和科学决策&#xff0c;提升社会治理和经济发展水平。深度学习遥感地物分类在提高分类精度、自动化程度、处理…

java后端技术演变杂谈(未完结)

1.0版本javaWeb&#xff1a;原始servletjspjsbc 早期的jsp&#xff1a;htmljava&#xff0c;页面先在后端被解析&#xff0c;里面的java代码动态渲染完成后&#xff0c;成为纯html&#xff0c;再通过服务器发送给浏览器显示。 缺点&#xff1a; 服务器压力很大&#xff0c;因为…