Spring复习笔记

2023-11-06

1、Spring

1.1、简介(优点)

  • Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器。
  • 轻量级、低侵入 、松耦合
  • 框架粘合剂,更容易整合其他框架
  • 支持事务处理

官网:https://spring.io/projects/spring-framework#overview
GitHub:https://github.com/spring-projects/spring-framework

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.4</version>
</dependency>

1.2、组成

在这里插入图片描述

1.3、IOC

** 控制反转(Invertion of control)是一种设计思想,DI(依赖注入)是实现IOC的一种方式。**在没有IOC思想的程序中,对象的创建和管理都由开发者来控制,控制反转后,对象的创建和管理交由第三方,因此,控制反转是获取对象的方式反转了的意思

** 控制反转是一种通过描述(XML或者注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转的是Ioc容器,其实现方式是依赖注入(Dependendy Injection)。**

1.4、IOC创建对象的几种方式

1、默认使用无参构造
2、若需使用有参构造创建对象

  1. 通过下标赋值

    <bean id="exampleBean" class="examples.ExampleBean">
        <constructor-arg index="0" value="7500000"/>
        <constructor-arg index="1" value="42"/>
    </bean>
    
  2. 通过类型创建(不推荐)

    <bean id="exampleBean" class="examples.ExampleBean">
        <constructor-arg type="int" value="7500000"/>
        <constructor-arg type="java.lang.String" value="42"/>
    </bean>
    
  3. 通过参数名(推荐)

    <bean id="exampleBean" class="examples.ExampleBean">
        <constructor-arg name="years" value="7500000"/>
        <constructor-arg name="ultimateAnswer" value="42"/>
    </bean>
    

总结:spring在加载配置文件的时候,就会初始化所管理的对象

1.5、Spring 配置

  1. 别名

    	<!--如果添加了别名,可以通过别名来获取这个类的对象-->
        <alias name="student" alias="flowers"/>
    
  2. Bean配置

    <!--
    	id:bean的唯一标识符
    	class:bean对象所对应的全限定名:包名+类型
    	name:别名,可同时取多个别名
    	-->
    <bean id="User" class="com.yijin.User" name="user u u2 u4">
    	<property name="name" value="依锦">
    </bean>
    
  3. import
    import是将多个配置文件导入合并成一个总文件

    <import resource=“beans.xml”/>
    <import resource=“beans2.xml”/>
    <import resource=“beans3.xml”/>
    

1.6、依赖注入

  1. 构造器注入
  2. Set方式注入
    • 真实测试对象
      public class Student {
          private String name;
          private Address address;
          private String[] books;
          private List<String> hobbys;
          private Map<String,String> card;
          private Set<String> games;
          private String girlfriend;
          private Properties info;
      
    1. 复杂类型

      public class Address {
          private String address;
      
    2. beans.xml

      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:p="http://www.springframework.org/schema/p"
             xmlns:c="http://www.springframework.org/schema/c"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
       "
      >
      
      
      </beans>
      
    3. 测试类

      public class Test3 {
          public static void main(String[] args) {
              ApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:spring/bean*.xml");
              Student student= (Student) applicationContext.getBean("student");
              System.out.println(student);
          }
      }
      
    4. 完善注入信息

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:p="http://www.springframework.org/schema/p"
             xmlns:c="http://www.springframework.org/schema/c"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
       "
      >
      
          <bean id="student" class="com.newer.pojo.Student" p:name="依锦啊" c:address="">
              <property name="address" ref="address"/>
              <property name="books">
                  <array>
                      <value>红楼梦</value>
                      <value>西游记</value>
                      <value>水浒传</value>
                      <value>三国演义</value>
                  </array>
              </property>
              <property name="hobbys">
                  <list>
                      <value>学习</value>
                      <value>看书</value>
                      <value>玩游戏</value>
                      <value>敲代码</value>
                  </list>
              </property>
              <property name="card">
                  <map>
                      <entry key="身份证" value="123456789"/>
                      <entry key="银行卡" value="321456987"/>
                  </map>
              </property>
              <property name="girlfriend">
                  <null/>
              </property>
              <property name="info">
                  <props>
                      <prop key="年级">小学三年级</prop>
                      <prop key="学号">ja180902</prop>
                  </props>
              </property>
          </bean>
          <bean id="address" class="com.newer.pojo.Address">
              <property name="address" value="上海"/>
          </bean>
      
      </beans>
      

1.7、bean作用域

在这里插入图片描述

1、单例模式(默认)

<!-- the following is equivalent, though redundant (singleton scope is the default) -->
<bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>

2、原型模式:每次从容器中get的时候会产生新的对象

<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>

3、其余的request、session、application 这些只能在web中使用

1.8、Bean自动装配

  • 自动装配是Spring满足bean依赖的一种方式,Spring会在上下文中自动寻找,并给bean装配属性!

  • Spring提供三种装配bean的方式
    1、在xml中显示的装配
    2、在Java中显示的装配
    3、隐式的自动装配bean

    自动装配有三个类型
    在这里插入图片描述

    <bean class="com.yijin.Cat"/>
    <bean class="com.yijin.Dog"/>
    <!--
    	byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid
    	byType:会自动在容器上下文中查找,和自己对象属性相同的bean
     -->
    <bean id="people" class="com.yijin.People" autowire="byType">
    	<property name="name" value="依锦">
    </bean>
    

    小结:

    • byName的时候,需要保证beanid的唯一,并且这个bean需要和自动注入的属性的set方法的值一致
    • byType需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致

1.9、使用注解进行自动装配

  1. 导入配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>


@Autowired:直接在想要自动装配的属性上使用,也可以在set方法使用
该注解且存在一个required属性,如果显示定义了required属性为false,说明这个对象可以为null,
否则不允许为空

如果@Autowired 自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,我们可以使用@Qualifier(value=“xxx”)去配置@Autowired的使用,指定唯一的bean对象注入

public class People{
	@Autowired
	@Qualfier(value = "cat111 ")
	private Cat cat;
}

@Resource:同上一个注解一样是自动装配的效果

区别:

  • 都是用来自动装配,用来放在属性字段之上
  • @Autowired 通过byType实现,而且必须要求这个对象名存在
  • @Resource默认通过byName方式实现,若找不到名字,则通过byType实现,若都找不到则报错

2、使用注解开发

在Spring4.0之后,要使用注解开发必须要保证aop包的导入

  1. bean

  2. 属性的注入
    @Value(“xxx”)

  3. 衍生的注解
    @Component有几个衍生的注解,我们在web开发中,会按照mvc三层架构分层
    dao[@Repository]
    service[@Service]
    controller[@Controller]
    这四个注解代表一样的意思(将某个类注入到spring容器中)

  4. 自动装配

    @Autowired:通过类型名字
    @Nullable :表示标记的字段可以为空
    @Resource:通过名字类型

  5. 小结
    xml与注解:
    xml更加万能,适用于任何场合,维护方便简单
    注解简易配置,但维护相对复杂,只能适用自己的类

3. 完全使用Java配置Spring

在这里插入图片描述
Spring最新版本可以完全使用Java类和注解代替xml文件

3、代理模式

代理模式由抽象角色代理角色真实角色所组成,是为其他对象提供一种代理以控制对该对象的一个访问,代理对象可以在客户端和目标对象起到中介的作用,以此保护真实对象,SpringAOP 的底层实现原理就为代理模式

3.1、静态代理

角色分析:

  • 抽象角色:一般使用接口或抽象类来解决
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色,代理真实角色之后,会做一些附属操作
  • 客户:访问代理角色

代理模式好处:

  • 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
  • 繁琐的东西交给代理角色,实现业务的分工
  • 公共业务发生扩展的时候,方便集中管理

缺点:

  • 一个真实角色就会产生一个代理角色;代码量增多,开发效率变低

3.2、动态代理

  • 动态代理和静态代理的角色一样
  • 动态代理的动态类是直接生成的,不是自己写好的
  • 动态代理分为两大类,基于接口的动态代理和基于类的动态代理
    • 基于接口:jdk动态代理
    • 基于类:cglib
    • Java字节码实现:Javassist

需要了解2个类:proxy、InvocationHandler

动态代理的优点:

  • 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
  • 繁琐的东西交给代理角色,实现业务的分工
  • 公共业务发生扩展的时候,方便集中管理
  • 一个动态代理类代理的是一个接口,一般就是对应的一类业务
  • 一个动态代理类可以代理多个类,只需要实现同一个接口

4、AOP

4.1、什么是AOP

AOP为Aspect Oriented Programming的缩写,是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring复习笔记 的相关文章

  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用?

    我想生成 JWT 并使用 HMAC SHA256 对其进行签名 对于该任务我必须使用jose4j https bitbucket org b c jose4j wiki Home 我尝试根据秘密生成密钥 SecretKeySpec key
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 在 ContainerRequestFilter 中填充 spring request 作用域 bean

    我使用 jersey 1 13 和 spring 3 1 1 编写了一个在 tomcat 6 上运行的休息服务 在 tomcat 中 我使用一个领域来进行身份验证 在我的应用程序中 我需要当前用户 但我不想从每个资源中的球衣访问Securi
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 如何通过 Inno Setup for NetBeans 使用自定义 .iss 文件

    我将 Inno Setup 5 与 NetBeans 8 一起使用 并且我已经能够创建一个安装程序来安装该应用程序C users username local appname 但是我希望将其安装在C Programfiles 我如何在 Ne
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • HCIP考试考哪三门你知道么?

    HCIP考试考哪三门 HCIP是华为认证中资深级别的认证 与hcia相比 它可能需要考多门考试 只有都通过了 才能获得HCIP认证 那么HCIP考试要考哪三门呢 其实 不同的方向需要通过的考试门数各不相同 有的只要通过一门 有的则是两门 最
  • kettle转换中文数据出现乱码

    在使用kettle转换数据时 有时会出现中文乱码问题 下面介绍解决办法 首先先保证你自己创建或连接的数据库是utf 8编码 1 设置DB连接 打开kettle中连接的数据库 在高级中输入set names utf8 2 再到选项中命名参数
  • Flink服务器无响应,apache-flink

    在这种情况下 我们有3个kafka主题 每个主题有50个分区 它们具有不同的消息 而所有这些消息都具有 用户名 字段 topic 1 gt Message01 String username about 50 000 messages pe
  • 分析Java线程池执行原理

    Java并发编程源码分析系列 分析Java线程池的创建 上一篇已经对线程池的创建进行了分析 了解线程池既有预设的模板 也提供多种参数支撑灵活的定制 本文将会围绕线程池的生命周期 分析线程池执行任务的过程 线程池状态 首先认识两个贯穿线程池代
  • Vue2.0 Vue脚手架 插件

    Vue当中有一个特别强大但写起来特别简单的一个东西 名字叫 插件 有什么作用 可以帮我们去增强一下Vue 先配置好项目 自己写的话 main js 项目执行npm run serve后第一个进入的 import Vue from vue i
  • maven报错‘has elapsed or updates are forced“

    使用 U强制更新参数运行maven命令
  • 少儿机器人编程有什么用

    少儿机器人编程有什么用 小孩的学习一直以来都是家长们非常关心和重视的一件事情 很多的家长在培养孩子的学习方面也可以说是相当的耐心的 会给孩子选择一些能更有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于
  • 解决Enter passphrase for key

    两种解决方案 提示 Permissions 0644 for ssh id rsa pub are too open 解决方法 使用chmod 0600 ssh id rsa pub更改将公钥权限改成 600 提示 Enter passph
  • Java中的静态变量&静态方法

    静态变量 静态方法 静态变量又叫做类变量 静态方法又被称为类方法 均被static修饰 未被static修饰的成员变量和方法分别被称为实例变量和实例方法 1 静态方法中不需要它所属类的任何实例就可以访问 所以在静态方法中不可以使用this关
  • Swift语法学习--运算符与流程控制

    文章目录 运算符 循环 条件 预处理器指令 运算符 普通的运算符加减乘除 与或非 三元运算我觉得没必要再赘述了 就记录一下我不熟悉的 循环 条件 预处理器指令
  • SQL Server 数据库中添加文件组和数据文件

    SQL Server 现有数据库中添加文件组和数据文件 use CURRENT DB 进入当前操作数据库 go alter database CURRENT DB add filegroup FG1 向CURRENT DB 数据库添加FG1
  • idea安装插件plugin(主要针对网络连接不上的情况)

    STEP1 ctrl alt s 打开settings STEP2 在输入框键入 Plugins STEP3 输入你想要的插件名称 我这边输入的是nodejs 因为最近在学 我这边是安装过的 所以这样显示 STEP4 点开中下方的前两个按钮
  • 在windows下编译glib库

    glib库是跨平台的C语言函数库 是Gtk 库和Gnome的基础 glib可以在多个平台下使用 比如Linux Unix Windows等 glib为许多标准的 常用的C语言结构提供了相应的替代物 先从官网下载下载 https downlo
  • Linux网络通信总结

    网络IO之阻塞 非阻塞 同步 异步 单播 多播 组播 广播 多路复用POLL SELECT epoll 超时 read write accept connect 超时 实现 1 用select来设置超时机制 2 使用setsockopt 函
  • React 子向父级组件通信时,state为旧的数据

    问题描述 当嵌套太深的子组件触发更新父组件时 父组件获取到的state map传入子组件 是旧的 问题场景 初始子组件仅为1个Input输入框 新增后有2个Input输入框 此时触发222输入框的修改 通知上级组件保存修改的内容时 父组件存
  • 数据结构—单链表C语言刷题2

    目录 1 链表分割 2 链表的回文结构 3 相交链表 4 环形链表 5 环形链表II 1 链表分割 题目链接 链表分割 题目描述 现有一链表的头指针 ListNode pHead 给一定值x 编写一段代码将所有小于x的结点排在其余结点之前
  • Debug下出现debug assertion failed

    出现debug assertion failed界面后点击重试跳到这句ASSERT m hObject NULL 采用注释查找错误的方式定位至 if CFrameWnd OnCreate lpCreateStruct 1 return 1
  • 获取referer中的请求参数_Http请求头中的referer

    Referer是 HTTP请求header 的一部分 当浏览器 或者模拟浏览器行为 向web 服务器发送请求的时候 头信息里有包含 Referer 比如我在www google com 里有一个www baidu com 链接 那么点击这个
  • 在Linux内核中添加自己的驱动程序

    就说一下怎么添加进去吧 首先你要把驱动程序写好 我已添加 首先在drivers目录下面创建GPIO文件夹 文件夹下面创建三个文件 分别是 gpio c Kconfig Makefile 三个文件 gpio c是你的驱动程序 Kconfig是
  • Spring复习笔记

    1 Spring 1 1 简介 优点 Spring是一个轻量级控制反转 IoC 和面向切面 AOP 的容器 轻量级 低侵入 松耦合 框架粘合剂 更容易整合其他框架 支持事务处理 官网 https spring io projects spr