Spring框架入门以及 ioc的三种注入方式

news2025/1/22 8:40:39

目录

一、Spring是什么,它能够做什么

spring的组成

二、什么是控制反转(或依赖注入)

三、 如何在spring当中定义和配置一个JavaBean

四、注入方式

1.构造函数注入

2.Setter方法注入

3.自动装配

五、简单属性配置与复杂属性配置

简单属性配置:

复杂属性配置:

六、spring上下文与tomcat整合


一、Spring是什么,它能够做什么

  Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。

   Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
   然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
   目的:解决企业应用开发的复杂性
   功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
   范围:任何Java应用,包括Web应用程序、桌面应用程序、批处理应用程序等。
   简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

spring的组成

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: 

  1. Spring Core(核心模块):

    提供了IoC容器和依赖注入功能,用于管理对象的生命周期和依赖关系。
  2. Spring Context(上下文模块):

    基于核心模块,提供了更广泛的应用程序上下文支持,包括国际化、事件传播、资源加载等。
  3. Spring AOP(面向切面编程模块):

    提供了AOP功能,用于将横切关注点与业务逻辑分离,实现日志记录、事务管理等功能。
  4. Spring JDBC(数据库访问模块):

    提供了对JDBC的封装和简化,简化了数据库访问的代码编写。
  5. Spring ORM(对象关系映射模块):

    提供了对ORM框架的集成支持,如Hibernate、MyBatis等,简化了数据库操作和对象持久化的开发。
  6. Spring Web(Web开发模块):

    提供了用于构建Web应用程序的功能,包括Spring MVC框架、RESTful Web服务、WebSocket等。
  7. Spring Security(安全性模块):

    提供了一套综合的安全性框架,用于认证、授权和保护应用程序的资源。
  8. Spring Test(测试模块):

    提供了测试支持,包括单元测试、集成测试和端到端测试,方便进行测试驱动开发和持续集成。

二、什么是控制反转(或依赖注入)

控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)是两个相关的概念,用于解耦和管理组件之间的依赖关系。

控制反转(IoC)是一种设计原则,它将组件的控制权从组件自身转移到外部容器中。传统的程序设计中,组件通常负责自己的创建和管理,而在IoC中,组件不再负责自己的创建和管理,而是由外部容器来负责。这样做的好处是,组件不再与具体的实现细节紧密耦合,而是通过接口或抽象类与外部容器进行交互,从而提高了代码的可维护性和可测试性。

依赖注入(DI)是IoC的一种具体实现方式。它通过将组件所依赖的其他组件(依赖项)注入到组件中,来解决组件之间的依赖关系。依赖注入可以通过构造函数、属性或方法参数等方式进行。通过依赖注入,组件不需要自己创建和管理它所依赖的组件,而是由外部容器负责创建和注入依赖项。这样可以使组件之间的依赖关系更加清晰和可控,提高了代码的可测试性和可扩展性。

分析实现

首先需建一个maven工程,在pom.xml中导入spring的jar包依赖

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>5.1.10.RELEASE</version>
</dependency>

给客户添加一个文件上传的接口,实现文件上传的功能

1.建立一个UserBiz接口

public interface UserBiz {
 
 public void update();
 
}

2.实现接口完成功能

public class UserBizImpl implements UserBiz {
 
    public void update() {
        System.out.println("用户功能实现类");
    }
    
}

3.客户要求更改需求

public class UserBizImpl2 implements UserBiz {
 
    public void update() {
            System.out.println("更改用户需求");
    }
 
}

4.编写Userservlet,Goodsservlet

public class UserAction {
    private UserBiz userBiz= new UserBizImpl2();
    public String Update(){
        userBiz.update();
        return "list";
    }
}
public class GoodsAction {
    private UserBiz userBiz= new UserBizImpl2();
    public String Update(){
        userBiz.update();
        return "list";
    }
}

 5.新建一个spring的xml,博主在这命名为spring_context

<?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 class="com.ctb.web.UserAction" id="userAction">
        <property name="iub" ref="iub"></property>
    </bean>
    <bean class="com.ctb.web.GoodsAction" id="goodsAction">
        <property name="iub" ref="impl1"></property>
    </bean>
    <bean class="com.ctb.biz.Impl.UserBizImpl2" id="iub"></bean>
    <bean class="com.ctb.biz.Impl.UserBizImpl1" id="impl1"></bean>
