sprintboot容器功能

news2024/11/28 6:26:23

容器

  • 容器功能
    • Spring注入组件的注解
      • @Component,@Controller,@Service,@Repository
      • 案例演示
    • @Configuration
      • 应用实例
        • 传统方式
        • 使用@Configuration
      • 注意事项和细节
    • @Import
      • 应用实例
    • @Conditional
      • @Conditional介绍
      • 应用实例
    • @ImportResource
      • 应用实例
    • 配置绑定
      • 应用实例
      • 注意事项和细节

在这里插入图片描述

容器功能

Spring注入组件的注解

@Component,@Controller,@Service,@Repository

说明:这些在Spring中的传统注解仍然有效,通过这些注解可以给容器注入组件。

案例演示

1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\A.java

@Repository
public class A {}

2.测试MainApp.java, 其它注解不再一一测试.

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {
    public static void main(String[] args) {
        //启动springboot应用程序/项目
        ApplicationContext ioc = SpringApplication.run(MainApp.class, args);
        System.out.println("ok");

        //演示Spring中传统的注解依然可以使用 @controler @service @repository
        A aBean = ioc.getBean(A.class);
        System.out.println("aBean=" + aBean);
    }
}

@Configuration

应用实例

●@Configuration应用实例需求
说明: 演示在SpringBoot, 如何通过 @Configuration 创建配置类来注入组件.

传统方式

●回顾传统方式如何通过配置文件注入组件. 基于XML配置bean
1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Monster.java

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsContructor
public class Monster {
    private Integer id;
    private String name;
    private Integer age;
    private String skill;
}

2.创建D:\idea_project\zzw_springboot\quickstart\src\main\resources\beans.xml创建容器配置文件的方式在SpringBoot中依然好使

<!--配置了Monster bean-->
<bean class="com.zzw.springboot.bean.Monster" id="monster">
    <property name="id" value="100"/>
    <property name="name" value="孙悟空"/>
    <property name="age" value="20"/>
    <property name="skill" value="金箍棒"/>
</bean>

3.在springboot项目中,依然可以使用spring的配置bean/注入bean/获取bean方式

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {
    public static void main(String[] args) {
        //=====演示在springboot项目,依然可以使用spring的配置bean/注入bean/获取bean方式 start===

        ApplicationContext ac =
                new ClassPathXmlApplicationContext("beans.xml");
        Monster monster = ac.getBean("monster" , Monster.class);
        System.out.println("monster=" + monster);

        //=====演示在springboot项目,依然可以使用spring的配置bean/注入bean/获取bean方式 end=====

    }
}
使用@Configuration

●使用SpringBoot的@Configuration添加组件
1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\config\BeanConfig.java

配置文件和配置类都差不多, 但是在springboot中开发尽量用配置类来完成Bean的注入.

/**
 * 解读
 * 1.@Configuration 表示这是一个配置类,等价于配置文件
 * 2.程序员可以通过@Bean 注解注入bean对象到容器
 * 3.当一个类被 @Configuration 标识, 该类-Bean 也会注入到容器
 */
@Configuration
public class BeanConfig {

    /**
     * 解读
     * 1.@Bean: 给容器添加组件, 就是一个Monster bean
     * 2.monster01(): 默认 你的方法名monster01 作为bean的名字/id
     * 3.Monster: 注入类型, 注入bean的类型时Monster
     * 4.new Monster(200, "牛魔王" , 500 , "芭蕉扇"); 注入到容器中具体的bean信息
     * 5.@Bean(name = "monster_nmw"): 在配置/注入 bean 指定名字/id monster_nmw
     * 6.默认是单例注入
     * 7.通过 @Scope("prototype") 可以每次返回新的对象, 指定bean对多例
     */
    //@Bean(name = "monster_aliasName")
    @Bean
    public Monster monster01() {
        return new Monster(200, "牛魔王" , 500 , "芭蕉扇");
    }
}

