Spring (四) 之配置及配置文件的操作

文章目录

  • 1、Spring 基于注解的配置
    • 基于注解的配置
    • 引入依赖包
    • 配置
    • 实体类
    • 数据访问层
    • 业务层
    • 业务层实现
    • 测试
  • 2、@Bean和@Component和@Configuration的区别
      • 1 @Bean:
      • 2 @Component:
      • 3 @Configuration:
      • 总结:
    • 区别
      • @Component和@Configuration区别
  • 3、Spring读取properties配置文件
    • 准备配置文件
    • 通过配置文件配置
      • 方式一:
      • 方式二:
    • 使用
    • 导入依赖包
    • 测试
      • 输出,表示连接上数据库
    • 通过注解配置
      • 在AppConfig中导入DatabaseConfig
      • 测试
      • 输出
  • 4、Spring 中的监听器事件
    • Spring 中的事件处理
      • Spring 提供了以下的标准事件:
    • 监听上下文事件
      • 下面是 **CSRefreshedEventHandler.java** 文件的内容:
      • 下面是 **CStartEventHandler.java** 文件的内容:
      • 下面是 **CStopEventHandler.java** 文件的内容:
      • 下面是 **CSClosedEventHandler.java** 文件的内容:
      • 下面是 调用的内容:
      • 输出以下消息:
  • 5、Spring整合junit
    • 整合Junit5
      • 引入包
    • 注解版
    • 配置文件xml版
  • 6、Spring SpEL表达式语言
    • 一、${}
    • 二、${}使用
    • 总结
  • 上一篇:[Spring (三) 之Aop及事务控制](https://blog.csdn.net/qq_45525848/article/details/137721166)

在这里插入图片描述

1、Spring 基于注解的配置

基于注解的配置

从 Spring 2.5 开始就可以使用注解来配置依赖注入。而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身。

在 XML 注入之前进行注解注入,因此后者的配置将通过两种方式的属性连线被前者重写。

注解连线在默认情况下在 Spring 容器中不打开。因此,在可以使用基于注解的连线之前,我们将需要在我们的 Spring 配置文件中启用它。所以如果你想在 Spring 应用程序中使用的任何注解,可以考虑到下面的配置文件。

@Configuration的约束

Configuration类必须作为类提供(即不作为从工厂方法返回的实例),以允许通过生成的子类增强运行时

配置类必须不是final。

配置类必须是非本地的(即,不能在方法中声明)。

任何嵌套的配置类都必须声明为static。

@Bean 方法不会再创建其他配置类(任何此类实例都将被视为常规Bean,其配置注释不会被检测到)。

引入依赖包

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.3.19</version>
</dependency>

配置

package com.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com")
public class AppConfig {
}

实体类

package com.entity;

import lombok.Data;

@Data
public class User {
    private Long id;

    private String userName;

    private String password;
}

数据访问层

package com.dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao {
    public void save(){
        System.out.println("save....");
    }
}

业务层

package com.service;

public interface UserService {
    void save();
}

业务层实现

package com.service.impl;

import com.dao.UserDao;
import com.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserDao userDao;

    @Override
    public void save() {
        userDao.save();
    }
}

测试

package com.main;

import com.config.AppConfig;
import com.service.UserService;
import com.service.impl.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class StartApplication {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService = context.getBean(UserServiceImpl.class);
        userService.save();
    }
}

2、@Bean和@Component和@Configuration的区别

@Bean, @Component, 和 @Configuration 是Spring Framework中用于配置Bean的三个不同注解,它们有以下区别:

1 @Bean:

  • 作用:@Bean注解用于在配置类中声明Bean对象。当你希望自己控制Bean的创建过程,并将其添加到Spring容器中时,可以使用@Bean注解。

  • 使用方式:将@Bean注解放在一个方法上,并在该方法中实例化并返回一个Bean对象。Spring会将这个Bean注册到容器中,供其他组件使用。

2 @Component:

  • 作用:@Component是通用的组件扫描注解,用于标记一个类为Spring管理的组件。通过组件扫描,Spring会自动将带有@Component注解的类注册为Bean,并将其添加到Spring容器中。

  • 使用方式:将@Component注解放在一个类上,Spring会自动扫描并将这个类实例化并注册为Bean。

