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

知识点引入

关于框架

框架( 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容器中只有一个beanHappyComponent 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> {@Overridepublic JavaBean getObject() throws Exception {JavaBean javaBean = new JavaBean();return javaBean;}@Overridepublic 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://xiahunao.cn/news/2777675.html

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

相关文章

python-pandas查漏补缺

1. create labels for Series 2. 3. 4. 用平均数等去填empty的格子 5. 6. 7.

SPSS双变量相关分析

双变量相关分析通过计算皮尔逊简单相关系数、斯皮尔曼等级相关系数、肯德尔等级相关系数及其显著性水平展开。其中皮尔逊简单相关系数是一种线性关联度量&#xff0c;适用于变量为定量连续变量且服从正态分布、相关关系为线性时的情形。如果变量不是正态分布的&#xff0c;或具…

基于springboot超市进销存系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;超市进销存系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而超…

小游戏和GUI编程(3) | 基于 SFML 的字符阵

小游戏和GUI编程(3) | 基于 SFML 的字符阵 1. 简介 使用 EasyX 图形库时&#xff0c; 官方第一个例子是字符阵。 EasyX 不开源&#xff0c; 也不能跨平台&#xff0c; API 陈旧&#xff0c; API 是 C 而不是 C。 现在使用 SFML 来实现字符阵&#xff0c; 克服 EasyX 的这些问…

Java并发基础:LinkedTransferQueue全面解析!

内容概要 LinkedTransferQueue类实现了高效的线程间数据传递&#xff0c;支持等待匹配的生产者-消费者模式&#xff0c;基于链表的无界设计使其在高并发场景下表现卓越&#xff0c;且无需担心队列溢出&#xff0c;丰富的方法和良好的可扩展性满足了各种复杂应用场景的需求。 …

2024牛客寒假算法基础集训营3部分题解

智乃与瞩目狸猫、幸运水母、月宫龙虾 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 Ubuntu是一个以桌面应用为主的Linux发行版操作系统&#xff0c;其名称来自非洲南部祖鲁语或豪萨语的"ubuntu"一词&#xff0c;意思是"人性…

无心剑汉英双语诗《龙年大吉》

七绝龙年大吉 Great Luck in the Dragon Year 龙腾五岳九州圆 年吼佳音万里传 大漠苍鹰华夏梦 吉人天相铸奇缘 Dragon flies over five peaks watching the divine land so great and round, New Year’s call sends joyous tidal waves far across the world’s bound. The…

[office] 怎么在Excel2003菜单栏自定义一个选项卡 #其他#微信#知识分享

怎么在Excel2003菜单栏自定义一个选项卡 怎么在Excel2003菜单栏自定义一个选项卡 ①启动Excel2003&#xff0c;单击菜单栏--工具--自定义。 ②在自定义界面&#xff0c;我们单击命令标签&#xff0c;在类别中选择新菜单&#xff0c;鼠标左键按住新菜单&#xff0c;拖放到菜单栏…

SpringCloud-高级篇(十九)

我们已经学过使用 SpringAMQP去收和发消息&#xff0c;但是发和收消息是只是MQ最基本的功能了&#xff0c;在收发消息的过程中&#xff0c;会有很多的问题需要去解决&#xff0c;下面需要学习rabbitMQ的高级特性去解决 死信交换机&#xff1a;这个可以帮助我们实现消息的延迟的…

Git远程仓库的使用(Gitee)及相关指令

目录 1 远程仓库的创建和配置 1.1 创建远程仓库 1.2 设置SSH公钥 2 指令 2.1 git remote add 远端名称(一般为origin) 仓库路径 2.2 git remote 2.3 git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名]] 2.3 git clone url 2.4 git fetch 2.5 git p…

HCIA--NAT实验

1. 划分网段&#xff0c;配置接口IP地址&#xff0c;内网启用OSPF协议&#xff0c;并配置一对一的NAT&#xff1a; AR1配置&#xff1a; [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 10.1.1.1 24 [Huawei-GigabitEthernet0/0/0]int g0/0/1 [Huawei-GigabitEther…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏16(附项目源码)

