java 代码scope注解_【Spring注解驱动开发】使用@Scope注解设置组件的作用域

2023-11-09

本文内容概览

@Scope注解概述

单实例bean作用域

多实例bean作用域

单实例bean作用域如何创建对象?

多实例bean作用域如何创建对象?

单实例bean注意的事项

多实例bean注意的事项

自定义Scope的实现

@Scope注解概述

@Scope注解能够设置组件的作用域,我们先来看@Scope注解类的源码,如下所示。

packageorg.springframework.context.annotation;importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;importorg.springframework.beans.factory.config.ConfigurableBeanFactory;importorg.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE, ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documentedpublic @interfaceScope {

@AliasFor("scopeName")

String value()default "";/*** Specifies the name of the scope to use for the annotated component/bean.

*

Defaults to an empty string ({@code""}) which implies

* {@linkConfigurableBeanFactory#SCOPE_SINGLETON SCOPE_SINGLETON}.

*@since4.2

*@seeConfigurableBeanFactory#SCOPE_PROTOTYPE

*@seeConfigurableBeanFactory#SCOPE_SINGLETON

*@seeorg.springframework.web.context.WebApplicationContext#SCOPE_REQUEST

*@seeorg.springframework.web.context.WebApplicationContext#SCOPE_SESSION

*@see#value*/@AliasFor("value")

String scopeName()default "";

ScopedProxyMode proxyMode()defaultScopedProxyMode.DEFAULT;

}

从源码中可以看出,在@Scope注解中可以设置如下值。

ConfigurableBeanFactory#SCOPE_PROTOTYPE

ConfigurableBeanFactory#SCOPE_SINGLETON

org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST

org.springframework.web.context.WebApplicationContext#SCOPE_SESSION

很明显,在@Scope注解中可以设置的值包括ConfigurableBeanFactory接口中的SCOPE_PROTOTYPE和SCOPE_SINGLETON,以及WebApplicationContext类中SCOPE_REQUEST和SCOPE_SESSION。这些都是什么鬼?别急,我们来一个个查看。

首先,我们进入到ConfigurableBeanFactory接口中,发现在ConfigurableBeanFactory类中存在两个常量的定义,如下所示。

public interface ConfigurableBeanFactory extendsHierarchicalBeanFactory, SingletonBeanRegistry {

String SCOPE_SINGLETON= "singleton";

String SCOPE_PROTOTYPE= "prototype";/*****************此处省略N多行代码*******************/}

没错,SCOPE_SINGLETON就是singleton,SCOPE_PROTOTYPE就是prototype。

那么,WebApplicationContext类中SCOPE_REQUEST和SCOPE_SESSION又是什么鬼呢?就是说,当我们使用了Web容器来运行Spring应用时,在@Scope注解中可以设置WebApplicationContext类中SCOPE_REQUEST和SCOPE_SESSION的值,而SCOPE_REQUEST的值就是request,SCOPE_SESSION的值就是session。

综上,在@Scope注解中的取值如下所示。

singleton:表示组件在Spring容器中是单实例的,这个是Spring的默认值,Spring在启动的时候会将组件进行实例化并加载到Spring容器中,之后,每次从Spring容器中获取组件时,直接将实例对象返回,而不必再次创建实例对象。从Spring容器中获取对象,小伙伴们可以理解为从Map对象中获取对象。

prototype:表示组件在Spring容器中是多实例的,Spring在启动的时候并不会对组件进行实例化操作,而是每次从Spring容器中获取组件对象时,都会创建一个新的实例对象并返回。

request:每次请求都会创建一个新的实例对象,request作用域用在spring容器的web环境中。

session:在同一个session范围内,创建一个新的实例对象,也是用在web环境中。

application:全局web应用级别的作用于,也是在web环境中使用的,一个web应用程序对应一个bean实例,通常情况下和singleton效果类似的,不过也有不一样的地方,singleton是每个spring容器中只有一个bean实例,一般我们的程序只有一个spring容器,但是,一个应用程序中可以创建多个spring容器,不同的容器中可以存在同名的bean,但是sope=aplication的时候,不管应用中有多少个spring容器,这个应用中同名的bean只有一个。