3 @Configuration:

  • 作用:@Configuration注解表示一个类是配置类,用于声明Bean的创建和其他配置。配置类类似于XML配置文件,可以用来替代XML配置,用于定义Bean和其他组件。

  • 使用方式:将@Configuration注解放在一个类上,通常会结合@Bean注解一起使用,在配置类中定义Bean的创建过程。

总结:

​ ● @Bean主要用于配置类中手动定义Bean。

​ ● @Component用于自动组件扫描注册Bean。

​ ● @Configuration用于定义配置类,类似于XML配置文件,用于声明Bean和其他组件。

区别

@Bean的实例化和初始化操作由开发人员完成,bean的生命周期IOC不负责。

@Component/@Configuration实例化,初始化由容器来完成,bean的生命周期由IOC容器管理

@Component和@Configuration区别

用@Component修饰的类,在方法中相互调用的时候每次都会调用。而用@Configuration只调用一次。

// @Configuration 
@Component
public class BeanConfig {

    @Bean
    public User user1() {
        User user = new User();
        System.out.println("BeanConfig.user1:" + user);
        return user;
    }

    @Bean
    public String testUser() {
        // @Configuration 每次调用user1()返回的都是容器中的对象
        // @Component 每次调用user1()都会创建一个新的对象
        User user = user1();
        System.out.println(user); 
        return "hello";
    }
}

3、Spring读取properties配置文件

​ 一般properties文件,用于在代码块中读取,并給变量赋值。但是,Spring可以Bean XML方式定义(注册Bean)中,可以通过${属性名}使用properties文件配置的值。或者在代码中使用@Value注解读取properties的属性值。

准备配置文件

在resources文件夹下创建jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/company
jdbc.user=root
jdbc.pwd=root

所以用途有两种:

通过配置文件配置

Spinrg的Bean XML定义中,可以通过${属性名}使用properties文件配置的值

首先,必须先加载properties配置文件,方式有两种,如下

方式一:

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 
          用途1:Spring的xml配置文件中,可以通过${属性名}使用properties文件配置的值
          用途2:可以使用@Value("${属性名}")注解读取properties文件配置的值,再给字段赋值
                 方法1:注解在字段上,给字段赋值
                 方法2:注解在字段的setter方法中赋值           
    -->
    <!-- 加载配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
</beans>

方式二:

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--
          用途1:Spring的xml配置文件中,可以通过${属性名}使用properties文件配置的值
          用途2:可以使用@Value("${属性名}")注解读取properties文件配置的值,再给字段赋值
                 方法1:注解在字段上,给字段赋值
                 方法2:注解在字段的setter方法中赋值
    -->
    <!-- 加载配置文件 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="jdbc.properties" />
    </bean>
</beans>

可以清楚的看到,方式一,非常地简洁,但是如果要使用多个properties就可能实现不了,其实可以通过通配符实现,会有点麻烦。

使用

接着,就可以在Bean的定义中,使用properties中的属性值,如下

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.user}" />
    <property name="password" value="${jdbc.pwd}" />
</bean>

导入依赖包

这里只是方便测试,测试了连接数据库而已,非必须的!!

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.15</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>

测试

ApplicationContext ctx = new ClassPathXmlApplicationContext("Bean.xml");
DataSource dataSource = ctx.getBean("dataSource", DriverManagerDataSource.class);
System.out.println(dataSource);
System.out.println(dataSource.getConnection());

输出,表示连接上数据库

org.springframework.jdbc.datasource.DriverManagerDataSource@144ab983
com.mysql.cj.jdbc.ConnectionImpl@67b61834

通过注解配置

@Configuration可以配合@PropertySource导入properties配置。

之后通过@Value,配合Spring的EL表达式,和JSP中的EL表达式有点类似,后面SpringEL表达式模块会遇到详细用法。

@Configuration
@PropertySource("classpath:jdbc.properties")
public class DatabaseConfig {

    @Value("${jdbc.url}")
    String url;

    @Value("${jdbc.driver}")
    String driver;

    @Value("${jdbc.user}")
    String user;

    @Value("${jdbc.pwd}")
    String pwd;

    @Bean
    public DataSource dataSource(){

        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driver);
        dataSource.setUsername(user);
        dataSource.setPassword(pwd);

