当前位置: 首页 > news >正文

依赖注入~

依赖注入之setter注入:

依赖注入是IOC具体的一种实现方式, 这是针对资源获取的方式角度来说的,之前我们是被动接受,现在IOC具体的实现叫做依赖注入,从代码的角度来说,原来创建对象的时候需要new,而现在并不需要这样做,只需要将所依赖的对象给它设置相对应的方法,set方法也行,有参构造也行,以我们设置好的方法来接受spring为我们所注入的对象

比如,我们此时创建一个实体类,其中包含id,age,name等属性,那我们就说student对象是依赖于id/name/age这些属性的,既然student依赖于这些属性,那么我们就可以在IOC容器中为其进行赋值,依赖注入通俗点说就是为类中的属性赋值的过程

student类:

package xysfxy;public class student implements person {private  Integer sid;private  String sname;private  Integer age;private  String gender;public student() {}public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getSname() {return sname;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public void setSname(String sname) {this.sname = sname;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "studnet{" +"sid=" + sid +", sname=" + sname +", age=" + age +", gender='" + gender + '\'' +'}';}public student(Integer sid, String name, Integer age, String  gender ) {this.age=age;this.sname=sname;this.gender=gender;this.sid = sid;}
}

如下所示,当我们为student类中的name属性赋值,注意:name在这里是属性,那么什么叫属性呢?找到当前类中set和get方法,把方法中的set和get去掉,剩余部分的首字母变成小写的结果就是属性,由于我们当前是给属性赋值,因此需要寻找set方法

在这里插入图片描述
在spring.xml文件中为属性赋值:

<!-- property:通过成员变量的set方法进行赋值,name:设置需要赋值的属性名(和set方法有关),value:设置为属性所赋的值-->
<bean id="student1" class="xysfxy.student"  ><property name="sid" value="1001"></property><property name="sname" value="张三"></property><property name="age" value="20"></property><property name="gender" value=""></property>
</bean>

创建测试类:

import org.junit.Test;
import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;
import xysfxy.student;public class student_text {@Testpublic void test(){ApplicationContext ioc=new ClassPathXmlApplicationContext("applicantsContext.xml");student student= ioc.getBean(student.class);System.out.println(student);}
}

输出如下所示:

studnet{sid=1001, sname=张三, age=20, gender='男'}

此时输出的结果正是我们上述所赋的值

依赖注入之构造器注入:

在spring.xml文件中赋值:

<!-- 赋值时,一定要与构造器中的属性相对应-->
<bean id="student1" class="xysfxy.student"  ><constructor-arg  value="1002"></constructor-arg><constructor-arg  value="李四"></constructor-arg><constructor-arg  value="19"></constructor-arg><constructor-arg  value=""></constructor-arg>
</bean>

其他不变,运行结果如下所示:

studnet{sid=1002, sname=李四, age=19, gender='男'}

在上述student类中,添加score属性,并创建新的有参构造:

//新的有参构造中使用score属性代替age属性
public student(Integer sid, String name, String  gender , double score) {this.sid = sid;this.sname=name;this.gender=gender;this.score=score;}//原有参构造public student(Integer sid, String name, String  gender, Integer age ) {this.sid = sid;this.sname=name;this.gender=gender;this.age=age;
}//重写tostring方法@Override
public String toString() {return "student{" +"sid=" + sid +", sname='" + sname + '\'' +", age=" + age +", gender='" + gender + '\'' +", score=" + score +'}';
}//为新添加的属性设置set和get方法public double getScore() {return score;}public void setScore(double score) {this.score = score;}

spring.xml文件中的参数设置不变:

<bean id="student1" class="xysfxy.student"  ><constructor-arg  value="1002"></constructor-arg><constructor-arg  value="李四"></constructor-arg><constructor-arg  value=""></constructor-arg><constructor-arg  value="24"></constructor-arg></bean>

在当有参构造器中包含参数相同的情况下,spring.xml文件中的第四个数据24既可以匹配给整形age,也可以匹配给double类型的score,测试结果如下:

在这里插入图片描述

我们发现默认情况下,24匹配给了score,但事实我们是想实现将24匹配给年龄, 那么该如何实现呢?

