DAY03_Spring—自动装配注解模式优化XML文件

news2024/12/23 0:45:08

目录

  • 1 Spring注解模式
    • 1.1 自动装配
      • 1.1.1 说明
      • 1.1.2 配置规则
    • 1.2 注解模式
      • 1.2.1 关于注解的说明
      • 1.2.2 注解使用原理
      • 1.2.3 编辑配置文件
      • 1.2.4 属性注解
    • 1.3 实现MVC结构的纯注解开发
      • 1.3.1 编写java代码
      • 1.3.2 编辑xml配置文件
      • 1.3.3 编写测试类
      • 1.3.4 关于注解说明
      • 1.3.5 关于Spring工厂模式说明
    • 1.4 优化xml配置文件
      • 1.4.1配置类介绍
      • 1.4.2编辑配置类
      • 1.4.3 编辑测试代码
    • 1.5 Spring注解模式执行过程
    • 1.6 Spring中常见问题
      • 1.6.1 接口多实现类情况说明
      • 1.6.2 案例分析
    • 1.7 Spring容器管理业务数据@Bean注解
      • 1.7.1 @Bean作用
      • 1.7.2 编辑UserController
    • 1.8 Spring动态获取外部数据
      • 1.8.1 编辑properties文件
      • 1.8.2 编辑配置类

1 Spring注解模式

1.1 自动装配

1.1.1 说明

Spring基于配置文件 为了让属性(对象的引用)注入更加的简单.则推出了自动装配模式.

  • 根据名称自动装配
  • 根据类型自动装配

1.1.2 配置规则

<?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">

    <!--1.构建user对象-->
    <bean id="user" class="com.jt.pojo.User">
        <!--根据name属性查找对象的setId()方法 将value当作参数调用set方法完成赋值-->
        <property name="id" value="100"/>
        <!--<property name="name" value="&lt;范冰冰&gt;"/>-->
        <property name="name">
            <value><![CDATA[<范冰冰>]]></value>
        </property>
    </bean>

    <!--2.构建Dao对象
       根据面向接口编程
          Id:接口的名称
          class:实现类的包路径
    -->
    <bean id="userDao" class="com.jt.dao.UserDaoImpl"/>

    <!--3.构建Service
      自动装配: 程序无需手动的编辑property属性
      autowire="byName" 根据属性的名称进行注入
         1.找到对象的所有的set方法 setUserDao()
         2.setUserDao~~~~set去掉~~~UserDao~~~~首字母小写~~~userDao属性
         3.Spring会根据对象的属性查询自己维护的Map集合,根据userDao名称,查找Map
         中的Key与之对应,如果匹配成功.则能自动调用set方法实现注入(必需有set方法)
      autowire="byType"
         1.找到对象的所有的set方法 setUserDao()
         2.根据set方法找到方法中参数的类型UserDao.class
         3.Spring根据自己维护对象的Class进行匹配.如果匹配成功则实现注入(set方法)

         autowire:规则 如果配置了byName则首先按照name查找,如果查找不到则按照byType方式查找
         首选类型查找byType
      -->
    <bean id="userService" class="com.jt.service.UserServiceImpl" autowire="byName">
        <!--<property name="userDao" ref="userDao"/>-->
    </bean>

    <!--4.构建Controller-->
    <bean id="userController" class="com.jt.controller.UserController" autowire="byType">
        <!--<property name="userService" ref="userService"/>
        <property name="user" ref="user"/>-->
    </bean>
</beans>

1.2 注解模式

1.2.1 关于注解的说明

Spring为了简化xml配置方式,则研发注解模式.

Spring为了程序更加的严谨,通过不同的注解标识不同的层级 但是注解的功能一样

  • @Controller
    • 用来标识Controller层的代码 相当于将对象交给Spring管理
  • @Service
    • 用来标识Service层代码
  • @Repository
    • 用来标识持久层
  • @Component
    • 万用注解

1.2.2 注解使用原理

/**
 * <bean id="类名首字母小写~~userDaoImpl"  class="UserDaoImpl.class" />
 * 如果需要修改beanId则手动添加value属性即可
 */
@Repository(value = "userDao")
public class UserDaoImpl implements UserDao{
    @Override
    public void addUser(User user) {
        System.out.println("链接数据库执行insert into :"+user);
    }
}