本节最终效果演示 【独游开发记录】一个人开发的&#xff0c;类森林&#xff0c;七日杀生存游戏 文章目录 本节最终效果演示系列目录前言泛型单例添加声音脚步声鸭子动物音效人物各种操作音效砍树音效 效果源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#x…

[经验] 喉咙沙哑的原因及应对方法是什么 #学习方法#其他#媒体

喉咙沙哑的原因及应对方法是什么 生活中&#xff0c;喉咙不舒服是很常见的情况&#xff0c;尤其是喉咙沙哑&#xff0c;让人感到特别难受&#xff0c;影响睡眠和生活质量。那么喉咙沙哑怎么办呢&#xff1f;接下来我会分享一些简单易行的方法&#xff0c;帮助你缓解这种不适感…

政安晨:示例演绎机器学习中(深度学习)神经网络的数学基础——快速理解核心概念(一){两篇文章讲清楚}

进入人工智能领域免不了与算法打交道&#xff0c;算法依托数学基础&#xff0c;很多小伙伴可能新生畏惧&#xff0c;不用怕&#xff0c;算法没那么难&#xff0c;也没那么玄乎&#xff0c;未来人工智能时代说不得人人都要了解算法、应用算法。 本文试图以一篇文章&#xff0c;…

《CSS 简易速速上手小册》第2章:CSS 布局与定位(2024 最新版)

文章目录 2.1 Flexbox&#xff1a;灵活的布局解决方案2.1.1 基础知识2.1.2 重点案例&#xff1a;创建一个响应式导航菜单2.1.3 拓展案例 1&#xff1a;卡片布局2.1.4 拓展案例 2&#xff1a;中心对齐的登录表单 2.2 Grid 布局&#xff1a;网格系统的魔力2.2.1 基础知识2.2.2 重…

数字孪生:构建未来智慧社区的关键技术

随着科技的快速发展&#xff0c;数字孪生技术作为构建未来智慧社区的关键技术&#xff0c;正逐渐受到广泛关注。数字孪生技术能够实现物理世界与数字世界的交互映射&#xff0c;为智慧社区的建设提供强有力的支持。本文将探讨数字孪生技术在构建未来智慧社区中的作用和意义&…

枚举(Java)

一、概念 枚举是一种特殊的类。 格式&#xff1a; 修饰符 enum 枚举类名{ 对象名称1&#xff0c;对象名称2&#xff0c;....; 其他成员... } 二、枚举类的特点 1.枚举类的第一行只能罗列一些名称&#xff0c;并且这些名称都是常量&#xff0c;每个常量记住一个枚举类对象…

vue3 之 Pinia数据持久化

持久化用户数据说明 1️⃣用户数据中有一个关键的数据叫做token&#xff08;用来标识当前用户是否登陆&#xff09;&#xff0c;而token持续一段时间才会过期 2️⃣Pinia的存储是基于内存&#xff0c;刷新就丢失&#xff0c;为了保持登陆状态就要做到刷新不丢失&#xff0c;需要…

【芯片设计- RTL 数字逻辑设计入门 番外篇 9 -- SOC 中PL端与PS端详细介绍】

文章目录 Programmable Logic and Processing SystemPL&#xff08;Programmable Logic&#xff09;特点PS和PL之间的协同设计和开发工具 Programmable Logic and Processing System 在系统级芯片&#xff08;SoC&#xff09;的上下文中&#xff0c;“PL” 通常指的是可编程逻…

Qt可视化大屏布局

科技大屏现在非常流行&#xff0c;这里分享一下某个项目的大屏布局&#xff08;忘了源码是哪个博主的了&#xff09; 展示 这个界面整体是垂直布局&#xff0c;分为两个部分&#xff0c;标题是一个部分&#xff0c;然后下面的整体是一个layout布局&#xff0c;为另外一部分。 l…