SSM框架,Spring-ioc的学习(上)

news2024/9/23 7:18:26

知识点引入

关于框架

框架( Framework )是一个集成了基本结构、规范、设计模式、编程语言和程序库等基础组件的软件系统,它可以用来构建更高级别的应用程序。框架的设计和实现旨在解决特定领域中的常见问题,帮助开发人员更高效、更稳定地实现软件开发目标

关于组件

在服务端:

  • 负责处理客户端的请求、向客户端发送响应的controller层就是控制层
  • 负责业务逻辑处理的service层就是业务逻辑层,业务逻辑层由controller层调用,完成下一步的业务逻辑处理
  • 负责进行数据库操作的dao层就是持久化层,持久化层由业务逻辑层调用,完成下一步的对数据库的操作

组件便是其中各个层的可以复用的Java对象

组件管理

组件可以交给Spring 框架进行管理,Spring框架替代了程序员原有的new对象和对象属性赋值动作等

Spring具体的组件管理动作包含:

  • 组件对象实例化
  • 组件属性属性赋值
  • 组件对象之间引用
  • 组件对象存活周期管理
  • 等等
  • 我们只需要编写元数据(配置文件)告知Spring 管理哪些类组件和他们的关系即可

注:

  • 组件是映射到应用程序中所有可重用组件的Java对象,应该是可复用的功能对象
  • 组件一定是对象,,对象不一定是组件

即,Spring 充当一个组件容器,创建、管理、存储组件

SpringIoc容器介绍

Spring IoC 容器,负责实例化、配置和组装 bean(组件)。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。配置元数据以 XML、Java 注解或 Java 代码形式表现。它允许表达组成应用程序的组件以及这些组件之间丰富的相互依赖关系

SpringIoc容器的接口和实现类

SpringIoc容器接口

BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象,它是SpringIoC容器标准化超接口

ApplicationContextBeanFactory 的子接口。它扩展了以下功能:

  • 更容易与 Spring 的 AOP 功能集成
  • 消息资源处理(用于国际化)
  • 特定于应用程序给予此接口实现,例如Web 应用程序的 WebApplicationContext

BeanFactory 提供了配置框架和基本功能,而 ApplicationContext 添加了更多特定于企业的功能

ApplicationContext容器实现类

常见的四个实现类

类型名简介
ClassPathXmlApplicationContext通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象
FileSystemXmlApplicationContext通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象
AnnotationConfigApplicationContext通过读取Java配置类创建 IOC 容器对象
WebApplicationContext专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。

Spring容器配置方式

  1. XML配置方式:是Spring框架最早的配置方式之一,通过在XML文件中定义Bean及其依赖关系、Bean的作用域等信息,让Spring IoC容器来管理Bean之间的依赖关系。该方式从Spring框架的第一版开始提供支持。
  2. 注解方式:从Spring 2.5版本开始提供支持,可以通过在Bean类上使用注解来代替XML配置文件中的配置信息。通过在Bean类上加上相应的注解(如@Component, @Service, @Autowired等),将Bean注册到Spring IoC容器中,这样Spring IoC容器就可以管理这些Bean之间的依赖关系。
  3. Java配置类方式:从Spring 3.0版本开始提供支持,通过Java类来定义Bean、Bean之间的依赖关系和配置信息,从而代替XML配置文件的方式。Java配置类是一种使用Java编写配置信息的方式,通过@Configuration、@Bean等注解来实现Bean和依赖关系的配置。