</beans>

测试类

package com.ctb.demo;

import com.ctb.web.GoodsAction;
import com.ctb.web.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 彪
 * @remark
 * @create  2023-08-16 21:30
 */
public class demo1 {

    public static void main(String[] args) {
        //加载spring核心配置文件(建模),获取spring的上下文对象,上下文对象中可以获取任何Javabean对象
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring_context.xml");

        UserAction userAction= (UserAction) context.getBean("userAction");
        userAction.upload();
        GoodsAction goodsAction= (GoodsAction) context.getBean("goodsAction");
        goodsAction.upload();
    }
}

三、 如何在spring当中定义和配置一个JavaBean

  • 在Spring中定义JavaBean可以使用XML配置文件或注解。
  • 使用XML配置文件时,可以使用<bean>元素来定义和配置JavaBean,包括类名、属性值、依赖项等。
  • 使用注解时,可以使用@Component@Service@Repository等注解来标记JavaBean,并使用@Autowired注解来实现依赖注入。

四、注入方式

1.构造函数注入

  • 构造函数注入是通过在类的构造函数中传递依赖项来实现的。
  • 在使用构造函数注入时,需要在类中定义一个或多个构造函数,接受依赖项作为参数。
  • Spring容器会根据配置文件或注解中的定义,自动解析依赖项,并在创建对象时将其传递给构造函数。
  • 构造函数注入可以保证对象的依赖项在创建时就被满足,使得对象在创建后具有完整的状态。
package com.ctb.ioc.web;
 
import com.ctb.ioc.service.UserService;
 
import java.util.List;
 
 
public class UserAction {
 
    /**
     * 手动实例化的弊端
     *  1.如果依赖的接口实现需要大批量改动及迭代时,维护的成本极高
     *  2.当接口的实现类不统一,维护成本更高
     */
 
    private UserService userService ;
 
    private  String uname;
    private  int age;
    private List<String> hobby;
 
    public UserAction() {
    }
 
    public UserAction(String uname, int age, List<String> hobby) {
        this.uname = uname;
        this.age = age;
        this.hobby = hobby;
    }
 
    public UserService getUserService() {
        return userService;
    }
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
 
    public void pop(){
        System.out.println("名字为:"+this.uname);
        System.out.println("年龄为:"+this.age);
        System.out.println("爱好为:"+this.hobby);
    }
 
    public String update(){
         userService.update();
         return "list";
     }
 
 
}

spring_context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       default-autowire="byName"
       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">
 
<!--    在spring配置文件spring-context.xml中配置,那么该类javabean就交给spring容器管理 -->
 
        <bean class="com.ctb.ioc.web.UserAction" id="userAction">
            <property name="userService" ref="userService"></property>
            <constructor-arg name="uname" value="奥特曼" ></constructor-arg>
            <constructor-arg name="age" value="66" ></constructor-arg>
            <constructor-arg name="hobby"  >
                <list>
                    <value>打飞机</value>
                    <value>打篮球</value>
                </list>
            </constructor-arg>
        </bean>
 
          <bean class="com.ctb.ioc.web.GoodsAction" id="goodsAction">
            <property name="userService" ref="userServiceImpl2"></property>
            <property name="gname" value="赵六"></property>
            <property name="age" value="18"></property>
            <property name="peoples">
                <list>
                    <value>张三</value>
                    <value>李四</value>
                    <value>王五</value>
                </list>
            </property>
        </bean>
 
        <bean class="com.ctb.ioc.service.impl.UserServiceImpl" id="userService" ></bean>
        <bean class="com.ctb.ioc.service.impl.UserServiceImpl2" id="userServiceImpl2"></bean>
</beans>

2.Setter方法注入

  • Setter方法注入是通过调用对象的Setter方法来设置依赖项的值。
  • 在使用Setter方法注入时,需要在类中定义相应的Setter方法,用于接收依赖项的值。
  • Spring容器会根据配置文件或注解中的定义,自动调用Setter方法,并将依赖项的值传递给对应的Setter方法。
  • Setter方法注入可以在对象创建后动态地设置依赖项的值,使得对象的依赖关系更加灵活和可变。