1.2.3 编辑配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--1.构建user对象-->
    <bean id="user" class="com.jt.pojo.User">
        <property name="id" value="100"></property>
        <property name="name">
            <value><![CDATA[<范冰冰>]]></value>
        </property>
    </bean>

    <!--2.
       让注解生效,开启包扫描
       包路径特点: 给定包路径,则自动扫描同包及子孙包中的类
       base-package: 根据指定的包路径 查找注解
       写方式: 多个包路径 使用,号分隔
    -->
    <!--<context:component-scan base-package="com.jt.controller,com.jt.service,com.jt.dao"></context:component-scan>-->
    <context:component-scan base-package="com.jt"></context:component-scan>

    <!--业务需求1: 只想扫描@controller注解
        属性说明: use-default-filters="true"
                 默认规则 :true  表示可以扫描其他注解
                         :false  按照用户指定的注解进行加载,默认规则不生效
    -->
    <context:component-scan base-package="com.jt" use-default-filters="false">
        <!--通过包扫描 不可以加载其他的注解 只扫描Controller注解-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--业务需求2: 不想扫描@controller注解-->
    <context:component-scan base-package="com.jt">
       <!--通过包扫描 可以加载其他的注解 排除Controller注解-->
       <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
</beans>

1.2.4 属性注解

  • @Autowired: 可以根据类型/属性名称进行注入 首先按照类型进行注入如果类型注入失败,则根据属性名称注入
  • @Qualifier: 如果需要按照名称进行注入,则需要额外添加@Qualifier
  • @Resource(type = “xxx.class”,name=“属性名称”)
  • 关于注解补充:
    • 由于@Resource注解 是由java原生提供的,不是Spring官方的.所以不建议使用

上述的属性的注入在调用时 自动的封装了Set方法,所以Set方法可以省略不写

import com.jt.dao.UserDao;
import com.jt.pojo.User;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDao userDao;//基于Spring注入dao  面向接口编程

   // public void setUserDao(UserDao userDao) {
   //     this.userDao = userDao;
   //}

    @Override
    public void addUser(User user) {
        String name = user.getName() + "加工数据";
        user.setName(name);
        userDao.addUser(user);
    }
}

1.3 实现MVC结构的纯注解开发

1.3.1 编写java代码

public class User {
    //自动装配不能注入简单属性
    private Integer id;
    private String username;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                '}';
    }
}
import com.jt.pojo.User;

public interface UserDao {
    void addUser(User user);
}
import com.jt.pojo.User;
import org.springframework.stereotype.Repository;

@Repository
public class UserDaoImpl implements UserDao {
    @Override
    public void addUser(User user) {
        System.out.println("新增用户的数据" + user);
    }
}
import com.jt.pojo.User;

public interface UserService {
    void addUser(User user);
}
import com.jt.dao.UserDao;
import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    @Autowired //根据类型进行注入 如需要根据属性名称注入需要添加@Qualifier注解————必须按照名称进行匹配
    private UserDao userDao;
    @Override
    public void addUser(User user) {
        userDao.addUser(user);
    }
}
import com.jt.pojo.User;
import com.jt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    public void addUser() {
        User user = new User();
        user.setId(101);
        user.setUsername("王昭君|不知火舞");
        userService.addUser(user);
    }
}

1.3.2 编辑xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

   <!--开启包扫描-->
   <context:component-scan base-package="com.jt"/>
</beans>

1.3.3 编写测试类

@Test
    public void test01(){
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserController userController = context.getBean(UserController.class);
        userController.addUser();
    }
  • 测试结果

在这里插入图片描述

1.3.4 关于注解说明

  • 注解作用
    • 一些复杂的程序 以一种低耦合度的形式进行调用
  • 元注解:
    • @Target({ElementType.TYPE}) 标识注解对谁有效 type:类 method:方法有效
    • @Retention(RetentionPolicy.RUNTIME) 运行期有效(大)
    • @Documented 该注解注释编译到API文档中.
  • 由谁加载
    • 由Spring内部的源码负责调用.
      在这里插入图片描述

1.3.5 关于Spring工厂模式说明

  • Spring源码中创建对象都是采用工厂模式
    • 接口:BeanFactory(顶级接口)
  • Spring开发中需要手动的创建对象时
    • 一般采用 FactoryBean(业务接口)
  • 关于bean对象注入问题说明 一般需要检查注解是否正确配置
警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.jt.service.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.jt.service.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

1.4 优化xml配置文件

1.4.1配置类介绍

随着软件技术发展,xml配置文件显得臃肿 不便于操作,所以Spring后期提出了配置类的思想