其中,request和session作用域是需要Web环境支持的,这两个值基本上使用不到,如果我们使用Web容器来运行Spring应用时,如果需要将组件的实例对象的作用域设置为request和session,我们通常会使用request.setAttribute("key",object)和session.setAttribute("key", object)的形式来将对象实例设置到request和session中,通常不会使用@Scope注解来进行设置。

单实例bean作用域

首先,我们在io.mykit.spring.plugins.register.config包下创建PersonConfig2配置类,在PersonConfig2配置类中实例化一个Person对象,并将其放置在Spring容器中,如下所示。

packageio.mykit.spring.plugins.register.config;importio.mykit.spring.bean.Person;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;/***@authorbinghe

*@version1.0.0

* @description 测试@Scope注解设置的作用域*/@Configurationpublic classPersonConfig2 {

@Bean("person")publicPerson person(){return new Person("binghe002", 18);

}

}

接下来,在SpringBeanTest类中创建testAnnotationConfig2()测试方法,在testAnnotationConfig2()方法中,创建ApplicationContext对象,创建完毕后,从Spring容器中按照id获取两个Person对象,并打印两个对象是否是同一个对象,代码如下所示。

@Testpublic voidtestAnnotationConfig2(){

ApplicationContext context= new AnnotationConfigApplicationContext(PersonConfig2.class);//从Spring容器中获取到的对象默认是单实例的

Object person1 = context.getBean("person");

Object person2= context.getBean("person");

System.out.println(person1==person2);

}

由于对象在Spring容器中默认是单实例的,所以,Spring容器在启动时就会将实例对象加载到Spring容器中,之后,每次从Spring容器中获取实例对象,直接将对象返回,而不必在创建新对象实例,所以,此时testAnnotationConfig2()方法会输出true。如下所示。

4d540be9f3302025b9b57cdb420f38fc.png

这也验证了我们的结论:对象在Spring容器中默认是单实例的,Spring容器在启动时就会将实例对象加载到Spring容器中,之后,每次从Spring容器中获取实例对象,直接将对象返回,而不必在创建新对象实例。

多实例bean作用域

修改Spring容器中组件的作用域,我们需要借助于@Scope注解,此时,我们将PersonConfig2类中Person对象的作用域修改成prototype,如下所示。

@Configurationpublic classPersonConfig2 {

@Scope("prototype")

@Bean("person")publicPerson person(){return new Person("binghe002", 18);

}

}

其实,使用@Scope设置作用域就等同于在XML文件中为bean设置scope作用域,如下所示。

a49a70c1a263c7f2a4a8fbe9d301c959.png

此时,我们再次运行SpringBeanTest类的testAnnotationConfig2()方法,此时,从Spring容器中获取到的person1对象和person2对象还是同一个对象吗?

a1b028f95ec9c0f18b3dc9ee381b1a21.png

通过输出结果可以看出,此时,输出的person1对象和person2对象已经不是同一个对象了。

单实例bean作用域何时创建对象?

接下来,我们验证下在单实例作用域下,Spring是在什么时候创建对象的呢?

首先,我们将PersonConfig2类中的Person对象的作用域修改成单实例,并在返回Person对象之前打印相关的信息,如下所示。

@Configurationpublic classPersonConfig2 {

@Scope

@Bean("person")publicPerson person(){

System.out.println("给容器中添加Person....");return new Person("binghe002", 18);

}

}

接下来,我们在SpringBeanTest类中创建testAnnotationConfig3()方法,在testAnnotationConfig3()方法中,我们只创建Spring容器,如下所示。

@Testpublic voidtestAnnotationConfig3(){

ApplicationContext context= new AnnotationConfigApplicationContext(PersonConfig2.class);

}

此时,我们运行SpringBeanTest类中的testAnnotationConfig3()方法,输出的结果信息如下所示。

d1398e427a2d2bf752f636069a84febc.png

从输出的结果信息可以看出,Spring容器在创建的时候,就将@Scope注解标注为singleton的组件进行了实例化,并加载到Spring容器中。

接下来,我们运行SpringBeanTest类中的testAnnotationConfig2(),结果信息如下所示。

c71f78fcf4848d5b92c6567fc164508e.png

说明,Spring容器在启动时,将单实例组件实例化之后,加载到Spring容器中,以后每次从容器中获取组件实例对象,直接返回相应的对象,而不必在创建新对象。