Spring IoC / DI概念

  • IoC容器

    Spring IoC 容器,负责实例化、配置和组装 bean(组件)核心容器。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。

  • IoC(Inversion of Control)控制反转

    IoC 主要是针对对象的创建和调用控制而言的,也就是说,当应用程序需要使用一个对象时,不再是应用程序直接创建该对象,而是由 IoC 容器来创建和管理,即控制权由应用程序转移到 IoC 容器中,也就是“反转”了控制权。这种方式基本上是通过依赖查找的方式来实现的,即 IoC 容器维护着构成应用程序的对象,并负责创建这些对象。

  • DI (Dependency Injection) 依赖注入

    DI 是指在组件之间传递依赖关系的过程中,将依赖关系在容器内部进行处理,这样就不必在应用程序代码中硬编码对象之间的依赖关系,实现了对象之间的解耦合。在 Spring 中,DI 是通过 XML 配置文件或注解的方式实现的。它提供了三种形式的依赖注入:构造函数注入、Setter 方法注入和接口注入。

    Spring IoC / DI的实现步骤

    1. 编写配置信息(配置元数据)
    2. 实例化ioc容器
    3. 获取Bean(获取组件)

    基于xml文件配置ioc

    无参构造函数实例化

    例:有一个类,其中只有一个无参构造

    package com.ergou.ioc;
    
       public class HappyComponent {
    
    //默认包含无参数构造函数
    
    public void doWork() {
               System.out.println("HappyComponent.doWork");
           }
        }
    
    1. 在resources目录下创建xml文件(选择 xml配置 ---》spring配置)
    2. 在beans标签中创建bean标签,一个bean标签中写一个组件的信息,一个bean标签对应一个组件对象
    3. 在bean标签中写id属性和class属性的值
      • id属性是组件的标识,是唯一的,方便读取组件
      • class属性是组件的类的权限定符,其中写上对应类的路径
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="<http://www.springframework.org/schema/beans>"
           xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
           xsi:schemaLocation="<http://www.springframework.org/schema/beans> <http://www.springframework.org/schema/beans/spring-beans.xsd>">
    <!--可以使用无参构造函数实例化的组件-->
    <bean id = "happyComponent1" class = "com.ergou.ioc.HappyComponent"/>
    
    </beans>
    

    静态工厂方法实例化

    例:若有一个类是静态工厂方法实例化的

    package com.ergou.ioc;
    
    public class ClientService {
      private static ClientServiceclientService= new ClientService();
      private ClientService() {}
    
      public static ClientService createInstance() {
        returnclientService;
      }
    }
    

    同样是用bean标签,id属性写标识名,class写类路径,除此之外,还要加上写factory-method属性,其中写上静态方法的方法名

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="<http://www.springframework.org/schema/beans>"
           xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
           xsi:schemaLocation="<http://www.springframework.org/schema/beans> <http://www.springframework.org/schema/beans/spring-beans.xsd>">
    <!--可以使用无参构造函数实例化的组件-->
    <bean id = "happyComponent1" class = "com.ergou.ioc.HappyComponent"/>
    <!--静态工厂类声明工厂方法进行ioc配置-->
    <bean id="clientService" class="com.ergou.ioc.ClientService" factory-method="createInstance"/>
    </beans>
    

    实例工厂方法实例化(非静态方法)

    例:若有一个类(ClientServiceImpl)是实例工厂方法实例化的

    package com.ergou.ioc;
    
    public class DefaultServiceLocator {
    
      private static ClientServiceImplclientService= new ClientServiceImpl();
    
      public ClientServiceImpl createClientServiceInstance() {
        returnclientService;
      }
    }
    

    先写一个bean标签配置此工厂类的组件信息,然后在另一个bean标签中的factory-bean属性中写此工厂类的组件的bean的id属性值,再写factory-method属性中写实例工厂方法的方法名

    <!--实例工厂类声明ioc配置-->
    <!--配置工厂类的组件信息-->
    <bean id="defaultServiceLocator" class="com.ergou.ioc.DefaultServiceLocator"/>
    <!--指定非静态工厂对象和方法名来配置生成的ioc信息-->
    <bean id="clientService2" factory-bean="defaultServiceLocator" factory-method="createClientServiceInstance"/>
    

    基于xml文件配置di

    基于构造函数的依赖注入

    ①单个构造参数注入

    引用和被引用的组件,必须全部在ioc容器内。

    一个组件要引入另一个组件时,使用的bean标签应该是双标签

    在此bean双标签内,用constructor-arg标签引入信息

    关于constructor-arg标签:

    当要注入一些基本类型的参数时,使用value属性,写明具体的参数即可

    当要注入其他的组件时,在ref属性中写其他bean的id值即可

  • 例:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="<http://www.springframework.org/schema/beans>"
           xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
           xsi:schemaLocation="<http://www.springframework.org/schema/beans> <http://www.springframework.org/schema/beans/spring-beans.xsd>">
    
        <bean id="userService" class="com.ergou.ioc02.UserService">
            <constructor-arg ref="userDao"/>
        </bean>
        <bean id="userDao" class="com.ergou.ioc02.UserDao"/>
    </beans>
    

    ②多个构造参数注入

    • 构造参数的顺序填写参数:

    UserService的组件bean使用bean双标签,依次在其中写多个constructor-arg标签中填写参数即可

  • 例:

    若UserService类为:

    public class UserService {
    
            private UserDao userDao;
            private int age;
            private String name;
            public UserService(UserDao userDao) {
    
                this.userDao = userDao;
            }
    
            public UserService(int age , String name ,UserDao userDao) {
                this.age = age;
                this.name = name;
                this.userDao = userDao;
            }
        }
    

    要使用第二个多参的构造器

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="<http://www.springframework.org/schema/beans>"
           xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
           xsi:schemaLocation="<http://www.springframework.org/schema/beans> <http://www.springframework.org/schema/beans/spring-beans.xsd>">
    
        <bean id="userService" class="com.ergou.ioc02.UserService">
            <constructor-arg ref="userDao"/>
        </bean>
        <bean id="userDao" class="com.ergou.ioc02.UserDao"/>
        <bean id="userService2" class="com.ergou.ioc02.UserService">
            <constructor-arg value="18"/>
            <constructor-arg value="二狗"/>
            <constructor-arg ref="userDao"/>
        </bean>
    </beans>
    
    • 使用name属性值指定参数名,再写value属性进行参数的赋值,例
    <bean id="userService2" class="com.ergou.ioc02.UserService">
        <constructor-arg name="age" value="18"/>
        <constructor-arg name="name" value="二狗"/>
        <constructor-arg name="userDao" ref="userDao"/>
    </bean>
    
    • 使用参数的下角标(按参数的次序,从左到右,从0开始)
    <bean id="userService2" class="com.ergou.ioc02.UserService">
        <constructor-arg index="0" value="18"/>
        <constructor-arg index="1" value="二狗"/>
        <constructor-arg index="2" ref="userDao"/>
    </bean>
    

    基于setter方法注入

    需要引入的组件的bean也是bean的双标签

    在bean双标签中,使用property标签引入

    property标签的属性:

    • name:调用setter方法的名,为具体的setter方法名去掉开头的set后,将首字母小写,例如,setter方法名为setMovieName,对应name属性值应该为movieName
    • value:引用基本类型的值
    • ref:引用其他组件

    例:

    有两个类为

    public class MovieFinder{
    
    }
    
    public class SimpleMovieLister {
    
      private MovieFinder movieFinder;
    
      private String movieName;
    
      public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
      }
    
      public void setMovieName(String movieName){
        this.movieName = movieName;
      }
    
    // business logic that actually uses the injected MovieFinder is omitted...
    }
    
    <bean id="movieFinder" class="com.ergou.ioc02.MovieFinder"/>
    <bean id="simpleMovieLister" class="com.ergou.ioc02.SimpleMovieLister">
        <property name="movieName" value="我想吃掉你的胰脏"/>
        <property name="movieFinder" ref="movieFinder"/>
    </bean>
    

    创建和使用ioc容器