关于这种情况网上的解决方法有很多:

 方法1:spring.xml文件的bean标签的最后一个属性值设置时,指定name="age"
 方法2:将有参构造中包含age的那个构造方法放在另一个的前面

我使用第二种方式可以,但第一种就会报错,至于为什么不能两个方法通用,我也很疑惑…

依赖注入之特殊值处理:

字面量赋值:

什么是字面量?

例如:

int a=10;

声明一个变量a,初始化为10,此时a就不代表字母a了,而是作为一个变量的名字,当我们引用a的时候,我们实际上拿到的值是10,而如果a是带引号的:“a”,那么它现在不是一个变量,它就是代表a这个字母本身,这就是字面量,所以字面量没有引申含义,就是我们看到的这个数据本身

举例:

我们在spring.xml文件中设置gender属性的值为"null":

<bean id="student1" class="xysfxy.student"  ><property name="sname" value="张三" ></property><property name="sid" value="1002" ></property><property name="gender" value="null"> </property><property name="age" value="24" ></property></bean>

输出如下所示:

student{sid=1002, sname='李四', age=24, gender='null', score=0.0}

我们发现,gender最终输出的值就是null,那他表示的是null对象还是值为null的字符串呢?

我们可通过下述代码进行测试,如果没有报错,则证明当前的null为值是null的字符串:

System.out.println(student.getGender().toString());

输出如下所示:

在这里插入图片描述

如果它是null对象的话,应该报错为空指针异常

正确的将属性设置为null对象的方法如下:

<bean id="student1" class="xysfxy.student"  ><property name="sname" value="张三" ></property><property name="sid" value="1002" ></property><!-- 将gender属性设置为null对象,使用null标签表示,由于该标签中的内容是空,因此我们可以写为单标签 --><property name="gender"><null/></property>
</bean>

输出如下:

在这里插入图片描述

xml实体:

小于号在XML文档中用来定义标签的开始,不能随便使用,如下所示:

我们想输出name的值是一个带"<>"的,如果直接添加带符号在XML文档是不可行的

在这里插入图片描述

解决方案:使用XML实体来代替,&lt;表示小于号,&gt;表示大于号,修改上述代码如下所示:

 <property name="sname" value="&lt;张三&gt;" ></property>

输出结果如下所示:

此时的sname的值中的大括号和小括号都被显示出来

student{sid=1002, sname='<张三>', age=11, gender='null', score=0.0}

关于特殊符号无法被解析的问题,我们还有另外一种办法,就是使用CDATA节CDATA中的C代表Character,是文本,字符的含义,CDATA就代表纯文本数据,XML解析器看到CDATA就知道这里是纯文本,就不会当做XML标签或属性来解析,所以CDATA节中写什么都任意,在IDE中,我们可以通过快捷键使用这个功能,CD[一定要大写],回车即可,如下所示:

 <property name="sname" ><value><![CDATA[<张三>]]></value></property>

输出如下:

student{sid=1002, sname='<张三>', age=11, gender='null', score=0.0}

这种方式也可以正确的显示特殊字符,但需要注意的是它是XML中一个特殊的标签,我们不能将其当做value属性的值写在value属性的后面

依赖注入之为类类型的属性赋值:

创建实体类班级:

package poij;public class clazz {private  Integer cid;private  String name;public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public clazz(Integer cid,String name) {this.cid = cid;this.name=name;}public clazz() {}@Overridepublic String  toString() {return "clazz{" +"cid=" + cid +", name='" + name + '\'' +'}';}
}

修改student类:

//班级和学生之间是一对多的关系,将班级作为学生的一个属性加入到学生类中private  clazz clazz;//并为其设置set和get方法public poij.clazz getClazz() {return clazz;}public void setClazz(poij.clazz clazz) {this.clazz = clazz;}//重写toString方法@Overridepublic String toString() {return "student{" +"sid=" + sid +", sname='" + sname + '\'' +", age=" + age +", gender='" + gender + '\'' +", clazz=" + clazz +'}';}

那么对于student类来说,clazz属性该如何赋值呢?

我们不能使用value对其进行赋值,因为value是给字面量赋值的,但clazz对应的是一个对象

那么该如何给类类型赋值呢?

引用外部的bean给类类型赋值:

修改spring文件中的代码:

<!-- 在给类为student的bean对象的clazz赋值时,使用引用外部bean的方式
ref:引用IOC容器中的某个bean-->
<property name="clazz" ref="clazz1"></property><!-- 创建类型为clazz的bean对象-->
<bean id="clazz1" class="poij.clazz"><property name="cid" value="1111"></property><property name="name" value="菜鸟班"></property>
</bean>

输出如下所示:

在这里插入图片描述

通过级联方式给类类型赋值:

在mybatis中,我们也曾经使用过级联的方式为其赋值,也就是通过类.属性的方式对其进行赋值,那么在spring中,也可以使用该方法吗?

如下所示:尝试使用类.属性的方式直接赋值

<property name="clazz.cid" value="2222"></property>
<property name="clazz.name" value="卷心菜班"></property>

运行报错:虽然上述这种方法可以在mybatis中使用,但是在spring中是不行的

在这里插入图片描述

使用级联方式的前提条件是:要保证提前为clazz属性赋值或者实例化

方法1:先赋值再修改

<bean id="student1" class=" poij.student"  ><property name="sid" value="1001"></property><property name="sname" value="张三"></property><property name="age" value="20"></property><property name="gender" value=""></property><!-- 先通过引用外部bean的方式为其赋值 --><property name="clazz" ref="clazz1"></property><!-- 再对上述 引用的bean对象的值进行修改--><property name="clazz.cid" value="2222"></property><property name="clazz.name" value="卷心菜班"></property></bean><!-- 创建外部的bean对象--> 
<bean id="clazz1" class="poij.clazz"><property name="cid" value="1111"></property><property name="name" value="菜鸟班"></property>
</bean>

方法2:在student类中对clazz进行实例化

private  clazz clazz= new clazz( );

在spring.xml文件中可直接通过类.属性的方式进行赋值:

<property name="clazz.cid" value="2222"></property>
<property name="clazz.name" value="卷心菜班"></property>

上述任意一种,输出均为如下所示:

student{sid=1001, sname='张三', age=20, gender='男', clazz=clazz{cid=2222, name='卷心菜班'}}

虽然以级联的方式也可以对类类型进行赋值,但这种方法我们并不常用,我们通常使用内部bean的方式,下面我们就具体学习一下该方式如何使用:

使用内部bean的方式为类类型赋值:

修改spring.xml中的bean标签:

<bean id="student1" class=" poij.student"  ><property name="sid" value="1001"></property><property name="sname" value="张三"></property><property name="age" value="20"></property><property name="gender" value=""></property><!-- 内部bean的方式为:通过设置一个内部的bean对象而为clazz对象进行赋值--><property name="clazz"><!-- 将为班级赋值的过程写在一个内部的bean标签中--><bean id="clazz_inner" class="poij.clazz"><property name="cid" value="333"></property><property name="name" value="卷王班"></property></bean></property>
</bean>

输出如下所示:

student{sid=1001, sname='张三', age=20, gender='男', clazz=clazz{cid=333, name='卷王班'}}

内部bean就类似于我们在java中学过的内部类一样,它只能在bean的内部进行使用,那么内部bean可以通过IOC容器进行获取吗?