package com.ctb.ioc.web;
 
import com.ctb.ioc.service.UserService;
 
import java.util.List;
 
 
public class GoodsAction {
 
 
    /**
     * 在不同的控制器中进行方法调用
     */
    private UserService userService;
    private String gname;
    private int age;
    private List<String> peoples;
 
 
    public String getGname() {
        return gname;
    }
 
    public void setGname(String gname) {
        this.gname = gname;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public List<String> getPeoples() {
        return peoples;
    }
 
    public void setPeoples(List<String> peoples) {
        this.peoples = peoples;
    }
 
    public UserService getUserService() {
        return userService;
    }
 
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
 
 
    public void pop(){
        System.out.println("名称:"+this.gname);
        System.out.println("年龄:"+this.age);
        System.out.println("使用人:"+this.peoples);
    }
 
 
    public String update(){
        userService.update();
        return "list";
    }
}

spring_context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       default-autowire="byName"
       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 class="com.ctb.ioc.web.UserAction" id="userAction">
         <property name="userService" ref="userServiceImpl"></property>
 
        </bean>
 
        <bean class="com.ctb.ioc.web.GoodsAction" id="goodsAction">
            <property name="userService" ref="userServiceImpl2"></property>
            <property name="gname" value="赵六"></property>
            <property name="age" value="18"></property>
            <property name="peoples">
                <list>
                    <value>张三</value>
                    <value>李四</value>
                    <value>王五</value>
                </list>
            </property>
        </bean>
 
        <bean class="com.ctb.ioc.service.impl.UserServiceImpl" id="userService" ></bean>
        <bean class="com.ctb.ioc.service.impl.UserServiceImpl2" id="userServiceImpl2"></bean>
</beans>

3.自动装配

  1. 根据类型(byType)自动装配:

    • 在目标对象的构造函数、Setter方法或字段上使用@Autowired注解。
    • Spring容器会根据依赖项的类型,在容器中查找匹配的对象,并自动注入到目标对象中。
    • 如果存在多个匹配的对象,可以使用@Qualifier注解指定具体的对象。
  2. 根据名称(byName)自动装配:

    • 在目标对象的构造函数、Setter方法或字段上使用@Autowired注解,并结合@Qualifier注解。
    • @Qualifier注解中指定要注入的对象的名称。
    • Spring容器会根据依赖项的名称,在容器中查找匹配的对象,并自动注入到目标对象中。
  3. 自动装配的其他选项:

    • @Autowired注解还可以与@Primary注解一起使用,指定首选的自动装配对象。
    • 如果依赖项无法找到匹配的对象,可以使用@Autowired(required = false)注解,允许依赖项为null。

 byName

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       default-autowire="byName"
       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">
 
<!--    在spring配置文件spring-context.xml中配置,那么该类javabean就交给spring容器管理 -->
 
        <bean class="com.ctb.ioc.web.UserAction" id="userAction">
            <property name="userService" ref="userService"></property>
            <constructor-arg name="uname" value="奥特曼" ></constructor-arg>
            <constructor-arg name="age" value="66" ></constructor-arg>
            <constructor-arg name="hobby"  >
                <list>
                    <value>打飞机</value>
                    <value>打篮球</value>
                </list>
            </constructor-arg>
        </bean>
 
          <bean class="com.ctb.ioc.web.GoodsAction" id="goodsAction">
            <property name="userService" ref="userServiceImpl2"></property>
            <property name="gname" value="赵六"></property>
            <property name="age" value="18"></property>
            <property name="peoples">
                <list>
                    <value>张三</value>
                    <value>李四</value>
                    <value>王五</value>
                </list>
            </property>
        </bean>
 
        <bean class="com.ctb.ioc.service.impl.UserServiceImpl" id="userService" ></bean>
        <bean class="com.ctb.ioc.service.impl.UserServiceImpl2" id="userServiceImpl2"></bean>
</beans>

byType

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       default-autowire="byType"
       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">
 
<!--    在spring配置文件spring-context.xml中配置,那么该类javabean就交给spring容器管理 -->
 