2.修改MainApp.java, 从配置文件/容器获取bean, 并完成测试
hashCode含义

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {
    public static void main(String[] args) {
        //启动springboot应用程序/项目
        ApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //=====演示在springboot项目中,@Configuration的使用 start===

        Monster monster01 = ioc.getBean("monster01" , Monster.class);
        Monster monster02 = ioc.getBean("monster01" , Monster.class);
        System.out.println("monster01=" + monster01 + " " + monster01.hashCode());
        System.out.println("monster02=" + monster02 + " " + monster02.hashCode());

        //=====演示在springboot项目中,@Configuration的使用 end=====

    }
}

3.也可以通过Debug来查看 ioc 容器是否存在 monster01 的 Bean实例

ioc->beanFactory->beanDefinitionMap->monster01
在这里插入图片描述

注意事项和细节

1.配置类本身也是组件, 因此也可以获取. 修改MainApp.java
配置类是CGLIB代理对象. 动态代理jdk的Proxy和Spring的CGlib

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {
    public static void main(String[] args) {
        //启动springboot应用程序/项目
        ApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //=====演示 配置类-bean也会注入到容器 start===

        BeanConfig beanConfig = ioc.getBean("beanConfig", BeanConfig.class);
        System.out.println("beanConfig=" + beanConfig + " " + beanConfig.hashCode());

        //=====演示 配置类-bean也会注入到容器 end=====

    }
}

2.SpringBoot2新增特性: proxyBeanMethods 指定 Full模式 和 Lite模式
1)修改D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\config\BeanConfig.java

/**
 * 第二部分解读
 * 1.proxyBeanMethods: 代理bean的方法
 * 2.Full(proxyBeanMethods = true): (默认)保证每个@Bean方法被调用多少次返回的组件都是单例的, 是代理方法
 * 3.Lite(proxyBeanMethods = false): 保证每个@Bean方法被调用多少次返回的组件都是新创建的, 是非代理方法
 * 4.特别说明: proxyBeanMethods 是在 调用@Bean方法 才生效. 因此, 需要先获取BeanConfig 组件, 再调用方法
 * 而不是直接通过 SpringBoot 主程序得到的容器来获取bean, 注意观察直接通过ioc.getBean() 获取Bean, proxyBeanMethods 值并没有生效
 * 5.如何选择: 组件依赖必须使用默认 Full模式, 如果不需要组件依赖则使用 Lite模式.
 * 6.Lite模式: 也称为轻量级模式, 因为不检测依赖关系, 所以运行速度快
 */
@Configuration(proxyBeanMethods = false)
public class BeanConfig {}

2)修改MainApp.java

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {
    public static void main(String[] args) {
        //启动springboot应用程序/项目
        ApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //=====演示 @Configuration(proxyBeanMethods = xxx) start===

        //1.先得到BeanConfig组件
        BeanConfig beanConfig = ioc.getBean("beanConfig", BeanConfig.class);
        Monster monster_01 = beanConfig.monster01();
        Monster monster_02 = beanConfig.monster01();
        System.out.println("monster_01--" + monster_01 + " " + monster_01.hashCode());
        System.out.println("monster_02--" + monster_02 + " " + monster_02.hashCode());

        //特别说明: proxyBeanMethods 是在 调用@Bean方法 才生效. 因此, 需要先获取BeanConfig 组件, 再调用方法
        //1. 而不是直接通过 SpringBoot 主程序得到的容器来获取bean, 注意观察直接通过ioc.getBean() 获取Bean, proxyBeanMethods 值并没有生效
        Monster monster01 = ioc.getBean("monster01", Monster.class);
        Monster monster02 = ioc.getBean("monster01", Monster.class);
        System.out.println("monster01--" + monster01 + " " + monster01.hashCode());
        System.out.println("monster02--" + monster02 + " " + monster02.hashCode());

        //=====演示 @Configuration(proxyBeanMethods = xxx) end===

    }
}