        return dataSource;
    }

}

在AppConfig中导入DatabaseConfig

@Configuration
@ComponentScan("com")
@Import({DatabaseConfig.class})
public class AppConfig {

}

测试

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
DataSource dataSource = ctx.getBean(DataSource.class);
System.out.println(dataSource.getConnection());

输出

com.mysql.cj.jdbc.ConnectionImpl@5f08fe00

4、Spring 中的监听器事件

Spring 中的事件处理

你已经看到了在所有章节中 Spring 的核心是 ApplicationContext,它负责管理 beans 的完整生命周期。当加载 beans 时,ApplicationContext 发布某些类型的事件。例如,当上下文启动时,ContextStartedEvent 发布,当上下文停止时,ContextStoppedEvent 发布。

通过 ApplicationEvent 类和 ApplicationListener 接口来提供在 ApplicationContext 中处理事件。如果一个 bean 实现 ApplicationListener,那么每次 ApplicationEvent 被发布到 ApplicationContext 上,那个 bean 会被通知。

Spring 提供了以下的标准事件:

Spring 内置事件 & 描述
ContextRefreshedEvent : ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext 接口中使用 refresh() 方法来发生。
ContextStartedEvent: 当使用 ConfigurableApplicationContext 接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。
ContextStoppedEvent: 当使用 ConfigurableApplicationContext 接口中的 stop() 方法停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。
ContextClosedEvent: 当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。
RequestHandledEvent: 这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。

​ 由于 Spring 的事件处理是单线程的,所以如果一个事件被发布,直至并且除非所有的接收者得到的该消息,该进程被阻塞并且流程将不会继续。因此,如果事件处理被使用,在设计应用程序时应注意。

监听上下文事件

为了监听上下文事件,一个 bean 应该实现只有一个方法 onApplicationEvent() 的 ApplicationListener 接口。因此,我们写一个例子来看看事件是如何传播的,以及如何可以用代码来执行基于某些事件所需的任务。

下面是 CSRefreshedEventHandler.java 文件的内容:

@Component
public class CSRefreshedEventHandler implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("ContextRefreshedEvent Received");
    }
}

下面是 CStartEventHandler.java 文件的内容:

@Component
public class CStartEventHandler implements ApplicationListener<ContextStartedEvent>{
    public void onApplicationEvent(ContextStartedEvent event) {
        System.out.println("ContextStartedEvent Received");
    }
}

下面是 CStopEventHandler.java 文件的内容:

@Component
public class CStopEventHandler implements ApplicationListener<ContextStoppedEvent>{
    public void onApplicationEvent(ContextStoppedEvent event) {
        System.out.println("ContextStoppedEvent Received");
    }
}

下面是 CSClosedEventHandler.java 文件的内容:

@Component
public class CSClosedEventHandler implements ApplicationListener<ContextClosedEvent> {
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        System.out.println("ContextClosedEvent Received");
    }
}

下面是 调用的内容:

ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
ctx.start();
ctx.stop();
ctx.close();

输出以下消息:

ContextRefreshedEvent Received
ContextStartedEvent Received
ContextStoppedEvent Received
ContextClosedEvent Received

5、Spring整合junit

整合Junit5

引入包

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.3.19</version>
</dependency>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

注解版

上面的其他代码不变,修改测试代码模块

@SpringJUnitConfig(classes = {AppConfig.class})
public class MyTestSpringJunit4 {

    @Autowired
    HelloWorld helloWorld;

    @Test
    public void testA(){
        System.out.println(helloWorld);
    }

}

配置文件xml版

@SpringJUnitConfig(locations = "classpath:Beans.xml")
public class JunitSpringXmlTest {
}

6、Spring SpEL表达式语言

一、${}

${} 用于加载外部文件指定的Key值,常用在xml和注解中,@Value(" ${key_value}")

二、${}使用

在resources文件夹下面创建创建jdbc.properties文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/company
jdbc.user=root
jdbc.pwd=root
package com.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:jdbc.properties")
public class AppConfig {
    @Value("${jdbc.url}")
    String url;

    @Value("${jdbc.user}")
    String username;

    @Value("${jdbc.pwd}")
    String password;