        <bean class="com.ctb.ioc.web.UserAction" id="userAction">
            <property name="userService" ref="userService"></property>
            <constructor-arg name="uname" value="奥特曼" ></constructor-arg>
            <constructor-arg name="age" value="66" ></constructor-arg>
            <constructor-arg name="hobby"  >
                <list>
                    <value>打飞机</value>
                    <value>打篮球</value>
                </list>
            </constructor-arg>
        </bean>
 
          <bean class="com.ctb.ioc.web.GoodsAction" id="goodsAction">
            <property name="userService" ref="userServiceImpl2"></property>
            <property name="gname" value="赵六"></property>
            <property name="age" value="18"></property>
            <property name="peoples">
                <list>
                    <value>张三</value>
                    <value>李四</value>
                    <value>王五</value>
                </list>
            </property>
        </bean>
 
        <bean class="com.ctb.ioc.service.impl.UserServiceImpl" id="userService" ></bean>
        <bean class="com.ctb.ioc.service.impl.UserServiceImpl2" id="userServiceImpl2"></bean>
</beans>

五、简单属性配置与复杂属性配置

  1. 简单属性配置:

    • 简单属性配置是指设置对象的基本数据类型或字符串类型的属性值。
    • 在XML配置文件中,可以使用<property>元素来配置简单属性。
    • 例如,假设有一个名为person的JavaBean,有一个名为name的属性,可以使用以下方式进行简单属性配置:
      
          <bean id="person" class="com.example.Person">
          <property name="name" value="John Doe" />
      </bean>
      
    • 在注解配置中,可以使用@Value注解来配置简单属性。
    • 例如,使用注解配置上述的person对象的name属性:
       @Value("John Doe")
      private String name;
        @Value("John Doe")
      private String name;
      
  2. 复杂属性配置:

    • 复杂属性配置是指设置对象的引用类型或集合类型的属性值。
    • 在XML配置文件中,可以使用<property>元素的ref属性来配置引用类型的属性。
    • 例如,假设有一个名为person的JavaBean,有一个名为address的属性,可以使用以下方式进行复杂属性配置:
      
      
        <bean id="person" class="com.example.Person">
          <property name="address" ref="addressBean" />
      </bean>
      <bean id="addressBean" class="com.example.Address">
          <!-- 设置addressBean的其他属性 -->
      </bean>
      
    • 在注解配置中,可以使用@Autowired@Resource注解来配置引用类型的属性。
    • 例如,使用注解配置上述的person对象的address属性:
       @Autowired
      private Address address;
        @Autowired
      private Address address;
      
    • 对于集合类型的属性,可以使用<array>、<list><map><set>等元素进行配置,或者使用@Value注解配合#{}表达式进行配置。

数组(array)注入

<property name="books" >
            <array>
                <value>1</value>
                <value>12</value>
                <value>123</value>
                <value>122234</value>
            </array>
</property>

List注入

 <property name="hobbys">
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </list>
 </property>

Map注入

 <property name="card">
            <map>
                <entry key="JAVA" value="100"></entry>
                <entry key="Python" value="100"></entry>
            </map>
 </property>

Set注入

 <property name="games">
            <set>
                <value>1</value>
                <value>2</value>
            </set>
 </property>

六、spring上下文与tomcat整合

  • Spring上下文是Spring框架的核心部分,它负责管理和提供应用程序中的对象和依赖关系。
  • 在将Spring与Tomcat整合时,可以使用Spring的ContextLoaderListener来加载Spring上下文。
  • 需要在web.xml文件中配置ContextLoaderListener,并指定Spring配置文件的位置。
  • 这样,Tomcat启动时会加载Spring上下文,并将其与Web应用程序进行整合。

SpringLoadlistener.java

@WebListener
public class SpringLoadlistener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("初始化将Spring的上下文放入tomcat");
        //将Spring的上下文放入tomcat
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("/Spring-Context.xml");
        //获取tomcat上下文
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("springcontext",context);
    }
}

UserServlet.java