多实例bean作用域何时创建对象?

如果我们将对象的作用域修改成多实例,那什么时候创建对象呢?

此时,我们将PersonConfig2类的Person对象的作用域修改成多实例,如下所示。

@Configurationpublic classPersonConfig2 {

@Scope("prototype")

@Bean("person")publicPerson person(){

System.out.println("给容器中添加Person....");return new Person("binghe002", 18);

}

}

我们再次运行SpringBeanTest类中的testAnnotationConfig3()方法,输出的结果信息如下所示。

2eba512dd27703ee9ecae0b6fd2d7aa1.png

可以看到,终端并没有输出任何信息,说明在创建Spring容器时,并不会实例化和加载多实例对象,那多实例对象是什么时候实例化的呢?接下来,我们在SpringBeanTest类中的testAnnotationConfig3()方法中添加一行获取Person对象的代码,如下所示。

@Testpublic voidtestAnnotationConfig3(){

ApplicationContext context= new AnnotationConfigApplicationContext(PersonConfig2.class);

Object person1= context.getBean("person");

}

此时,我们再次运行SpringBeanTest类中的testAnnotationConfig3()方法,结果信息如下所示。

4aa94525961bcd552b1b92fbb9f1f0d8.png

从结果信息中,可以看出,当向Spring容器中获取Person实例对象时,Spring容器实例化了Person对象,并将其加载到Spring容器中。

那么,问题来了,此时Spring容器是否只实例化一个Person对象呢?我们在SpringBeanTest类中的testAnnotationConfig3()方法中再添加一行获取Person对象的代码,如下所示。

@Testpublic voidtestAnnotationConfig3(){

ApplicationContext context= new AnnotationConfigApplicationContext(PersonConfig2.class);

Object person1= context.getBean("person");

Object person2= context.getBean("person");

}

此时,我们再次运行SpringBeanTest类中的testAnnotationConfig3()方法,结果信息如下所示。

08b2a3b8fddc78781248a818e2214a19.png

从输出结果可以看出,当对象的Scope作用域为多实例时,每次向Spring容器获取对象时,都会创建一个新的对象并返回。此时,获取到的person1和person2就不是同一个对象了,我们也可以打印结果信息来进行验证,此时在SpringBeanTest类中的testAnnotationConfig3()方法中打印两个对象是否相等,如下所示。

@Testpublic voidtestAnnotationConfig3(){

ApplicationContext context= new AnnotationConfigApplicationContext(PersonConfig2.class);

Object person1= context.getBean("person");

Object person2= context.getBean("person");

System.out.println(person1==person2);

}

此时,我们再次运行SpringBeanTest类中的testAnnotationConfig3()方法,结果信息如下所示。

37ff73fb1bd44381851a94c64999f94c.png

可以看到,当对象是多实例时,每次从Spring容器中获取对象时,都会创建新的实例对象,并且每个实例对象都不相等。

单实例bean注意的事项

单例bean是整个应用共享的,所以需要考虑到线程安全问题,之前在玩springmvc的时候,springmvc中controller默认是单例的,有些开发者在controller中创建了一些变量,那么这些变量实际上就变成共享的了,controller可能会被很多线程同时访问,这些线程并发去修改controller中的共享变量,可能会出现数据错乱的问题;所以使用的时候需要特别注意。

多实例bean注意的事项

多例bean每次获取的时候都会重新创建,如果这个bean比较复杂,创建时间比较长,会影响系统的性能,这个地方需要注意。

自定义Scope

如果Spring内置的几种sope都无法满足我们的需求的时候,我们可以自定义bean的作用域。

1.如何实现自定义Scope

自定义Scope主要分为三个步骤,如下所示。

(1)实现Scope接口

我们先来看下Scope接口的定义,如下所示。