将所有的配置文件中的内容,写到java类中.

1.4.2编辑配置类

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

@Configuration //标识我是一个配置类 相当于application.xml
@ComponentScan("com.jt") //如果注解中只有value属性 则可以省略
public class SpringConfig {
    
}

1.4.3 编辑测试代码

@Test
    public void testAnno(){
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserController userController = context.getBean(UserController.class);
        userController.addUser();
    }
  • 测试结果

在这里插入图片描述

1.5 Spring注解模式执行过程

  1. 当程序启动Spring容器时 AnnotationConfigApplicationContext 利用beanFactory实例化对象
  2. 根据配置类中的包扫描开始加载指定的注解(4个). 根据配置文件的顺序依次进行加载
    在这里插入图片描述
  3. 当程序实例化Controller时,由于缺少Service对象,所以挂起线程 继续执行后续逻辑.
    当构建Service时,由于缺少Dao对象,所以挂起线程 继续执行后续逻辑.
    当实例化Dao成功时,保存到Spring所维护的Map集合中. 执行之前挂起的线程.
    所以以此类推 所有对象实现封装.最终容器启动成功
    在这里插入图片描述
  4. 根据指定的注解/注入指定的对象.之后统一交给Spring容器进行管理.最终程序启动成功.

1.6 Spring中常见问题

1.6.1 接口多实现类情况说明

Spring中规定 一个接口最好只有一个实现类.

  • 业务需求:
    • 要求给UserService接口提供2个实现类.

1.6.2 案例分析

  1. 编辑实现类A
    在这里插入图片描述
  2. 编辑实现类B
    在这里插入图片描述
  3. 实现类型的注入
import com.jt.pojo.User;
import com.jt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    /**
     * @Autowired: 首先根据属性的类型进行注入,
     * 如果类型不能匹配,则根据属性的名称进行注入.
     * 如果添加了@Qualifier("userServiceA") 则根据属性名称注入
     * 如果名称注入失败,则报错返回.
     */
    @Autowired
    @Qualifier("userServiceB")
    private UserService userService;

    public void addUser() {
        User user = new User();
        user.setId(101);
        user.setUsername("王昭君|不知火舞");
        userService.addUser(user);
    }
}

1.7 Spring容器管理业务数据@Bean注解

1.7.1 @Bean作用

通过该注解,可以将业务数据实例化之后,交给Spring容器管理. 但是@Bean注解应该写到配置类中.

import com.jt.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration //标识我是一个配置类 相当于application.xml
@ComponentScan("com.jt") //如果注解中只有value属性 则可以省略
public class SpringConfig {
    /*
       1.Spring配置文件写法 <bean id="方法名称"  class="返回值的类型" />
       2.执行@Bean的方法 将方法名称当做ID,返回值的对象当做value 直接保存到Map集合中
    */
    @Bean
    public User user(){
        User user = new User();
        user.setId(101);
        user.setUsername("Spring容器");
        return user;
    }
}

1.7.2 编辑UserController

import com.jt.pojo.User;
import com.jt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    /**
     * @Autowired: 首先根据属性的类型进行注入,
     * 如果类型不能匹配,则根据属性的名称进行注入.
     * 如果添加了@Qualifier("userServiceA") 则根据属性名称注入
     * 如果名称注入失败,则报错返回.
     */
    @Autowired
    @Qualifier("userServiceA")
    private UserService userService;
    @Autowired
    private User user;  //从容器中动态获取

    public void addUser() {
        userService.addUser(user);
    }
}
  • 测试结果

在这里插入图片描述

1.8 Spring动态获取外部数据

1.8.1 编辑properties文件

在这里插入图片描述

# 规则: properties文件
# 数据结构类型:  k-v结构
# 存储数据类型:  只能保存String类型
# 加载时编码格式: 默认采用ISO-8859-1格式解析 中文必然乱码
user.id=1001
# Spring容器获取的当前计算机的名称 所以user.name慎用
# user.name=你好啊哈哈哈
user.username=鲁班七号

1.8.2 编辑配置类

  • @PropertySource
    • 用法:
      • @PropertySource(“classpath:/user.properties”)
    • 说明:
      • @PropertySource 作用: 加载指定的pro配置文件 将数据保存到Spring容器中
  • @Value
    • java @Value(123) 将123值赋值给Id @Value("${user.id}") 在Spring容器中查找key=user.id的数据.通过${}语法获取