@WebServlet("/userlist")
public class UserServlet extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //处理请求的时候获取spring上下文
        ClassPathXmlApplicationContext springcontext = (ClassPathXmlApplicationContext) req.getServletContext().getAttribute("springcontext");
        UserAction useraction = (UserAction) springcontext.getBean("userAction");
        System.out.println(useraction);
        useraction.Update();
    }
}

spring ioc的讲解到这就结束啦 !!关注博主不迷路😁😁

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

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

相关文章

AIGC:【LLM(六)】——Dify:一个易用的 LLMOps 平台

文章目录 一.简介1.1 LLMOps1.2 Dify 二.核心能力三.Dify安装3.1 快速启动3.2 配置 四.Dify使用五.调用开源模型六.接通闭源模型七.在 Dify.AI 探索不同模型潜力7.1 快速切换&#xff0c;测验不同模型的表现7.2 降低模型能力对比和选择的成本 一.简介 1.1 LLMOps LLMOps&…

vue vs react

vue 简介&#xff1a;渐进式 JavaScript 框架 来源&#xff1a;最初由 Evan You &#xff08;尤雨溪&#xff09;于2014年开发。Evan You之前在Google研究过AngularJS&#xff0c;并提取了Angular的部分特性以提供一个更轻量级的框架 版本&#xff1a; vue 1x&#xff1a;2014…

Android 源码下载(详细版)

经典好文推荐,通过阅读本文,您将收获以下知识点: 一、下载AOSP前的准备 二、国内网络下 clone 清华大学开源软件镜像 三、编写Python脚本,开始下载android-10.0.0_r40 源码 四、源码下载工具包 五、参考文献 一、下载AOSP前的准备 想在国内网络下载AOSP源码,需要电脑配置如…

MySQL之索引和事务

索引什么是索引索引怎么用索引的原理 事务使用事务事务特性MySQL隔离级别 索引 什么是索引 索引包含数据表所有记录的引用指针&#xff1b;你可以对某一列或者多列创建索引和指定不同的类型&#xff08;唯一索引、主键索引、普通索引等不同类型&#xff1b;他们底层实现也是不…

Nginx 配置文件的完整指南 (一)

文章目录 一、简介1.1 配置文件一览 二、全局配置2.0 user2.1 worker_processes2.2 events模块2.3 http模块 三、server模块3.1 listen3.2 server_name3.3 location&#xff1a;请求处理位置 Nginx 配置文件的完整指南 (二) 一、简介 Nginx是一款高性能的Web服务器和反向代理服…

数字孪生三维可视化系统开发平台有哪些优点

随着企业数字化发展的深入&#xff0c;迅速增多的场景化需求要求企业具备更加灵活、敏捷、易用的应用开发能力。而高效、便捷、易用、低本的数字孪生系统制作也是大势所趋&#xff0c;数字孪生公司深圳华锐视点基于3d可视化、数字孪生和VR虚拟仿真技术搭建了3D数字孪生编辑器&a…

【Axure高保真原型】JS日期选择器筛选中继器表格

今天和大家分享JS日期选择器筛选中继器表格的原型模板&#xff0c;通过调用浏览器的日期选择器&#xff0c;所以可以获取真实的日历效果&#xff0c;具体包括哪一年二月份有29天&#xff0c;几号对应星期几&#xff0c;都是真实的&#xff0c;获取日期值后&#xff0c;通过交互…

python 使用 pdf2image 库将PDF转换为图片

在 Ubuntu 上实现网络穿透&#xff1a;手把手教你搭建FRPS服务器 初环境步骤一&#xff1a;安装pdf2image库步骤二&#xff1a;导入必要的库步骤三&#xff1a;指定PDF文件路径步骤四&#xff1a;将PDF转换为图片步骤五&#xff1a;保存图像为图片文件完整代码运行结果 在数字化…

Linux内核常用调试技巧汇总

printk printk共有8个等级&#xff0c;从0-7&#xff0c;等级依次降低。 打印等级可以通过修改/proc/sys/kernel/printk来改变。 查看printk等级&#xff1a; cat /proc/sys/kernel/printk 7 4 1 7打开内核所有打印&#xff1a; echo 8 > /proc/sys/kernel/printk 动态…