修改测试类中的代码:

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import poij.clazz;public class student_text {@Testpublic void test(){ApplicationContext ioc=new ClassPathXmlApplicationContext( "spring.xml");//尝试获取内部beanclazz clazz1= ioc.getBean( clazz.class);System.out.println(clazz1);}
}

输出如下所示:

看来内部bean确实无法通过IOC容器直接获取

在这里插入图片描述

说到这里,为类类型的属性赋值的三种方式我们已经说完了,引用外部的bean以及使用内部bean是我们所推荐的方法,第二种使用级联并不是我们所推荐的,原因是,它需要先赋值再修改,这样好像并不是真正意义上的赋值,而是修改已有的值

依赖注入之为数组类型的属性赋值:

修改student类中的代码:

//添加新的属性
private  String [] hobby;//为新的属性编写set和get方法
public String[] getHobby() {return hobby;}public void setHobby(String[] hobby) {this.hobby = hobby;}
//重写toString方法@Overridepublic String toString() {return "student{" +"sid=" + sid +", sname='" + sname + '\'' +", age=" + age +", gender='" + gender + '\'' +", clazz=" + clazz +", hobby=" + Arrays.toString(hobby) +'}';}

在spring.xml中为hobby属性赋值:

<bean id="student1" class=" poij.student"  ><property name="sid" value="1001"></property><property name="sname" value="张三"></property><property name="age" value="20"></property><property name="gender" value=""></property><property name="clazz"><bean id="clazz_inner" class="poij.clazz"><property name="cid" value="333"></property><property name="name" value="卷王班"></property></bean></property><!--  为类型为数组的hobby属性赋值,数组的值为字面量,则使用value标签,如果为对象类型,则使用ref标签,通过的id从而获取对应的bean --><property name="hobby"><array><value>吃饭</value><value>睡觉</value><value>打豆豆</value></array></property></bean>

输出如下所示:

student{sid=1001, sname='张三', age=20, gender='男', clazz=clazz{cid=333, name='卷王班'}, hobby=[吃饭, 睡觉, 打豆豆]}

依赖注入之为集合类型的属性赋值:

修改clazz类:

//1个班级可以有多个学生,因此将学生作为属性添加到班级中是以集合的形式
private List<student> students;//为其编写set和get方法
public List<student> getStudents() {return students;}public void setStudents(List<student> students) {this.students = students;}//重写toString方法@Overridepublic String toString() {return "clazz{" +"cid=" + cid +", name='" + name + '\'' +", students=" + students +'}';
}

内部list集合为集合类型的属性赋值:

修改spring.xml文件:

<!-- student1学生-->
<bean id="student1" class="poij.student"><property name="sid" value="1"></property><property name="sname" value="张三"></property><property name="age" value="20"></property><property name="gender" value=""></property><property name="hobby"><array><value>吃饭</value><value>睡觉</value></array></property></bean><!-- student2学生-->
<bean id="student2" class="poij.student"><property name="sid" value="2"></property><property name="sname" value="李四"></property><property name="age" value="12"></property><property name="gender" value=""></property><property name="hobby"><array><value>唱歌</value><value>打游戏</value></array></property></bean><!-- student3学生-->
<bean id="student3" class="poij.student"><property name="sid" value="3"></property><property name="sname" value="lisa"></property><property name="age" value="21"></property><property name="gender" value=""></property><property name="hobby"><array><value>弹钢琴</value><value>跳舞</value></array></property></bean><!-- clazz对象--在内部使用list标签,将上述的3个学生添加到班级当中-->
<bean id="clazz1" class="poij.clazz"><property name="cid" value="111"></property><property name="name" value="软件1班"></property><property name="students"><list><ref bean="student1"></ref><ref bean="student2"></ref><ref bean="student3"></ref></list></property>
</bean>

输出如下所示:

clazz{cid=111, name='软件1班', students=[student{sid=1, sname='张三', age=20, gender='女', clazz=null, hobby=[吃饭, 睡觉]}, student{sid=2, sname='李四', age=12, gender='男', clazz=null, hobby=[唱歌, 打游戏]}, student{sid=3, sname='lisa', age=21, gender='女', clazz=null, hobby=[弹钢琴, 跳舞]}]}

引用list集合的bean为集合类型的属性赋值:

如果在IOC容器中存在一个list集合类型的bean,那么我们是否可以直接通过ref来引用呢?如下所示:

在这里插入图片描述

上述这种方式是不对的, 我们现在要创建的是一个list集合类型的bean最主要的是要往list集合中去存储数据但如果我们单独创建一个bean,类型是ArrayList,我们能做的只是为当前这个类中的属性赋值,而不能通过bean标签为当前的这个集合去存取数据

正确方法:

我们去配置一个集合类型的bean,但这需要使用util约束

添加前spring.xml文件中是没有该约束的:

在这里插入图片描述

添加之后新增util约束:

在这里插入图片描述

修改spring.xml文件中的内容:

<!-- student1 -->
<bean id="student1" class="poij.student"><property name="sid" value="1"></property><property name="sname" value="张三"></property><property name="age" value="20"></property><property name="gender" value=""></property><property name="hobby"><array><value>吃饭</value><value>睡觉</value></array></property></bean><!-- student2 --><bean id="student2" class="poij.student"><property name="sid" value="2"></property><property name="sname" value="李四"></property><property name="age" value="12"></property><property name="gender" value=""></property><property name="hobby"><array><value>唱歌</value><value>打游戏</value></array></property></bean><!-- student3 --><bean id="student3" class="poij.student"><property name="sid" value="3"></property><property name="sname" value="lisa"></property><property name="age" value="21"></property><property name="gender" value=""></property><property name="hobby"><array><value>弹钢琴</value><value>跳舞</value></array></property></bean><!-- clazz对象-->
<bean id="clazz1" class="poij.clazz"><property name="cid" value="111"></property><property name="name" value="软件1班"></property><!-- 引用list集合的bean--><property name="students" ref ="studentsList"></property>
</bean><!-- 配置一个集合类型的bean,需要使用util约束-->
<util:list id="studentsList"><ref bean="student1"></ref><ref bean="student2"></ref><ref bean="student3"></ref>
</util:list>

输出如下所示:

clazz{cid=111, name='软件1班', students=[student{sid=1, sname='张三', age=20, gender='女', clazz=null, hobby=[吃饭, 睡觉]}, student{sid=2, sname='李四', age=12, gender='男', clazz=null, hobby=[唱歌, 打游戏]}, student{sid=3, sname='lisa', age=21, gender='女', clazz=null, hobby=[弹钢琴, 跳舞]}]}

依赖注入之为map集合类型的属性赋值:

创建新的teacher类:

package poij;public class teacher {private  Integer tid;private  String name;public Integer getTid() {return tid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void setTid(Integer tid) {this.tid = tid;}public teacher() {}public teacher(Integer tid,String name) {this.tid = tid;this.name=name;}@Overridepublic String toString() {return "teacher{" +"tid=" + tid +", name='" + name + '\'' +'}';}
}

修改student:

//将老师作为学生的一个属性添加进来
private Map<String,teacher> stringteacherMap;//为其设置set和get方法public Map<String, teacher> getStringteacherMap() {return stringteacherMap;}public void setStringteacherMap(Map<String, teacher> stringteacherMap) {this.stringteacherMap = stringteacherMap;}//重写toString方法
@Overridepublic String toString() {return "student{" +"sid=" + sid +", sname='" + sname + '\'' +", age=" + age +", gender='" + gender + '\'' +", clazz=" + clazz +", hobby=" + Arrays.toString(hobby) +", stringteacherMap=" + stringteacherMap +'}';}

方法1:通过map标签进行设置

修改spring.xml文件:

假设我们现在要给id为student3的bean对象的stringteachermap属性赋值,如下所示,我们需要使用map标签而不是util:map,因为util:map的功能类似于util:list,它是用来配置一个类型为map的bean对象

在这里插入图片描述

由于map中的数据是以键值对的形式存取的,那么如何设置键值对呢?

map标签中我们输入<,显示的结果有以下两种,看到entry不知道大家是否会感到格外的熟悉,因为这是我们在java中就已经接触过的,它表示的是一个类型,map中的键和值,我们可以使用一个entry来表示map集合中的一个键值对

在这里插入图片描述

entry中可包含的参数有以下几种:和我们上面学习的其他类型是一样的,凡是带有-ref的则证明这个参数的类型是一个对象,若仅仅是key和value,则证明这个参数是字面量

在这里插入图片描述

修改spring.xml文件中的内容:

<!-- 为id为student3的bean对象的stringteachermap属性赋值-->
<bean id="student3" class="poij.student"><property name="sid" value="3"></property><property name="sname" value="lisa"></property><property name="age" value="21"></property><property name="gender" value=""></property><property name="hobby"><array><value>弹钢琴</value><value>跳舞</value></array></property><!-- 在student中,map<String,teacher>--><property name="stringteacherMap"><map ><!-- teacher则使用引用外部bean的方式--><entry key="1号老师" value-ref="teacher1"></entry><entry key="2号老师" value-ref="teacher2"></entry></map></property></bean>
<!-- 创建类型为老师的bean对象-->
<!-- teacher1-->
<bean id="teacher1" class="poij.teacher"><property name="tid" value="10086"></property><property name="name" value="大宝"></property>
</bean><!-- teacher2-->
<bean id="teacher2" class="poij.teacher"><property name="tid" value="10010"></property><property name="name" value="小宝"></property>
</bean>

方法2:通过util:map进行设置

对spring.xml进行修改:

<!-- 创建了类型为老师的bean对象-->
<bean id="teacher1" class="poij.teacher"><property name="tid" value="10086"></property><property name="name" value="大宝"></property>
</bean><bean id="teacher2" class="poij.teacher"><property name="tid" value="10010"></property><property name="name" value="小宝"></property>
</bean>
<!-- 为id为student3的bean对象的stringteachermap属性赋值-->
<bean id="student3" class="poij.student"><property name="sid" value="3"></property><property name="sname" value="lisa"></property><property name="age" value="21"></property><property name="gender" value=""></property><property name="hobby"><array><value>弹钢琴</value><value>跳舞</value></array></property><!-- 直接通过id值引用util:map对象--><property name="stringteacherMap" ref="teacherMap"></property>
</bean><!-- 创建util:map对象-->
<util:map id="teacherMap"><entry key="1号老师" value-ref="teacher1"></entry><entry key="2号老师" value-ref="teacher2"></entry>
</util:map>

无论上述那种方法,输出均为如下所示:

student{sid=3, sname='lisa', age=21, gender='女', clazz=null, hobby=[弹钢琴, 跳舞], stringteacherMap={1号老师=teacher{tid=10086, name='大宝'}, 2号老师=teacher{tid=10010, name='小宝'}}}

依赖注入之为p命名空间:

在spring.xml文件中创建新的bean对象:

<bean id="student4" class="poij.student" p:sid="12" p:sname="小白" p:stringteacherMap-ref="teacherMap"></bean>

但我们使用上述这种p属性开头的方法,需要注意一定要引入p。它必须有约束的支持才能够进行,如下所示:

在这里插入图片描述

使用p:开头的这种方式,我们会发现每个属性都有两个:一个是不带-ref后缀,一个是带-ref后缀,在前面的学习中,我们就说过带-ref表示该属性的值是一个类,而不带-ref的表示该属性的值是一个字面量,注意在选择的时候,不要选择错误了

在这里插入图片描述

在测试类中获取id为student4的bean对象:

student student=ioc.getBean("student4", poij.student.class);
System.out.println(student);

输出如下所示,我们未赋值的属性是以null显示:

student{sid=12, sname='小白', age=null, gender='null', clazz=null, hobby=null, stringteacherMap={1号老师=teacher{tid=10086, name='大宝'}, 2号老师=teacher{tid=10010, name='小宝'}}}

这种方式虽然可行,但并不是常用的,因此我们了解一下即可!

相关文章:

依赖注入~

依赖注入之setter注入&#xff1a; 依赖注入是IOC具体的一种实现方式&#xff0c; 这是针对资源获取的方式角度来说的&#xff0c;之前我们是被动接受&#xff0c;现在IOC具体的实现叫做依赖注入&#xff0c;从代码的角度来说&#xff0c;原来创建对象的时候需要new&#xff0…...

【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程

【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程 XTAL_EN接地&#xff0c;CLK_CFG的两个引脚由同一个GPIO控制 初始时HART_CLK_CFG输出低电平 由RTS引脚控制调制/解调。当RTS处于高电平时&#xff0c;为解调&#xff08;输入&#xff09;&#xff1b;否则为调…...

Go语言异步下载视频

异步下载mp4视频列表 下面是一个简单的Go语言示例&#xff0c;用于异步下载视频。我们将使用goroutines来实现异步下载&#xff0c;并使用sync.WaitGroup来等待所有下载任务完成。此示例依赖于net/http包来执行HTTP请求。 package mainimport ("fmt""io"…...

前缀树(字典树/Trie) -----Java实现

目录 一.前缀树 1.什么是前缀树 2.前缀树的举例 二.前缀树的实现 1.前缀树的数据结构 1.插入字符串 2.查找字符串 3.查找前缀 三.词典中最长的单词 1.题目描述 2.问题分析 3.代码实现 一.前缀树 1.什么是前缀树 字典树&#xff08;Trie树&#xff09;是一种树形…...

​申请专利需要具备什么条件

​申请专利需要具备什么条件 在我国&#xff0c;如果创造出来了新的发明都可以申请专利权&#xff0c;一旦申请成功之后&#xff0c;自己的发明就受到了法律的保护&#xff0c;任何人不得以违法的手段进行侵犯。那么申请专利需要具备什么条件&#xff1f;今天律赢时代网就为大家…...

【C++】一篇带你搞懂C++“引用”

前言在C语言的学习中&#xff0c;并没有引用这个概念&#xff0c;但是在C中&#xff0c;加入了引用这个概念&#xff0c;说明引用也是很重要的&#xff0c;但是我们怎么理解引用呢&#xff1f;我是这么理解的&#xff0c;例如在水浒传中&#xff0c;108个英雄好汉都是自己的外号…...

蓝桥杯刷题冲刺 | 倒计时19天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.抓住那头牛2.排列序数1.抓住那头牛 题目 链接&#xff1a; 抓住那头牛 - C语言网 (dotcpp.com…...

Java每日一练(20230321)

目录 1. 出现次数最多的字符 &#x1f31f; 2. 最后一个单词的长度 &#x1f31f; 3. 两数之和 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 出现次数最多的字符并…...

【三维几何学习】从零开始网格上的深度学习-3:Transformer篇(Pytorch)

本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 从零开始网格上的深度学习-3:Transformer篇引言一、概述二、核心代码2.1 位置编码2.2 网络框架三、基于Transformer的网格分类3.1 分类结果3.2 全部代码引言 本文主要内容如下&#…...

一、基础算法3:二分 模板题+算法模板(数的范围,数的三次方根)

文章目录算法模板整数二分算法模板浮点数二分算法模板模板题数的范围原题链接题目题解数的三次方根原题链接题目题解算法模板 整数二分算法模板 bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid 1, r]时使用&#xff1a; int b…...