3.配置类可以有多个, 就和Spring可以有多个ioc配置文件一个道理
1)创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\config\BeanConfig2.java

@Configuration
public class BeanConfig2 {
    @Bean
    public Monster monster02() {
        return new Monster(300, "太上老君" , 1000 , "炼丹炉");
    }
}

2)完成测试MainApp.java

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {
    public static void main(String[] args) {
        //启动springboot应用程序/项目
        ApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //=====测试可以有多个配置类 start===
        //两个配置类注入的Bean都生效
        Monster monster02 = ioc.getBean("monster02", Monster.class);
        Monster monster01 = ioc.getBean("monster01", Monster.class);
        System.out.println("monster02--" + monster02);
        System.out.println("monster01--" + monster01);

        //=====测试可以有多个配置类 end===
    }
}

@Import

应用实例

说明: 演示在SpringBoot, 如何通过 @Import 来注入组件
1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Cat.javaD:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Dog.java

public class Dog {}

public class Cat {}

2.修改BeanConfig.java, 通过@Import注入组件

/**
 * 解读
 * 1.@Import 源码 可以看到, 我们可以指定 class的数组, 可以注入指定类型的Bean
 * public @interface Import {
 *     Class<?>[] value();
 * }
 * 2.通过@Import 方式注入了组件, 默认组件 名字/id 就是对应类型的全类名
 */
@Import(value = {Dog.class, Cat.class})
@Configuration
public class BeanConfig {}

3.修改MainApp.java, 完成测试

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {
    public static void main(String[] args) {
        //启动springboot应用程序/项目
        ApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //=====测试@Import 使用 start===

        Dog dogBean = ioc.getBean(Dog.class);
        Cat catBean = ioc.getBean(Cat.class);
        System.out.println("dogBean---" + dogBean);
        System.out.println("catBean---" + catBean);

        //=====测试@Import 使用 end===
    }
}

@Conditional

@Conditional介绍

1.条件装配: 满足Conditional指定的条件, 则进行组件注入
在这里插入图片描述

2.@Conditional 是一个根注解, 下面有很多扩展注解

在这里插入图片描述

应用实例

1.要求: 演示在SpringBoot, 如何通过 @ConditionalOnBean 来注入组件
2.只有在容器中有 name=monster_nmw 组件时, 才注入 dog01.

@Import(value = {Dog.class, Cat.class})
@Configuration
public class BeanConfig {
    @Bean
    //@Bean(name = "monster_nmw")
    public Monster monster01() {
        return new Monster(200, "牛魔王", 500, "芭蕉扇");
    }

    @Bean
    public Dog dog01() {
        return new Dog();
    }
}

3.先测试下, 当前是否能注入 dog01

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {
    public static void main(String[] args) {
        //启动springboot应用程序/项目
        ApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //=====测试@ConditionalOnBean 使用 start===

        Dog dog01 = ioc.getBean("dog01", Dog.class);
        System.out.println("dog01---" + dog01);

        //=====测试@ConditionalOnBean 使用 end===
    }
}

4.修改BeanConfig.java, 加入@ConditionalBean条件约束, 并完成测试

@Import(value = {Dog.class, Cat.class})
@Configuration
public class BeanConfig {
    @Bean
    //@Bean(name = "monster_nmw")
    public Monster monster01() {
        return new Monster(200, "牛魔王", 500, "芭蕉扇");
    }

    @Bean(name = "monster_nmw")
    public Cat cat01() {
        return new Cat();
    }