    @Value("${jdbc.driver}")
    String driverClassName;

    public void print(){
        System.out.println("url = " + url);
        System.out.println("username = " + username);
        System.out.println("password = " + password);
        System.out.println("driverClassName = " + driverClassName);
    }

}
package com;

import com.config.AppConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        AppConfig appConfig = ctx.getBean(AppConfig.class);
        appConfig.print();
    }
}

打印结果

url = jdbc:mysql://localhost:3306/company
username = root
password = root
driverClassName = com.mysql.cj.jdbc.Driver

总结

${}用的比较多,主要是用来获取配置文件的数据,比如获取数据库连接信息。

上一篇:Spring (三) 之Aop及事务控制

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

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

相关文章

【C++】开始使用优先队列

送给大家一句话: 这世上本来就没有童话&#xff0c;微小的获得都需要付出莫大的努力。 – 简蔓 《巧克力色微凉青春》 开始使用优先队列 1 前言2 优先队列2.1 什么是优先队列2.2 使用手册2.3 仿函数 3 优先队列的实现3.1 基本框架3.2 插入操作3.3 删除操作3.4 其他函数 4 总结T…

【ZYNQ】PS和PL数据交互丨AXI总线(主机模块RTL代码实现)

文章目录 一、PS-PL数据交互桥梁&#xff1a;AXI总线1.1 AXI总线和AXI4总线协议1.2 PS-PL数据传输的主要场景1.2.1 PL通过AXI_HP操作DDR3 Controller读写DDR31.2.2 PS作主机使用GP接口传输数据 1.3 AXI端口带宽理论1.4 AXI 总线的读写分离机制1.5 握手机制1.6 AXI_Lite总线1.7 …

【软考】设计模式之命令模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 优缺点5.1 优点5.2 缺点 6. 适用性7.java示例 1. 说明 1.命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式。2.属于行为型模式。3.请求以命令的形式被封装在对象中&#xff0c;并传递给调用对象。4.调用对…

制作直通网线和交叉网线

制作直通网线和交叉网线 1. 网络直通线2. 网络交叉线References 双绞线的连接方法有两种&#xff1a;直通连接和交叉连接 。 直通连接是将双绞线的两端分别都依次按白橙、橙、白绿、蓝、白蓝、绿、白棕、棕色的顺序 (国际 EIA/TIA 568B 标准) 压入 RJ45 水晶头内。这种方法制作…

剧本杀小程序:线上剧本杀成为行业必然趋势

剧本杀作为一个社交娱乐游戏方式&#xff0c;受到了年轻人的喜爱。剧本杀是一个新型的游戏方式&#xff0c;能够带大众带来新鲜感和刺激感&#xff0c;让玩家通过角色扮演进行游戏体验&#xff1b;并且剧本杀还具有较强的社交性&#xff0c;在当下快节奏生活下&#xff0c;以游…

【AI】在Windows10下部署本地LLM RAG服务

【背景】 上一篇介绍了如何用Ubuntu命令行部署ollama LLM+RAG服务。部署后等于拥有了基于内网的AI Saas服务,其它内网用户可以通过默认的网址访问Playground对AI进行问答。 【概念】 RAG:通过词向量技术,将文件内容向量化后,通过语言模型以自然交流的形式得到文本相关的…

MySQL表级锁——技术深度+1

引言 本文是对MySQL表级锁的学习&#xff0c;MySQL一直停留在会用的阶段&#xff0c;需要弄清楚锁和事务的原理并DEBUG查看。 PS:本文涉及到的表结构均可从https://github.com/WeiXiao-Hyy/blog中获取&#xff0c;欢迎Star&#xff01; MySQL表级锁 MySQL中表级锁主要有表锁…

【CAD建模号】学习笔记(三):图形绘制区1

图形绘制区介绍 CAD建模号的图形绘制区可以绘制我们所需要的各种3D模型&#xff0c;绘制的图形即为模型对象&#xff0c;包括线、面、体等。 1. 二维图形绘制组 二维图形是建模的基础&#xff0c;大多数复杂的模型都是基于二维图形制作出来的&#xff0c;掌握二维图形的绘制等…

png静图转换gif动图如何操作?轻松一键快速转换gif动图