import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration //标识我是一个配置类 相当于application.xml
@ComponentScan("com.jt") //如果注解中只有value属性 则可以省略
//@PropertySource 作用: 加载指定的pro配置文件 将数据保存到Spring容器中
//encoding:指定字符集编码格式
@PropertySource(value = "classpath:/user.properties",encoding = "UTF-8")
public class SpringConfig {
    //定义对象属性 准备接收数据
    //@Value(123)   将123值赋值给Id
    //@Value("${user.id}")  在Spring容器中查找key=user.id的数据.通过${} 进行触发    @Value("${user.id}")
    @Value("${user.id}")
    private Integer id;
    @Value("${user.username}")
    private String username;
    /*
       1.Spring配置文件写法 <bean id="方法名称"  class="返回值的类型" />
       2.执行@Bean的方法 将方法名称当做ID,返回值的对象当做value 直接保存到Map集合中
    */
    @Bean
    public User user(){
        User user = new User();
        user.setId(id);
        user.setUsername(username);
        return user;
    }
}
  • 测试结果

在这里插入图片描述

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

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

相关文章

python对自动驾驶进行模拟

使用了 Pygame 库来创建一个简单的游戏环境,模拟了一辆自动驾驶汽车在道路上行驶。汽车的位置和速度通过键盘控制&#xff0c;可以左右移动和加速减速。道路的宽度和颜色可以根据需要进行调整。 import pygame import random # 游戏窗口大小 WINDOW_WIDTH 800 WINDOW_HEIG…

3dmax中怎么在模型上开洞?

3dmaxS是Autodesk公司开发的基于PC系统的三维动画渲染和制作软件。我们可以使用它来做各种模型。那么怎么在模型上开洞呢&#xff1f;我们一起来看看吧&#xff01; 1、首先我们打开我们的3damx&#xff0c;这里面我使用的版本为3damxs2012,虽然版本可能各不相同。但是功能并没…

原生SSM整合(Spring+SpringMVC+MyBatis)案例

SSM框架是Spring、Spring MVC和MyBatis三个开源框架的整合&#xff0c;常用于构建数据源较简单的web项目。该框架是Java EE企业级开发的主流技术&#xff0c;也是每一个java开发者必备的技能。下面通过查询书籍列表的案例演示SSM整合的过程. 新建项目 创建文件目录 完整文件结…

拼多多无货源中转仓项目真的靠谱吗?发展前景如何?

阿阳最近一直在关注无货源电商这一块&#xff0c;尤其是拼多多无货源中转仓&#xff0c; 现如今也有了自己的运营团队和交付团队&#xff0c;整体来看这个项目还算不错&#xff01; 说实话&#xff0c;在考察这个项目的时候&#xff0c;看到市面上很多人在做&#xff0c;包括我…

JavaScript 类型判断及类型转换规则

文章目录 JavaScript 类型及其判断使用 typeof 判断类型使用 instanceof 判断类型使用 constructor 和 Object.prototype.toString 判断类型JavaScript 类型及其转换JavaScript 函数参数传递cannot read property of undefined 问题解决方案分析一道网红题目JavaScript 类型判断…

【GAMES101】Lecture 08 着色-Blinn-Phong反射模型

目录 Blinn-Phong反射模型-高光 Blinn-Phong反射模型-环境光照 Blinn-Phong反射模型 Blinn-Phong反射模型-高光 我们在lecture7的时候讲了这个Blinn-Phong反射模型的漫反射部分&#xff0c;现在我们继续讲Blinn-Phong反射模型的高光部分 这个高光是怎么产生的呢&#xff0…

} expected.Vetur(1005)

typescript TS 错误码大全&#xff01;收藏了 - 环信 } expected.Vetur(1005) 没有补齐} 虽然他给的是最后代码出错了&#xff0c;但可以看看之前的代码有没有红色的{&#xff0c;补齐即可以

Air780E开发板开发环境搭建

开发板原理图 开发软件 下载网站 https://luatos.com/luatools/download/last 使用教程 烧录教程 - LuatOS 文档 开发流程 首先下载最新版本的Luatools 然后新建一个Luatools文件夹&#xff0c;将下载的exe文件放入其中后&#xff0c;再打开exe文件&#xff08;会生成目…

MB51选择屏幕与报表增强