Spring 源码解析 - Bean创建过程 以及 解决循环依赖

一、Spring Bean创建过程以及循环依赖 上篇文章对 Spring Bean资源的加载注册过程进行了源码梳理和解析&#xff0c;我们可以得到结论&#xff0c;资源文件中的 bean 定义信息&#xff0c;被组装成了 BeanDefinition 存放进了 beanDefinitionMap 容器中&#xff0c;那 Bean 是…...

移除元素(双指针)

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的…...

76.qt qml-QianWindow开源炫酷界面框架(支持白色暗黑渐变自定义控件均以适配)

界面介绍界面支持: 透明 白色 黑色 渐变 单色 静态图 动态图侧边栏支持:抽屉、带折叠、多模式场景控件已集成: 暗黑风格 高亮风格、并附带个人自定义控件及开源demo白色场景如下所示:单色暗黑风格如下所示:用户自定义皮肤如下所示:皮肤预览如下所示:b站入口:https://www.bilibi…...

Python生日蛋糕

目录 前言 底盘 蛋糕 蜡烛 祝福 前言 Hello&#xff0c;小伙伴们晚上好吖&#xff01;前两天博主满20岁啦&#xff08;要开始奔三辽呜呜呜&#xff09;&#xff0c;这几天收到了不少小伙伴们的祝福&#xff0c;浪漫的小博主想送给大家一份不一样的生日蛋糕&#xff0c…...

QT 如何提高 Qt Creator 的编译速度

如何提高编译速度&#xff0c;貌似是一个老生常谈的话题。对于Qter而言&#xff0c;如何提高QT Creator 的编辑速度是一直都是大家所期盼的。本文也是查阅了各路大神的方法后整理出来的&#xff0c;希望对各位有所帮助。 1、在*.pro文件添加预编译机制 QT官方给出的示例&…...

STM32之震动传感器、继电器介绍及实战

目录 一、震动传感器介绍及实战 二、编程代码实现 1、gpio.c---------初始化GPIO口引脚函数 2、调用中断服务函数 3、中断服务函数 4、中断服务回调函数 5、把上述的中断服务回调函数&#xff0c;放入main主函数里 6、结果演示 三、继电器介绍及实战 一、震动传感器介…...

RK3588平台开发系列讲解(显示篇)RK3588 平台 的DP介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、功能特性二、 DP 输⼊三、DP 输出四、 代码路径沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 RK3588 平台 DP 的使⽤与调试⽅法。 一、功能特性 RK3588 的 DP ⽀持 1.4a 版本的 DP 协议,最…...

【Java】i++和++i的实现原理