    @Bean
    /**
     * 解读
     * 1.@ConditionalOnBean(name = "monster_nmw") 表示
     * 2.当容器中有一个Bean, 名字是monster_nmw(类型不做约束), 就注入dog01这个Dog bean
     * 3.如果没有 名字是 monster_nmw 的Bean, 就不注入dog01这个Dog bean.
     * 4.还有很多其它的条件约束注解, 小伙伴可以自己测试
     *
     * 5.@ConditionalOnMissingBean(name = "monster_nmw") 表示在容器中
     * , 没有 名字/id 为 monster_nmw 的Bean, 才注入dog01这个Bean
     *
     * 6.@Conditional根注解及其扩展注解, 也可以修饰类
     * @ConditionalOnBean(name = "monster_nmw")
     * public class BeanConfig {}
     * 表示对该配置类的所有要注入的组件, 都进行条件约束.
     */
    @ConditionalOnBean(name = "monster_nmw")
    //@ConditionalOnMissingBean(name = "monster_nmw")
    public Dog dog01() {
        return new Dog();
    }
}

@ImportResource

作用: 原生配置文件引入, 也就是可以直接导入Spring 传统的beans.xml, 可以认为是SpringBoot 对 Spring 容器文件的兼容.

应用实例

1.需求: 将 beans.xml 导入到 BeanConfig.java 配置类, 并测试是否可以获得 beans.xml 注入/配置 的组件
在这里插入图片描述

2.修改BeanConfig.java 或者 创建新的BeanConfig3.java(建议创建新的配置类)来测试, 使用 @ImportResource 导入beans.xml,beans02.xml(复制beans.xml的配置,改改数据)

@Configuration
//导入beans.xml, 就可以获取到beans.xml 中配置的bean
@ImportResource(locations = {"classpath:beans.xml", "classpath:beans02.xml"})
public class BeanConfig3 {
}

3.修改MainApp.java

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {
    public static void main(String[] args) {
        //启动springboot应用程序/项目
        ApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //=====演示@ImportResource 使用 start===

        Monster monster = ioc.getBean("monster", Monster.class);
        System.out.println("monster---" + monster);
        System.out.println("monster bean 是否存在-" + ioc.containsBean("monster"));
        
        Monster monster03 = ioc.getBean("monster03", Monster.class);
        System.out.println("monster03---" + monster03);
        System.out.println("monster03 bean 是否存在-" + ioc.containsBean("monster03"));

        //=====演示@ImportResource 使用 end===
    }
}

配置绑定

一句话:使用Java读取到SpringBoot 核心配置文件 application.properties 的内容,并且把它封装到JavaBean中.

应用实例

1.需求: 将application.properties指定的 k-v 和 JavaBean 绑定

2.application.properties增加配置

#1.设置Furn的属性k-v
#2.前面的furn01 是用于指定/区分不同的绑定对象, 这样可以在绑定Furn bean属性值时
#, 通过furn01 前缀进行区分
#3.furn01.id 中的id 就是你要绑定的 Furn bean的属性名
furn01.id=100
furn01.name=phone
furn01.price=6000

3.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Furn.java

@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "furn01")
public class Furn {
    private Integer id;
    private String name;
    private BigDecimal price;
}

4.修改HiController, 完成自动装配

@Controller
public class HiController {
    //装配到HiController
    @Resource
    private Furn furn;

    @RequestMapping("/furn")
    @ResponseBody
    public Furn furn() {
        return furn;
    }
}

5.启动SpringBoot 主程序, 完成测试
在这里插入图片描述

5.配置绑定还有第2种方式, 这里也演示一下, 效果一样.
注意: 注销 @Component 需要在 BeanConfig.java(说明: 也可以是其它配置类) 配置 @EnableConfigurationProperties(Furn.class), 否则会提示错误
在这里插入图片描述

/**
 * @EnableConfigurationProperties({Furn.class})解读
 * 1.开启Furn配置绑定功能
 * 2.把Furn组件自动 注册/注入 到容器中
 */
@EnableConfigurationProperties({Furn.class})
public class BeanConfig {}

注意事项和细节

1.如果 application.properties 有中文, 需要转成 unicode 编码写入, 否则会出现乱码. 在线Unicode转中文
以前学SpringMVC创建国际化文件的时候遇到过