VK36W1D浴缸,洁具高灵敏度电容式单点液体水位检测触摸芯片资料介绍

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK36W1D 封装形式&#xff1a;SOT23-6L 产品年份&#xff1a;新年份 &#xff08;C21-163&#xff09; 产品特点&#xff1a;VK36W1D具有1个触摸检测通道&#xff0c;可用来检测水从无到有和水从有到无的动作。该…

神经网络论文研读-多模态方向-综述研读(上)

翻译以机翻为主 原文目录 前言 图1&#xff1a;LMU印章&#xff08;左&#xff09;风格转移到梵高的向日葵绘画&#xff08;中&#xff09;并与提示混合 - 梵高&#xff0c;向日葵 -通过CLIPVGAN&#xff08;右&#xff09;。在过去的几年中&#xff0c;自然语言处理&#xff…

【MySQL系列】表内容的基本操作(增删查改)

「前言」文章内容大致是对MySQL表内容的基本操作&#xff0c;即增删查改。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL表内容的增删查改1.1 Create1.1.1 单行数据全列插入1.1.2 多行数据指定列插入1.1.3 插入否则更新1.1.4 数据替换 1.2 Ret…

Vue 2自定义指令入门

Vue 2自定义指令入门 Vue自定义指令允许我们在DOM元素上添加自己想要的行为来扩展Vue的功能。 一个自定义指令需要一个名称和一个定义对象。在定义对象中&#xff0c;你可以使用一些钩子函数来控制指令的行为&#xff1a; bind&#xff1a;在指令被绑定到元素上时使用&#…

ShardingSphere 可观测 SQL 指标监控

ShardingSphere并不负责如何采集、存储以及展示应用性能监控的相关数据&#xff0c;而是将SQL解析与SQL执行这两块数据分片的最核心的相关信息发送至应用性能监控系统&#xff0c;并交由其处理。 换句话说&#xff0c;ShardingSphere仅负责产生具有价值的数据&#xff0c;并通过…

类加载 - 双亲委派机制详解

1、类加载器有哪些 启动类加载器&#xff08;Bootstrap Class Loader&#xff09;&#xff1a;它是Java虚拟机的一部分&#xff0c;负责加载Java核心类库&#xff0c;如java.lang包中的类。它是最顶层的类加载器&#xff0c;由C实现&#xff0c;不是Java类。 扩展类加载器&…

效率逆天GPT-4一天顶6个月,颠覆审核行业

内容审核一直被视为互联网大厂中的脏活和累活。就拿审文章来说&#xff0c;审核员们一天要审约2000篇文章&#xff0c;724h工作制&#xff0c;经常过着昼夜颠倒的日子&#xff0c;更要命的是&#xff0c;他们每天都要接收各种低俗污秽内容&#xff0c;久而久之&#xff0c;心理…

4.物联网LWIP之C/S编程

LWIP配置 服务器端实现 客户端实现 错误分析 一。LWIP配置&#xff08;FREERTOS配置&#xff0c;ETH配置&#xff0c;LWIP配置&#xff09; 1.FREERTOS配置 为什么要修改定时源为Tim1&#xff1f;不用systick&#xff1f; 原因&#xff1a;HAL库与FREERTOS都需要使用systi…

MQTT协议--技术文档--搭建mqtt服务器--《EMQX单体服务器部署》

产品概览 | EMQX 5.1 文档 什么是EMQX&#xff1f; EMQX 是一款开源 (opens new window)的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条&#xff0c;单服务器的传输与处理…

前端开发工具及环境配置

1.前端开发环境node npm环境配置 第一步&#xff1a;打开Download | Node.js (nodejs.org)下载&#xff0c;解压。 找到下载压缩包进行解压 解压到D盘目录下&#xff1a; 第二步&#xff1a;配置环境变量&#xff1a;右击此电脑点击属性进入高级系统设置 点击高级系统设置进入…

泛微E8配置自定义触发流程失败

在新公司接了个配置泛微流程触发的活。因为泛微的官方文档并没有详细的操作指引&#xff0c;在测试环境配置之后、要触发的流程可以手工提交&#xff0c;但是触发一直不成功。简单记录下业务场景和其他处理信息&#xff0c;以供参考。 应用版本 目前使用了泛微 E8 &#xff0…