想要把多张Png格式图片转换成gif格式动图时要怎么操作&#xff1f;图片常见的有静图和动图&#xff0c;而jpg、png、gif等是最常见的图片格式。想要把png格式图片转换成gif动画还不想下载任何软件的时候就可以使用gif制作工具。不需要下载软件在线就能操作。能够轻轻松松就能快…

uniapp开发之【上传图片上传文件】的功能

一、上传图片功能&#xff0b;图片回显点击图片预览&#xff1a; 是通过uview框架的u-upload进行开发的&#xff0c;先导入uview&#xff01; <template><view class""><!-- 按钮 --><view class"listBtn" click"uploadDesign()…

透过内核收包流程理解DPDK

前言 网络通信作为互联网的底座&#xff0c;其网络服务质量直接影响着用户的上网体验。如微信这类级别的应用&#xff0c;拥有上亿级别的日活&#xff0c;是典型的高并发的场景&#xff0c;简单的堆硬件无法有效的解决该类问题&#xff0c;提高单台服务器的性能成为问题的焦点…

百度文心一言与谷歌Gemini的对比

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 本文从多角度将百度文心一言与谷歌Gemini进行对比。因为不同评测基准的侧重点和难度可能有所不同&#xff0c;所以本文涉及到的评测结果仅供参考。Gemini和文心一言都是非常…

文件 IO

IO 的概念 I&#xff1a;Input 输入 O&#xff1a;Output 输出 输入和输出的规定 人为规定&#xff1a; 以CPU为视角&#xff0c;数据远离 CPU 的是输出&#xff0c;数据朝着 CPU 过来的是输入 例子&#xff1a; 1.在电脑上&#xff0c;通过网络下载文件 > 数据通过网卡…

IDM的实用功能介绍+下载地址

下载地址 &#xff1a; 下载到idm 互联网下载管理器&#xff08;IDM&#xff09;实用功能概述 1. 多线程下载 IDM使用多线程技术&#xff0c;将文件分割成多个部分同时下载&#xff0c;显著提高下载速度。 2. 计划任务 用户可以设定下载任务的开始时间&#xff0c;甚至在特…

如何解决msvcp140.dll文件丢失的问题?有效修复msvcp140.dll的方法分析

在使用Windows操作系统时&#xff0c;经常会遇到一些烦人的问题&#xff0c;其中&#xff0c;缺少dll文件是比较常见的情况之一。而其中&#xff0c;缺少msvcp140.dll文件是常见的一种情况。今天&#xff0c;我们将重点介绍如何解决msvcp140.dll文件丢失的问题&#xff0c;并向…

Docker 磁盘占用过多问题处理过程记录

一、问题描述 突然发现服务器磁盘使用超过95%了&#xff08;截图时2.1 和 2.2 已经执行过了&#xff09; 二、问题分析与解决 2.1&#xff0c;docker 无用镜像占用磁盘 # 使用 docker images 查看服务的镜像 docker images# 可以手动删除一些很大不用的 docker rmi ***## 也…

javaWeb项目-校园交友网站功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java语言 Java语…

怎么给一个字典进行按值或key来排序?

字典是具有指定数字或键的特定数据集或组。在 Python 以外的编程语言中&#xff0c;它们也被称为哈希映射或关联数组。 一般来说&#xff0c;它是键值对的形式&#xff0c;就像现实世界的字典一样。 要创建字典&#xff0c;请从左括号开始&#xff0c;添加键并键入一个冒号。…

GEE错误——Can‘t encode object: function()

错误 Image (Error) Cant encode object: function(){var d=Da.apply(0,arguments).map(function(f){return c.zp(f)}),e=a.hasOwnProperty("prototype")?c.zp(this):void 0;d=m5a(c,a,d,e);return c.qj(d)} Imagen Ms Reciente sin Pxeles 2720: Layer error: Ca…

财务管理驾驶舱就该按这个模板做!

今天我们来看一张财务管理驾驶舱&#xff0c;体验一下BI数据可视化分析报表的灵活自助分析效果&#xff01; 众所周知&#xff0c;驾驶舱报表的作用就是让企业运营管理者更清晰地了解、分析数据&#xff0c;发现数据中隐藏的问题或机会&#xff0c;从而针对性制定运营管理决策。…