furn01.id=100
furn01.name=\u5bb6\u5c45
furn01.price=6000

2.使用 @ConfigurationProperties(prefix=“furn01”) 会提示以下信息, 但是不会影响使用
在这里插入图片描述

3.解决 @ConfigurationProperties(prefix=“furn01”) 提示信息, 在 pom.xml 增加依赖, 即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

在这里插入图片描述

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

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

相关文章

图论(一)之概念介绍与图形#matlab

图论&#xff08;一&#xff09;之概念介绍与图形目录 前言 一、图论介绍 二、基本概念 2.1图的概念 2.2图形分类 2.3邻接矩阵 2.3.1无向图 2.3.2有向图 2.3.3有向赋权图 2.4出度&#xff08;Outdegree&#xff09; 2.5入度&#xff08;Indegree&#xff09; 3.四种…

【微信小程序开发实战项目】——如何去申请腾讯地图账号和在微信公众平台,配置request路径和添加地图插件

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Day03 链表概念与单向不循环链表的实现

目录 1、顺序表的优缺点 2、链式存储的线性表 3、单向不循环链表实现 1、顺序表的优缺点 顺序表的优点是: 由于顺序表数据元素的内存地址都是连续的,所以可以实现随机访问,而且不需要多余的信息来描述相关的数据,所以存储密度高。 顺序表的缺点是: 顺序表的数据在进行…

windows下的eclipse按Ctrl+Shift+F格式化代码不起作用的处理

1、先上张图&#xff1a; 上面Format&#xff1a;CtrlShiftF&#xff0c;按了以后不起作用。 2、这个快捷键不起作用的原因&#xff1a;可能是快捷键冲突了。 机器上装了Sougou输入法&#xff0c;将输入法切换为英文模式是起作用的。 那么应该就是这个原因了。 3、解决方法…

甄嬛传熹贵妃上户口:如果让他陪你过冬天,那朕能不能睡中间?贝叶斯模型推导爸爸去哪儿

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 背景 《甄嬛传》是大家耳熟能详的宫廷剧&#xff0c;其中复杂的宫斗情节和深刻的人物刻画让人津津乐道。甄嬛因为与皇帝(四郎)闹翻了&#xff0c;去甘露寺待了一段时间&#x…

【数据结构】遍历二叉树(递归思想)-->赋源码

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 二叉树遍历是指按照一定的顺序访问二叉树中的每个节点&#xff0c;使得每个节点恰好被访问一次。遍历是二叉树上最重要的运算之一&#xff0c;是二叉树上进行其他运算的基础。 一、二叉树遍历概念 二叉树遍历分类 …

【机器学习】LightGBM: 优化机器学习的高效梯度提升决策树

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 LightGBM: 优化机器学习的高效梯度提升决策树引言一、LightGBM概览二、核心技术…

微服务开发与实战Day08 - Elasticsearch

一、初始Elasticsearch 高性能分布式搜索引擎 1. 认识和安装 1.1 认识 Lucene是一个Java语言的搜索引擎类库&#xff0c;是Apache公司的顶级项目&#xff0c;由DougCutting于1999年研发。官网地址&#xff1a;Apache Lucene - Welcome to Apache Lucene Lucene的优势&…

誉天教育近期开班计划(6月15日更新)

云计算HCIP 周末班 2024/6/15 田老师 售前IP-L3 周末班 2024/6/15 陈老师 RHCA442 晚班 2024/6/17邹老师 数通HCIE 晚班 2024/6/24阮老师 云计算HCIE直通车晚班 2024/6/25 曾老师 售前IT-L3 周末班 2024/6/29 伍老师 数通HCIP 晚班 2024/7/1杨老师 存储直通车 晚班 2024/7/1 高…

【ARMv8/ARMv9 硬件加速系列 3 -- SVE 指令语法及编译参数详细介绍】