packageorg.springframework.beans.factory.config;importorg.springframework.beans.factory.ObjectFactory;importorg.springframework.lang.Nullable;public interfaceScope {/*** 返回当前作用域中name对应的bean对象

* name:需要检索的bean的名称

* objectFactory:如果name对应的bean在当前作用域中没有找到,那么可以调用这个ObjectFactory来创建这个对象

**/Object get(String name, ObjectFactory>objectFactory);/*** 将name对应的bean从当前作用域中移除

**/@Nullable

Object remove(String name);/*** 用于注册销毁回调,如果想要销毁相应的对象,则由Spring容器注册相应的销毁回调,而由自定义作用域选择是不是要销毁相应的对象*/

voidregisterDestructionCallback(String name, Runnable callback);/*** 用于解析相应的上下文数据,比如request作用域将返回request中的属性。*/@Nullable

Object resolveContextualObject(String key);/*** 作用域的会话标识,比如session作用域将是sessionId*/@Nullable

String getConversationId();

}

(2)将Scope注册到容器

需要调用org.springframework.beans.factory.config.ConfigurableBeanFactory#registerScope的方法,看一下这个方法的声明

/*** 向容器中注册自定义的Scope

*scopeName:作用域名称

* scope:作用域对象

**/

void registerScope(String scopeName, Scope scope);

(3)使用自定义的作用域

定义bean的时候,指定bean的scope属性为自定义的作用域名称。

2.自定义Scope实现案例

例如,我们来实现一个线程级别的bean作用域,同一个线程中同名的bean是同一个实例,不同的线程中的bean是不同的实例。

这里,要求bean在线程中是共享的,所以我们可以通过ThreadLocal来实现,ThreadLocal可以实现线程中数据的共享。

此时,我们在io.mykit.spring.plugins.register.scope包下新建ThreadScope类,如下所示。

packageio.mykit.spring.plugins.register.scope;importorg.springframework.beans.factory.ObjectFactory;importorg.springframework.beans.factory.config.Scope;importorg.springframework.lang.Nullable;importjava.util.HashMap;importjava.util.Map;importjava.util.Objects;/*** 自定义本地线程级别的bean作用域,不同的线程中对应的bean实例是不同的,同一个线程中同名的bean是同一个实例*/

public class ThreadScope implementsScope {public static final String THREAD_SCOPE = "thread";private ThreadLocal> beanMap = newThreadLocal() {

@OverrideprotectedObject initialValue() {return new HashMap<>();

}

};

@Overridepublic Object get(String name, ObjectFactory>objectFactory) {

Object bean=beanMap.get().get(name);if(Objects.isNull(bean)) {

bean=objectFactory.getObject();

beanMap.get().put(name, bean);

}returnbean;

}

@Nullable

@OverridepublicObject remove(String name) {return this.beanMap.get().remove(name);

}

@Overridepublic voidregisterDestructionCallback(String name, Runnable callback) {//bean作用域范围结束的时候调用的方法,用于bean清理

System.out.println(name);

}

@Nullable

@OverridepublicObject resolveContextualObject(String key) {return null;

}

@Nullable

@OverridepublicString getConversationId() {returnThread.currentThread().getName();

}

}

在ThreadScope类中,我们定义了一个常量THREAD_SCOPE,在定义bean的时候给scope使用。

接下来,我们在io.mykit.spring.plugins.register.config包下创建PersonConfig3类,并使用@Scope("thread")注解标注Person对象的作用域为Thread范围,如下所示。

packageio.mykit.spring.plugins.register.config;importio.mykit.spring.bean.Person;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Scope;/***@authorbinghe

*@version1.0.0

* @description 测试@Scope注解设置的作用域*/@Configurationpublic classPersonConfig3 {

@Scope("thread")

@Bean("person")publicPerson person(){

System.out.println("给容器中添加Person....");return new Person("binghe002", 18);

}

}

最后,我们在SpringBeanTest类中创建testAnnotationConfig4()方法,在testAnnotationConfig4()方法中创建Spring容器,并向Spring容器中注册ThreadScope对象,接下来,使用循环创建两个Thread线程,并分别在每个线程中获取两个Person对象,如下所示。