1、文档说明 如之前文档《MIGO新增页签增强》&#xff0c;在MIGO中增强自定义字段&#xff0c;那么在查询MB51时&#xff0c;想通过自定义字段进行筛选&#xff0c;并将数据展示到报表中&#xff0c;就需要对MB51进行增强。 此处需要说明&#xff0c;文档 《MIGO新增页签增强…

Leetcode刷题笔记题解(C++):200. 岛屿数量

思路&#xff1a;利用深度优先搜索的思路来查找1身边的1&#xff0c;并且遍历之后进行0替换防止重复dfs&#xff0c;代码如下所示 class Solution { public:int numIslands(vector<vector<char>>& grid) {int row grid.size();int col grid[0].size();int n…

【从0上手cornerstone3D】如何加载nifti格式的文件

在线演示 支持加载的文件格式 .nii .nii.gz 代码实现 npm install cornerstonejs/nifti-volume-loader// ------------- 核心代码 Start------------------- // 注册一个nifti格式的加载器 volumeLoader.registerVolumeLoader("nifti",cornerstoneNiftiImageVolu…

Ubuntu 安装Python3.8

安装Python3.8 一、安装环境 Ubuntu2004Python2.7 目标是将python版本从 2.7 更新到3.8 二、安装步骤 2.1 下载python3.8安装包 wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz2.2 安装 依次执行如下步骤&#xff1a; tar Jxf Python-3.8.0.tar.xz…

红队打靶练习:NULLBYTE: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 1、dirsearch 2、gobuster WEB web信息收集 图片信息收集 hydra爆破 sql注入 闭合 爆库 爆表 爆列 爆字段 hashcat SSH登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan…

梳理从MVP变换到光栅化的过程

1.梳理从MVP变换到光栅化的过程 相关博客&#xff1a; 1.MVP变换 2.Rasterization&#xff08;光栅化&#xff09; 1.1 View/Camera transformation 此例中相机初始位置为&#xff08;0,0,5&#xff09;【备注&#xff1a;详见主函数中输入的值】经过 M view M_{\text{view}}…

shell编程-uname命令详解(超详细)

文章目录 前言一、介绍二、语法格式三、常见选项四、示例用法1. 输出所有信息2. 查看内核名称3. 查看主机名4. 查看内核发行号5. 查看内核版本6. 查看硬件架构名称7. 查看处理器类型8. 查看硬件平台9. 查看操作系统名称10. 查看版本信息 总结 前言 在本文中&#xff0c;我们将…

智能小程序开发项目步骤流程

快速开始 在开发小程序之前&#xff0c;请确保电脑上已经安装node运行环境。可前往Node.js官网(opens in a new tab)下载安装。智能小程序环境搭建和面板小程序一致&#xff0c;请参考面板小程序搭建环境指南。 开发小程序的流程&#xff1a; 使用涂鸦开发者 IoT 账号登录 T…

鸿蒙千帆起~ 是转? 还是留?

近期鸿蒙系统相关行业热度一度高涨&#xff0c;像今天2024年1月18日 鸿蒙OS Next开发者预览版正式发布引起了不少业内人士关注&#xff0c;再度冲上了热榜。余承东老余之前就说过2024年是鸿蒙关键的一年&#xff0c;从这句话就可以看出后一定有大的动作。 就像去年有业内人士网…

Unreal Engine(UE5)中构建离线地图服务

1. 首先需要用到3个软件&#xff0c;Unreal Engine&#xff0c;gis office 和 bigemap离线服务器 Unreal Engine下载地址:点击前往下载页面 Gis office下载地址:点击前往下载页面 Bigemap离线服务器 下载地址: 点击前往下载页面 Unreal Engine用于数字孪生项目开发&#x…

【python】—— 集合

目录 &#xff08;一&#xff09;集合的概念 &#xff08;二&#xff09;集合的使用 2.1 集合的创建 2.2 集合元素的唯一性 2.3 集合的操作 2.3.1 并集 2.3.2 交集 2.3.3 差集 2.3.4 补集 2.4 遍历集合 2.5 其他集合操作 2.5.1 添加元素 2.5.2 移除元素 2.5.3 清…

15分钟学会Pinia

Pinia 核心 Pinia 介绍 官方文档&#xff1a;pinia.web3doc.top/ What is Pinia ? Pinia 是一个状态管理工具&#xff0c;它和 Vuex 一样为 Vue 应用程序提供共享状态管理能力。语法和 Vue3 一样&#xff0c;它实现状态管理有两种语法&#xff1a;选项式API 与 组合式API&a…