文章目录 SVE 汇编语法SVE 单通道谓词SVE 测试代码 SVE 软件和库支持SVE 编译参数配置-marcharmv8-alseprofilememtagsve2-aessve2-bitpermcryptosve2sve2-sha3sve2-sm4 SVE 汇编语法 在介绍 SVE 汇编指令语法之前&#xff0c;先介绍下如何判断自己所使用的芯片是否实现了SVE功…

算法01 递推算法及相关问题详解【C++实现】

目录 递推的概念 训练&#xff1a;斐波那契数列 解析 参考代码 训练&#xff1a;上台阶 参考代码 训练&#xff1a;信封 解析 参考代码 递推的概念 递推是一种处理问题的重要方法。 递推通过对问题的分析&#xff0c;找到问题相邻项之间的关系&#xff08;递推式&a…

践行国产化替代,优刻得私有云勇当先锋

编辑&#xff1a;阿冒 设计&#xff1a;沐由 阳泉&#xff0c;十万火急&#xff01; 位于太行山西麓的山西省阳泉市&#xff0c;是一座历史悠久、底蕴深厚、资源丰富的名城&#xff0c;拥有超百万常住人口&#xff0c;国内生产总值在2022年成功跨越千亿元大关。然而&#xff0c…

leetcode 56合并区间

思路 合并就是首先应该按照left左边界排序&#xff0c;排完序以后&#xff0c;如果i的左边界小于等于i-1的右边界&#xff0c;说明有重合&#xff0c;此时这两个可以合并&#xff0c;右边界应该取最大值。 代码 排序 我是定义了一个类,存储左右边界&#xff0c;先将数组转化…

传输层udp和tcp协议格式

UDP协议 UDP协议端格式 udp的前八个字节是报头&#xff0c;后面部分就是有效载荷。而目的端口号就保证了udp向应用层交付的问题。 而针对于报头和有效载荷分离是根据固定八字结的报头长度。数据的长度就是取决于报头中udp长度字段的大小来确定udp报文长度&#xff0c;因此也可…

【Matlab编程学习】 | matlab语言编程基础:常用图形绘制基础学习

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

C++面向对象程序设计 - 函数库

C语言程序中各种功能基本上都是由函数来实现的&#xff0c;在C语言的发展过程中建立了功能丰富的函数库&#xff0c;C从C语言继承了些函数功能。如果要用函数库中的函数&#xff0c;就必须在程序文件中包含文件中有关的头文件&#xff0c;在不同的头文件中&#xff0c;包含了不…

解决Unity-2020 安卓异形屏黑边

背景 Unity 2020.3.17 版本开发的游戏&#xff0c;打apk包&#xff0c;发现两个问题 如图下午所示&#xff0c;实体白色导航栏&#xff0c;阻挡了整个安卓UI界面&#xff0c;难看还影响美观。 安卓系统 12-13 版本手机&#xff0c;异形屏。一侧安全区黑边遮挡&#xff0c;占空间…

pyinstall打包exe报错

1- 报错 Please install pywin32-ctypes. 前提&#xff1a;python安装路径中已经安装了pywin32-ctypes。 运行pyinstaller报错 PyInstaller cannot check for assembly dependencies. Please install pywin32-ctypes. 解决思路&#xff1a; python安装路径下Lib\site-packa…

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种&#xff0c;以下是每种方式的详细说明及其优缺点&#xff1a; 使用Web浏览器登录 方法&#xff1a;通过配置路由器的远程管理功能&#xff0c;允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…

JavaSE 面向对象程序设计 包装类 纯理论详解以及相关综合练习

包装类 实质 基本数据类型对应的引用数据类型 把基本数据类型变成对象 创建对象后 在栈内存里开辟空间 在堆内存里开辟空间 成员变量记录数值 栈内存记录对象的地址 包装类就是创建一个对象&#xff0c;对象记录相应的数据值 用一个对象把数据包装起来 作用 Java中万…