@Testpublic voidtestAnnotationConfig4(){

AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(PersonConfig3.class);//向容器中注册自定义的scope

context.getBeanFactory().registerScope(ThreadScope.THREAD_SCOPE, newThreadScope());//使用容器获取bean

for (int i = 0; i < 2; i++) {new Thread(() ->{

System.out.println(Thread.currentThread()+ "," + context.getBean("person"));

System.out.println(Thread.currentThread()+ "," + context.getBean("person"));

}).start();try{

TimeUnit.SECONDS.sleep(1);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

此时,我们运行SpringBeanTest类的testAnnotationConfig4()方法,输出的结果信息如下所示。

9a4e2885f694944945c7be2d7df2fef0.png

从输出中可以看到,bean在同样的线程中获取到的是同一个bean的实例,不同的线程中bean的实例是不同的。

注意:这里,我将Person类进行了相应的调整,去掉Lombok的注解,手动写构造函数和setter与getter方法,如下所示。

packageio.mykit.spring.bean;importjava.io.Serializable;/***@authorbinghe

*@version1.0.0

* @description 测试实体类*/

public class Person implementsSerializable {private static final long serialVersionUID = 7387479910468805194L;privateString name;privateInteger age;publicPerson() {

}publicPerson(String name, Integer age) {this.name =name;this.age =age;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicInteger getAge() {returnage;

}public voidsetAge(Integer age) {this.age =age;

}

}

原文链接:https://www.cnblogs.com/binghe001/p/13067071.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 代码scope注解_【Spring注解驱动开发】使用@Scope注解设置组件的作用域 的相关文章

  • python基础案例练习一

    员工管理系统练习 1 显示系统菜单 2 获得用户输入的菜单 3 根据用户的输入判断执行操作 存储员工信息 employee def show menu print 20 员工管理系统菜单 20 print 1 添加员工信息 print 2
  • 考试座位号 C语言

    每个 PAT 考生在参加考试时都会被分配两个座位号 一个是试机座位 一个是考试座位 正常情况下 考生在入场时先得到试机座位号码 入座进入试机状态后 系统会显示该考生的考试座位号码 考试时考生需要换到考试座位就座 但有些考生迟到了 试机已经结
  • 恶意数据包(pcap)下载网站合集

    收集一些恶意数据包下载网站 方便研究学习 https wiki wireshark org SampleCaptures https www netresec com page PcapFiles https www malware tra
  • xml中使用include引入布局

    为了复用布局 使用include方式引用 activity top bar xml 代码如下 需要注意的是 父容器LinearLayout中layout height为wrap content 而不是match parent 以免引入到其他
  • 如何动态创建二维数组[cpp]

    我们常见的用new来 动态创建一维数组 int m std cin gt gt m int 数组名 new int m 动态创建二维数组 方法一 int n 地图的长宽 cin gt gt n int map new int n 创建一个指
  • js 实现颜色值格式转换 rgb和十六进制的转换

    本文章是以prototype原型的方式 给string字符串类型添加方法 用于实现颜色值格式的转换 如果你不用原型方法 那么你只要借鉴实现方法就好了 RGB转换为16进制 String prototype colorHex function
  • Lightgbm多余信息显示

    LightGBM Warning No further splits with positive gain best gain inf 设置参数 verbosity 1 或 verbose 1
  • Python安装教程(2023年,3月)

    一 Python下载 1 进入Python官网 官网地址 https www python org 2 点击 Downloads 展开后点击 Windows 跳转到下载python版本页面 选择 Stable Releases 稳定版本 我
  • [gfirefly深入解析]--总体架构及demo讲解

    gfirefly是开源的分布式游戏服务器端框架 是firefly的gevent版本 想了解更多关于firefly可参考http www oschina net question 947559 147468 这是firefly的官网http
  • 【读书笔记】《Web全栈工程师的自我修养》

    读书笔记 Web全栈工程师的自我修养 推荐书单 1 什么是全栈工程师 黑客与画家 专业主义 2 如何成为全栈工程师 重来 更为简单有效的商业思维 精益创业 3 从学生到工程师 编程之美 微软技术面试心得 4 野生程序员的故事 打造Faceb
  • TOP命令及参数解析

    Top命令是linux 下常用的系统性能分析工具 能够实时显示系统中各个进程的资源占用状况 类似于windows的任务管理器 下面详细介绍它的使用方法 top 可以显示当前系统正在执行的进程的相关信息 包括进程ID 内存占用率 CPU占用率
  • 机器学习-分类-线性分类器

    在一个机器学习任务中 如果每一条数据的目标值是离散的 则该任务是一个分类任务 解决分类问题基本的方法有 线性分类器 决策树 朴素贝叶斯 人工神经网络 K近邻 KNN 支持向量机 SVM 组合基本分类器的集成学习算法 随机森林 Adaboos
  • java中float和double型数据在赋值时有哪些注意事项?,java语言中float和double类型的数据在编程时的注意事项...

    float和double类型的数据在编程时的需要注意的地方 package execisetest public class AccuranceTest public static void main String args float a
  • Rsync命令使用

    Rsync优点 持增量备份 第 次全量备份 第 次增量备份 边复制 边 较 边统计 传输效率很 数据集中备份 客户端可以推送数据 服务端 也可以从服务端获取数据 以客户端为参照物 保持 件属性 符号链接 硬链接 权限 时间等 安全 式传输
  • 微信企业号回调模式配置详细讲解

    对于微信企业号 我相信很多人都不陌生了 今天跟大家一起来探讨一下用java怎么去实现微信企业号回调模式配置 为什么需要开启回调模式 对于这点 我相信官方文档中说得比我更清楚 但是我还是想大家熟悉一下什么是回调模式 说白了就是当你有一个属于自
  • mysql in 查询时 入参为逗号隔开的字符如何查询,使用 find_in_set 代替 in

    SELECT FROM lao car model where find in set id 101 102 41840930066432 find in set 函数中 id 查询的字段名
  • 传统支付方式不能满足线下支付的需求

    刷脸支付趋势现在可以在便利店 餐饮店看见这样的场合 收银台不见了 换成了一块类似平板大小的显示屏 上边标注了刷脸支付 消费者在屏幕上点击开启刷脸支付 将脸部对准摄像头 摄像头采集到消费者面部信息后即可完成支付 消费金额就直接从消费者账户中扣
  • epoll实现原理

    用户态协议栈 为什么要实现epoll epoll并不是协议栈里面的 为什么要实现用户态协议栈 因为内核的epoll是对内核文件系统vfs fd进行的管理 是跟内核协议栈一起使用的 内核协议栈处理io后通过回调的方式来操作epoll中的就绪队
  • 两台计算机直连通信过程,教大家两台电脑网线直连传输的技巧

    我们总有需要把一台电脑的资料传输到另一台电脑的时候 其实我们可以让两台电脑共享局域网 通过网线直连来达到传输的目的 下面来看看小编是怎么操作的吧 1 设置电脑IP 首先打开下图界面 点击本地连接 2 接着我们点击属性选项 3 点击下图选中的

随机推荐

  • 零基础前端Vue的小白学习路——(Node.js,VSCODE,Hbuilder X)环境搭建

    俗话说 实践是检验真理的唯一标准 IT的学习更是离不开实践 要想成绩好 一个 做题笔记本 少不了 搭建环境想必是许多IT人刚入门一个新语言的第一个门槛 不正确的配置 不适配的版本往往会让你未来的道路变得不平坦 因此搭建环境时需要尤为谨慎 好
  • AVL代码 java

    任意一个节点 左右字数的高度差不能为超过1 先对x左旋转 转化为LL import java util ArrayList public class AVLTree
  • Java-静态绑定和动态绑定

    Java 静态绑定和动态绑定 绑定的概念 静态绑定 动态绑定 举例 绑定的概念 绑定指的是一个方法的调用与方法所在的类 方法主体 关联起来 对java来说 绑定分为静态绑定和动态绑定 或者叫做前期绑定和后期绑定 静态绑定 概念 在程序执行前
  • 字符编码与C++

    背景 C 的项目 字符编码是一个大坑 不同平台之间的编码往往不一样 如果不同编码格式用一套字符读取格式读取就会出现乱码 所以本文旨在对字符编码的知识做一个大概的梳理 字符编码定义 计算机是以二进制的形式来存储数据的 它只认识 0 和 1 两
  • angular2配置反向代理

    解决angualr2跨域问题 项目根目录下创建proxy conf json文件夹 api target http 106 75 29 87 8182 pathRewrite api environment gt environment t
  • 1093 - You can‘t specify target table ‘api‘ for update in FROM clause

    1093 You can t specify target table api for update in FROM clause 翻译 白话 例 修改 解决 翻译 您不能在 FROM 子句中指定目标表 Table 进行更新 白话 你不能先
  • @PreAuthorize注解详解

    PreAuthorize注解会在方法执行前进行权限验证 支持Spring EL表达式 它是基于方法注解的权限解决方案 只有当 EnableGlobalMethodSecurity prePostEnabled true 的时候 PreAut
  • OpenGL 各个shader的作用和区别

    OpenGL4 0发布了Tessellation shader Control Evaluation shader 到OpenGL4 为止 现在OpenGL已经支持了5种不同类型的shader 1 Vertex Shader 简称VS 2
  • Java必懂之单例模式

    一 背景知识 在所有的主流23中设计模式中 单例模式作为最简单也最容易理解也是使用最普遍的设计模式 他是一种对象创建模式 用于产生一个对象的具体实例 他可以确保系统中一个类只产生一个实例 单例模式的优点如下 1 对于频繁创建的对象 可以省去
  • LeetCode 之 剑指 Offer 16. 数值的整数次方(Java)

    文章目录 LeetCode 之 剑指 Offer 16 数值的整数次方 Java 一 题目 二 解题思路 1 递归 2 迭代 三 代码 1 递归 2 迭代 LeetCode 之 剑指 Offer 16 数值的整数次方 Java 一 题目 剑
  • 恶搞放屁小程序源码

    恶搞放屁小程序源码 无流量主 点击选择一款符合您品味气质的 设置播放参数 然后可以发送伪装二维码 发送给好友 http bbs lxh5068 com 12647 html
  • 关于注册keil的事儿,为啥注册成功之后keil还是提示会限制2K内存

    没别的 套用别人幽默的说法 keil为了安慰你啥都干得出来 编译没通过也不报错 注册失败了也会显示个成功 我拿着手里的注册机 听着歌试了一又一次 都气的快唱起来来了 可是一连接proteus远程调试就失败 debug也不行 马上提示限制2K
  • iphone屏幕突然变暗_iPhone 玩游戏时屏幕突然变暗,来看看是什么原因?

    有没有小伙伴的苹果手机遇到过这种情况 手机打着王者好好的屏幕突然变暗了 而且屏幕亮度调到最大也还是没有亮起来 这到底是怎么回事 后来我仔细研究了一下才知道这其中的原因 朋友们也来看看 一般手机屏幕突然变暗 有两种原因 自动亮度调节未关闭 我
  • C++中的模版

    一 函数模版 函数模板不是一个实在的函数 编译器不能为其生成可执行代码 定义函数模板后只是一个对函数功能框架的描述 当它具体执行时 将根据传递的实际参数决定其功能 函数模板类型自推 能够根据参数类型自动推演出模板类型参数 1 语法格式 te
  • Qt样式表 基础篇(2)

    这部分的内容直接来自Qt官方文档 原滋原味 不做过多介绍和翻译 因为 实在是非常完备了 Qt 帮助文档 目录 Qt Style Sheets Reference 样式表相关资料 List of Stylable Widgets 可设置样式的
  • 输出越界问题 和 long long 的两数加法问题

    做hdu http acm hdu edu cn showproblem php pid 2047 阿牛的牛肉串有感 注意方面一 测试 边界的数值 考虑会不会越界 注意方面二 在使用时注意这一点 如下文 直接相加 和赋值后相加不一样 pay
  • js前置递增和后置递增

    1 单独使用时 效果一样 与其他代码连用时 执行结果不同 2 前置 先自加 后运算 先己后人 后置 先原值运算 后自加 先人后己 3 开发时 大多使用后置递增 减 且代码独占一行 例如 num 或者num
  • Idea中启动一个工程多个实例

    我们有时候经常一个工程启动多个实例 分别占用不同的端口 转载记录如下 step 1 在IDEA上点击Application右边的下三角 弹出选项后 点击Edit Configuration step 2 打开配置后 将默认的Single i
  • ERP制造模块操作与设计--开源软件诞生30

    赤龙ERP制造模块讲解 第30篇 用日志记录 开源软件 的诞生 进入地址 点亮星星 祈盼着一个鼓励 博主开源地址 码云 https gitee com redragon redragon erp GitHub https github co
  • java 代码scope注解_【Spring注解驱动开发】使用@Scope注解设置组件的作用域

    本文内容概览 Scope注解概述 单实例bean作用域 多实例bean作用域 单实例bean作用域如何创建对象 多实例bean作用域如何创建对象 单实例bean注意的事项 多实例bean注意的事项 自定义Scope的实现 Scope注解概述