创建ioc容器

先选择容器,以ClassPathXmlApplicationContext为例

创建方式一:直接创建容器并且指定配置文件即可

//方式①,直接创建容器并且指定配置文件即可
        //其构造方法内填写配置文件名,可以填多个配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-03.xml");

创建方式二:使用setConfigLocations方法,后面再调用refresh方法刷新

//方式二:使用setConfigLocations方法,后面再调用refresh方法刷新
ClassPathXmlApplicationContext applicationContext1 = new ClassPathXmlApplicationContext();
//可以有多个配置文件
applicationContext1.setConfigLocations("spring-03.xml");
applicationContext1.refresh();

ioc容器获取bean的方式

方式一:直接用容器的getBean方法根据bean的id属性来获取(返回值是Object,需要手动强转类型)

方式二:使用getBean方法,根据bean的id值,并传入类对应的class实例

方法三:直接根据类的class实例获取(要保证此类在ioc容器中只有一个bean)

例:

@Test
public void getBeanFromIoC(){
//创建容器对象
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext();
        applicationContext.setConfigLocations("spring-03.xml");
        applicationContext.refresh();
				//方式一:直接根据bean的id获取,返回值是Object类型,需要强转
				HappyComponent happyComponent = (HappyComponent) applicationContext.getBean("happyComponent");
				//方式二:根据bean的id,同时指定bean的类型获取
				HappyComponent happyComponent1 = applicationContext.getBean("happyComponent",HappyComponent.class);
				//方式三:直接根据类的class实例获取
				//要保证此类在ioc容器中只有一个bean
				HappyComponent happyComponent2 = applicationContext.getBean(HappyComponent.class);

        happyComponent2.doWork();
        System.out.println(happyComponent1 == happyComponent);
        System.out.println(happyComponent1 == happyComponent2);
}