文章目录 i++案例反编译分析扩展 x = x++我们接下来从字节码层面分析: 不了解字节码的可以参考这篇:【精通JVM】字节码指令全解 i++案例 package org.example;public class Main {public static void main...

第十四届蓝桥杯三月真题刷题训练——第 18 天

目录 第 1 题&#xff1a;排列字母 问题描述 运行限制 代码&#xff1a; 第 2 题&#xff1a;GCD_数论 问题描述 输入格式 输出格式 样例输入 样例输出 评测用例规模与约定 运行限制 第 3 题&#xff1a;选数异或 第 4 题&#xff1a;背包与魔法 第 1 题&#x…...

软件测试拿了几个20K offer,分享一波面经

1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&#xff0c;不断…...

spring2

1.Spring配置数据源1.1 数据源&#xff08;连接池&#xff09;的作用 数据源(连接池)是提高程序性能如出现的事先实例化数据源&#xff0c;初始化部分连接资源使用连接资源时从数据源中获取使用完毕后将连接资源归还给数据源常见的数据源(连接池)&#xff1a;DBCP、C3P0、BoneC…...

【Linux】网络编程套接字(中)

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…...

手撕数据结构—队列

队列队列的话只允许在一端插入&#xff0c;在另外一端删除。插入数据的那一段叫做队尾&#xff0c;出数据的那一段叫做队头&#xff08;从尾巴插入&#xff09;。因此的话队列是先进先出的。入的顺序与出的顺序的话是一样的。这个与栈是不一样的&#xff0c;因为栈的话就是说如…...

gdb调试工具和makemakefile工具

gdb调试工具和make/makefile工具 文章目录gdb调试工具和make/makefile工具一、gdb调试工具1.debug/release2.使用二、make/makefile1.什么是make/makefile2.编写一、gdb调试工具 1.debug/release 程序有两种默认的发布方式debug和release。release是无法进行调试的。Linux中g…...

【进阶数据结构】平衡搜索二叉树 —— AVL树

&#x1f308;感谢阅读East-sunrise学习分享——[进阶数据结构]AVL树 博主水平有限&#xff0c;如有差错&#xff0c;欢迎斧正&#x1f64f;感谢有你 码字不易&#xff0c;若有收获&#xff0c;期待你的点赞关注&#x1f499;我们一起进步&#x1f680; &#x1f308;我们上一篇…...

ROS使用(5)action学习

action消息的构建 首先进行功能包的创建 mkdir -p ros2_ws/src cd ros2_ws/src ros2 pkg create action_tutorials_interfaces action消息的类型 # Request --- # Result --- # Feedback 动作定义由三个消息定义组成&#xff0c;以---分隔。 从动作客户机向动作服务器发送…...

2023前端面试题集(含答案)之HTML+CSS篇(一)

在又到了金三银四的招聘季&#xff0c;不管你是刚入行的小白&#xff0c;亦或是混迹职场的老鸟&#xff0c;还在为面试前端工程师时不知道面试官要问什么怎么回答而苦恼吗&#xff1f;为了帮助你获得面试官的青睐&#xff0c;顺利通过面试&#xff0c;跳槽进入大厂&#xff0c;…...

设计模式2 - 观察者模式

定义&#xff1a; 观察者模式又叫发布订阅模式&#xff0c;它定义了对象之间的一对多依赖&#xff0c;这样一来&#xff0c;当一个对象改变状态时&#xff0c;它的所有依赖者都会收到通知并自动更新。 组成&#xff1a; Subject&#xff08;通知者/被观察者&#xff09;&#…...

ini配置文件

ini配置文件 ini文件是initialization file的缩写&#xff0c;即初始化文件&#xff0c;是widows系统配置文件所采用的存储格式。 文件扩展名: .ini ini配置文件的后缀名也不一定必须是.ini, 也可以是.cfg, .conf或者是.txt ini文件格式 ini配置文件由参数, 节, 注解组成 参…...

蓝桥杯备赛经验 pythonA组(非科班选手)

个人2022 CA组江苏省一等奖&#xff0c;决赛成绩不理想&#xff0c;没有拿到一二等奖&#xff0c;但是因为自己是非科班的学生&#xff0c;所以能拿到这样的成绩自己其实也应该知足了 题外话&#xff1a; 很多ACMer嘲笑蓝桥杯非常水&#xff0c;但是据我观察CA组决赛一等奖获奖…...