组件周期方法

可以在组件类中定义方法,然后当IoC容器实例化和销毁组件对象的时候进行调用,这两个方法称为为生命周期方法

周期方法要求权限修饰符为public返回值类型为void,是无参数

最后用bean中的init-method属性写入初始化方法的方法名destory-method属性写入销毁方法的方法名即可

例:

public class BeanOne {

  //周期方法要求: 方法命名随意,但是要求方法必须是 public void 无形参列表
  public void init() {
    // 初始化逻辑
  }
}

public class BeanTwo {

  public void cleanup() {
    // 释放资源逻辑
  }
}
<beans>
  <bean id="beanOne" class="examples.BeanOne" init-method="init" />
  <bean id="beanTwo" class="examples.BeanTwo" destroy-method="cleanup" />
</beans>

组件作用域配置

  1. Bean作用域概念

    bean 标签声明Bean,只是将Bean的信息配置给SpringIoC容器

    在IoC容器中,这些bean标签对应的信息转成Spring内部 BeanDefinition 对象,BeanDefinition 对象内,包含定义的信息(id,class,属性等)

    这意味着,BeanDefinition概念一样,SpringIoC容器可以可以根据BeanDefinition对象反射创建多个Bean对象实例。

    具体创建多少个Bean的实例对象,由Bean的作用域scope属性指定

    1. 作用域(scope)可选值
    取值含义创建对象的时机默认值
    singleton在 IOC 容器中,这个 bean 的对象始终为单实例IOC 容器初始化时
    prototype这个 bean 在 IOC 容器中有多个实例获取 bean 时

    如果是在WebApplicationContext环境下还会有另外两个作用域(不常用):

    取值含义创建对象的时机默认值
    request请求范围内有效的实例每次请求
    session会话范围内有效的实例每次会话
    <!-- scope属性:取值singleton(默认值),bean在IOC容器中只有一个实例,IOC容器初始化时创建对象-->
    <!-- scope属性:取值prototype,bean在IOC容器中可以有多个实例,getBean()时创建对象-->
    <bean id="javaBean2" scope="prototype" class="com.ergou.ioc04.JavaBean2">
        <property name="age" value="19"/>
    </bean>
    
    <bean id="happyComponent8" scope="singleton" class="com.ergou.ioc04.JavaBean3">
        <property name="age" value="20"/>
    </bean>
    

    FactoryBean的使用

    FactoryBean 接口是Spring IoC容器实例化逻辑的可插拔性点。

    用于配置复杂的Bean对象,可以将创建过程存储在FactoryBean 的getObject方法

    FactoryBean<T> 接口提供三种方法:

    • T getObject():

      返回此工厂创建的对象的实例。该返回值会被存储到IoC容器。此方法中写目标类的实例的创建代码

    • boolean isSingleton():

      如果此 FactoryBean 返回单例,则返回 true ,否则返回 false 。此方法的默认实现返回 true (注意,lombok插件使用,可能影响效果),此方法中写return true或return false

    • Class<?> getObjectType(): 返回 getObject() 方法返回的对象类型,如果事先不知道类型,则返回 null 。此方法中写目标类的class实例

    使用步骤:

    1. 实现FactoryBean接口,指定返回值类型为泛型
    2. 实现getObject和getObjectType方法,isSingleton方法按需求选择实现
    3. 配置xml文件,bean标签只要写上id属性和class属性,class属性其中写上FactoryBean类的路径即可,id属性建议与FactoryBean返回对象的类有关联
    public class JavaBean {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    public class JavaBeanFactoryBean implements FactoryBean<JavaBean> {
    
        @Override
        public JavaBean getObject() throws Exception {
            JavaBean javaBean = new JavaBean();
            return javaBean;
        }
    
        @Override
        public Class<?> getObjectType() {
            return JavaBean.class;
        }
    }
    
    <bean id="javaBean" class="com.ergou.ioc05.JavaBeanFactoryBean"/>
    

    注:

    • FactoryBean类也会被加到ioc容器中,其id值为目标类实例的bean标签的id值前加上&,比如在以上例子中FactoryBean的组件的id值为&javaBean
    • 在javaBean标签,使用property或constructor-arg标签时,是在给JavaBeanFactoryBean的属性赋值,而不是JavaBean的属性。要使用property或constructor-arg方法给JavaBean赋值,可以在JavaBeanFactoryBean类中创建相应的属性,然后用JavaBeanFactoryBean的属性在getObject方法中给JavaBean的组件的属性赋值

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

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

相关文章

wyh的迷宫

涉及知识点&#xff1a;求迷宫能否到达终点的&#xff0c;而不是求路径数的&#xff0c;用bfs时可以不用重置状态数组&#xff08;回溯&#xff09;。 题目描述 给你一个n*m的迷宫&#xff0c;这个迷宫中有以下几个标识&#xff1a; s代表起点 t代表终点 x代表障碍物 .代…

山西电力市场日前价格预测【2024-02-08】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-08&#xff09;山西电力市场全天平均日前电价为200.58元/MWh。其中&#xff0c;最高日前电价为347.58元/MWh&#xff0c;预计出现在07:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

信息安全省赛杂项题解题思路

task1 直接查看文件属性即可得到 flag task2 载入 HxD 中&#xff0c;搜索 flag 即可得到 task3 也是同样的操作&#xff0c;载入 HxD 中搜索 flag task4 打开题目的压缩包发现被加密了&#xff0c;这个题目的标题提示的很明显&#xff0c;就是四位数加密 四位数加密的 zip…

爪哇部落算法组2024新生赛热身赛题解

第一题&#xff08;签到&#xff09;&#xff1a; 1、题意&#xff1a; 2、题解: 我们观察到happynewyear的长度是12个字符&#xff0c;我们直接从前往后遍历0到n - 12的位置&#xff08;这里索引从0开始&#xff09;&#xff0c;使用C的substr()函数找到以i开头的长度为12的字…

新增C++max函数的使用

在 C 中&#xff0c;max函数是标准库中的一个函数&#xff0c;用于返回两个或多个元素中的最大值。max函数的声明如下&#xff1a; cpp #include <algorithm>template<class T> const T& max(const T& a, const T& b);这个函数接受两个同类型的参数a…

Qt网络编程-写一个简单的网络调试助手

环境 Windows&#xff1a;Qt5.15.2&#xff08;VS2022&#xff09; Linux&#xff1a;Qt5.12.12&#xff08;gcc) 源代码 TCP服务器 头文件&#xff1a; #ifndef TCPSERVERWIDGET_H #define TCPSERVERWIDGET_H #include <QWidget> namespace Ui { class TCPServerW…

Java学习17-- super类

重点&#xff1a;super类 & 方法重写 super类 super指的是本级的上一级&#xff0c;即father class父类 很好理解&#xff0c;比如Person class>Student class 当前在Student class执行&#xff0c;那么就写this.xxx 需要在Student程序里面调用Person&#xff0c;那就…

L3HCTF 2024

Check in 输入一个1就获得flag

打印斐波那契数列

定义&#xff1a; 斐波那契数列是指这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89……这个数列从第3项开始 &#xff0c;每一项都等于前两项之和。 …

【复现】九思OA系统 SQL注入漏洞_43

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 九思软件自主研发的iThink协同OA办公自动化系统是面向中高端企业、政府机关和事业单位、等大型企业的协同办公软件&#xff0c;面…

QLabel重绘实现圆角矩形图片/文本和图片同时显示

QLabel一般用于显示一段文字&#xff0c;这段文字可以被鼠标选中/复制&#xff0c;也可是设置自动换行等&#xff0c;还可以用于显示图片。 但是使用QLabel显示图片时&#xff0c;qss样式设置的圆角radius属性是不生效的。 QLabel显示纯文本时&#xff0c;设置了背景颜色后&a…

Vue3.0(五):Vue-Router 4.x详解

Vue-Router详解 vue-router教程 认识前端路由 路由实际上是网络工程中的一个术语 在架构一个网络的时候&#xff0c;常用到两个很重要的设备—路由器和交换机路由器实际上就是分配ip地址&#xff0c;并且维护着ip地址与电脑mac地址的映射关系通过映射关系&#xff0c;路由器…

【Godot4.2】文件系统自定义控件 - GroupButtons

GroupButtons 概述 读者朋友们好&#xff0c;我是巽星石&#xff0c;这是我的Godot4.2文件系统自定义控件系列文章。 在很多程序或插件设计中&#xff0c;都会用到一堆按钮的形式&#xff0c;好处是比较直观&#xff0c;用啥点啥&#xff0c;本质上相当于一个简化的二级树形…

【Git版本控制 01】基本操作

目录 一、初始配置 二、添加文件 三、查看日志 四、修改文件 五、版本回退 六、撤销修改 七、删除文件 一、初始配置 Git版本控制器&#xff1a;记录每次的修改以及版本迭代的一个管理系统。 # 初始化本地仓库&#xff1a;git init(base) [rootlocalhost gitcode]# gi…

【通讯录案例-偏好设置 Objective-C语言】

一、刚才,我们plist存储,讲完了,这个plist,我直接,右键,打开 打开 不用xcode,我就用文本文档打开,打开方式:其他 选择:文本编辑 打开 好,这个里边儿啊,就是我们刚才存的一个Key:Value 它本质上,是一个xml 这是一种文件的格式, 等你们讲到网络的时候,实际上,…

Android 环境搭建

1、桥接工具安装 网站地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 使用安装包&#xff1a; adb 查看当前链接成功的设备&#xff1a;adb devices 使用adb shell指令来进入到手机的后台&#xff1a;

Ondo宣布将其原生稳定币USDY带入Sui生态

重要提示&#xff1a;USDY是由短期美国国债支持的token化票据&#xff0c;持有者享受稳定币的实用性同时获得收益。USDY不得在美国或向美国人出售或以其他方式提供。USDY也未根据1933年美国证券法注册。 不到一年的时间&#xff0c;Sui已经成为全链TVL排名前十的区块链&#xf…

MySQL- 运维-分库分表-Mycat

一、Mycat概述 1、安装 2、概念介绍 二、Mycat入门 启动服务 三、Mycat配置 1、schema.xml 2、rule.xml 3、server.xml 四、Mycat分片 1、垂直分库 2、水平分表 五、Mycat管理及监控 1、Mycat原理 2、Mycat管理工具 &#xff08;1&#xff09;、命令行 &#xff08;2&#…

SpringBoot + Tess4J 实现本地与远程图片的文字识别

1 前言 1.1 概要 在本文中&#xff0c;我们将探讨如何在Spring Boot应用程序里集成Tess4J来实现OCR&#xff08;光学字符识别&#xff09;&#xff0c;以识别出本地和远程图片中的文字。 我们将从添加依赖说起&#xff0c;然后创建服务类以实现OCR&#xff0c;最后展示如何处…

基于微信小程序的新生报到系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…