Spring(二)获取bean和依赖注入

news2024/11/29 7:48:51

一、获取bean的三种方式:

1.根据bean的id获取:

Student studentOne = (Student) ioc.getBean("studentOne");

2.获取bean所需要的类型的class对象:

 Student student = ioc.getBean(Student.class);

我们运行之后如下所示:

如果我们在bean里面添加如下代码:

  <bean id="studentOne" class="com.rgf.spring.pojo.Student"></bean>
    <bean id="studentTwo" class="com.rgf.spring.pojo.Student"></bean>

我们发现运行之后,如下所示:

 面对这种情况,我们要确保只有一个,即为单例的。

设置单例还是多例:

 根据类型获取bean时,要求IOC容器中有且只有一个类型匹配的bean

若没有任何一个类型匹配的bean,此时抛出异常:NoSuchBeanDefinitionException

若有多个类型匹配的bean,此时抛出异常:NoUniqueBeanDefinitionException

3.根据bean的id和类型获取:

获取bean,获取bean所需要的类型和id

 Student student = ioc.getBean("studentOne", Student.class);

 注意:当根据类型获取Bean时,要求ioc容器中指定类型的bean有且只能有一个

扩展:如果组件类(交给IOC管理的类)实现了接口,根据接口类型可以获取bean:

我们创建接口Person:

package com.rgf.spring.pojo;

public interface Person {

}

之后我们让该类Student继承该接口:

package com.rgf.spring.pojo;

public class Student implements Person{
    private  Integer sid;
    private String sname;
    private Integer age;
    private String gender;

    public Student() {
    }

    public Student(Integer sid, String sname, Integer age, String gender) {
        this.sid = sid;
        this.sname = sname;
        this.age = age;
        this.gender = gender;
    }

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

之后我们进入测试类如下所示:

package com.rgf.sping.test;

import com.rgf.spring.pojo.Person;
import com.rgf.spring.pojo.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IOCByXMLTest {
    /**
     * 获取bean的三种方式:
     * 1.根据bean的id获取
     * 2.根据bean的类型获取
     * 注意:根据类型获取bean时,要求ioc容器中有且只有一个类型匹配的bean。
     * 若没有任何一个类型匹配的bean,此时抛出异常:NoSuchBeanDefinitionException
     * 若有多个类型类型匹配的bean,此时抛出异常:BeanDefinitionParsingException
     * 3.根据bean的id和类型获取
     * 结论:
     * 根据类型来获取Bean时,在满足bean唯一性的前提下,其实只是看:|对象 instanceof 指定的类型|的返回的结果,
     * 只要返回的是true,就可以认定为和类型匹配,能够获取到。
     * 即通过bean的类型,bean所继承的类的类型,bean所实现的接口的类型都可以获取bean
     */
    @Test
    public void  testIOC(){
        //获取IOC容器
       ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
       //获取bean,获取bean所需要的类型和id
      //  Student student = ioc.getBean("studentOne", Student.class);
        //System.out.println(student);
        //我们当前通过Student类型获取了bean之后,把咱们所获取的对象通过向上转型赋值给了他的接口对象
        Person student = ioc.getBean(Student.class);
        System.out.println(student);
        Person person = ioc.getBean(Person.class);
        System.out.println(person);

    }
}

我们运行之后如下所示:

 我们可以通过接口类型来获取bean,但是前提是bean是唯一的。

如果一个接口有多个实现类,这些实现类都配置了bean,根据接口类是不可以获取bean的,因为bean是不唯一的呢

根据类型来获取Bean时,在满足bean唯一性的前提下,其实只是看:对象    instanceof  指定的类型  的返回的结果,只要返回的是true,就可以认定为和类型匹配,能够获取到。

二、依赖注入

1.依赖注入之setter注入:

IOC资源注入的一个具体实现为依赖注入:

ref为引用,value为赋一个普通的值。 

我们在IOC文件里面写入如下所示:

 <bean id="studentTwo" class="com.rgf.spring.pojo.Student">
        <property name="sid" value="1001"></property>
        <property name="sname" value="张三"></property>
        <property name="age" value="23"></property>
        <property name="gender" value="男"></property>
    </bean>

property:通过成员变量的set方法进行赋值

name:设置需要赋值的属性名(和set方法有关)

value:设置为属性所赋的值

我们的测试类如下所示:

 @Test
    public void  TestDI(){
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc.xml");
        Student student = ioc.getBean("studentTwo", Student.class);
        System.out.println(student);
    }

运行之后如下所示:

 2.依赖注入之构造器注入(有参构造)

我们在student里面的有参构造如下所示:

  public Student(Integer sid, String sname, Integer age, String gender) {
        this.sid = sid;
        this.sname = sname;
        this.age = age;
        this.gender = gender;
    }

我们进行设置构造器注入:

 <bean id="studentThree" class="com.rgf.spring.pojo.Student">
        <!--如果只有一个有参构造,则可以直接来为我们按照参数顺序进行赋值-->
        <!--利用有参构造对依赖进行注入所用标签为:constructor-arg-->
       <constructor-arg value="1002"></constructor-arg>
       <constructor-arg value="李四"></constructor-arg>
       <constructor-arg value="24"></constructor-arg>
       <constructor-arg value="女"></constructor-arg>
    </bean>

我们的测试类如下所示:

  @Test
    public void  TestDI(){
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc.xml");
        Student student = ioc.getBean("studentThree", Student.class);
        System.out.println(student);
    }

我们运行之后如下所示:

 当我们创建多个构造器如下所示:

  public Student(Integer sid, String sname, String gender,Integer age) {
        this.sid = sid;
        this.sname = sname;
        this.gender = gender;
        this.age = age;
    }

    public Student(Integer sid, String sname, String gender,Double score) {
        this.sid = sid;
        this.sname = sname;
        this.gender = gender;
        this.score=score;
    }

我们的bean如下所示:

 <bean id="studentThree" class="com.rgf.spring.pojo.Student">
        <!--如果只有一个有参构造,则可以直接来为我们按照参数顺序进行赋值-->
        <!--利用有参构造对依赖进行注入所用标签为:constructor-arg-->
       <constructor-arg value="1002"></constructor-arg>
       <constructor-arg value="李四"></constructor-arg>
       <constructor-arg value="女"></constructor-arg>
        <constructor-arg value="24" ></constructor-arg>
    </bean>

我们运行之后如下所示:

此时我们发现age为null,当有多个构造器的时候,我们进行如下所示:

 

type:设置当前参数的类型

ref:引用

name:参数名

index:索引 

我们修改如下所示:

 <bean id="studentThree" class="com.rgf.spring.pojo.Student">
        <!--如果只有一个有参构造,则可以直接来为我们按照参数顺序进行赋值-->
        <!--利用有参构造对依赖进行注入所用标签为:constructor-arg-->
       <constructor-arg value="1002"></constructor-arg>
       <constructor-arg value="李四"></constructor-arg>
       <constructor-arg value="女"></constructor-arg>
        <constructor-arg value="24" name="age"></constructor-arg>
    </bean>

测试之后如下所示:

3.依赖注入之特殊值处理

(1)字面量赋值

 赋值空对象,利用如下所示:利用<null/>标签,赋值空对象

 <bean id="studentFour" class="com.rgf.spring.pojo.Student">
        <property name="sid" value="1002"></property>
        <property name="sname" value="王五"></property>
        <property name="gender" >
            <null/>
        </property>
    </bean>

我们要在赋值里面采用特殊字符:

小于号在XML文档中用来定义标签的开始,不能随便使用(<:&lt; >:&gt;)

<property name="sname" value="<王五>"></property>

则会报错,我们应该如下所示进行利用:

 <property name="sname" value="&lt;王五&gt;"></property>

我们运行之后如下所示:

 <:&lt;  >:%gt;

CDATA中的C代表Character,是文本、字符的含义,CDATA就表示纯文本数据

XML解析器看到CDATA节就知道这里是纯文本,就不会当作XML标签或属性来解析

 <property name="sname"><value><![CDATA[<王五>]]></value></property>
<!--快捷键为CD-->

我们运行之后如下所示:

 CDATA节其中的内容会原样解析<![CDATA[...]]>

CDATA节是xml中一个特殊的标签,因此不能写在一个属性中

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

4.1引用外部的bean

我们进行创建Clazz类:

package com.rgf.spring.pojo;

public class Clazz {
    private  Integer cid;
    private  String cname;

    public Clazz() {
    }

    public Clazz(Integer cid, String cname) {
        this.cid = cid;
        this.cname = cname;
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "Clazz{" +
                "cid=" + cid +
                ", cname='" + cname + '\'' +
                '}';
    }
}

我们在配置文件里面加载如下bean:

   <bean id="studentFive" class="com.rgf.spring.pojo.Student">
        <property name="sid" value="1004"></property>
        <property name="sname" value="赵四"></property>
        <property name="age" value="26"></property>
        <property name="gender" value="男"></property>
        <property name="clazz" ref="classOne"></property>
    </bean>

    <bean id="classOne" class="com.rgf.spring.pojo.Clazz">
        <property name="cid" value="111"></property>
        <property name="cname" value="最强王者班"></property>
    </bean>

 ref:引用IOC容器中的某个bean的id,然后把我们当前的这个bean所对应的对象来为当前的属性进行赋值。

我们进行测试如下:

 @Test
    public void  TestDI(){
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc.xml");
        Student student = ioc.getBean("studentFive", Student.class);
        System.out.println(student);
    }

运行之后如下所示:

 4.2级联方式

通过我们当前对象.属性来进行赋值,

 <bean id="studentFive" class="com.rgf.spring.pojo.Student">
        <property name="sid" value="1004"></property>
        <property name="sname" value="赵四"></property>
        <property name="age" value="26"></property>
        <property name="gender" value="男"></property>
        <property name="clazz.cid" value="222"></property>
        <property name="clazz.cname" value="远大前程班"></property>
    </bean>

我们进行测试之后发现进行了报错。

我们发现先将此进行赋值之后,不再报错:

 <bean id="clazzOne" class="com.rgf.spring.pojo.Clazz">
        <property name="cid" value="111"></property>
        <property name="cname" value="最强王者班"></property>
    </bean>
    <bean id="studentSix" class="com.rgf.spring.pojo.Student">
        <property name="sid" value="1004"></property>
        <property name="sname" value="赵四"></property>
        <property name="age" value="26"></property>
        <property name="gender" value="男"></property>
        <property name="clazz" ref="clazzOne"></property>
        <property name="clazz.cid" value="222"></property>
        <property name="clazz.cname" value="远大前程班"></property>
    </bean>

 相当于对此进行修改,

级联的方式,要保证提前为clazz属性赋值或者实例化

4.3内部bean

 <bean id="studentSix" class="com.rgf.spring.pojo.Student">
        <property name="sid" value="1004"></property>
        <property name="sname" value="赵四"></property>
        <property name="age" value="26"></property>
        <property name="gender" value="男"></property>
       <property name="clazz">
         <bean id="clazzInner" class="com.rgf.spring.pojo.Clazz">
             <property name="cid" value="2222"></property>
             <property name="cname" value="远大前程班"></property>
           </bean>
       </property>

我们测试如下:

 @Test
    public void  TestDI(){
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc.xml");
        Student student = ioc.getBean("studentSix", Student.class);
        System.out.println(student);
    }

我们运行之后如下所示:

 内部bean是否能在bean的内部来使用:

我们进行测试如下所示:

 @Test
    public void  TestDI(){
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc.xml");
        Clazz clazz = ioc.getBean("clazzInner", Clazz.class);
        System.out.println(clazz);
    }

运行之后我们发现出现了报错:NoSuchBeanDefinitionException

 所以内部bean只能在当前bean的内部使用,不能直接通过IOC容器来获取的。

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

package com.rgf.spring.pojo;

import java.util.Arrays;

public class Student implements Person {
    private  Integer sid;

    private String sname;

    private  Integer age;

    private  String gender;

    private  Double score;
    private  Clazz clazz;
    private  String[] hobby;

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    public Student() {
    }

    public Clazz getClazz() {
        return clazz;
    }

    public void setClazz(Clazz clazz) {
        this.clazz = clazz;
    }

    public Double getScore() {
        return score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", score=" + score +
                ", clazz=" + clazz +
                ", hobby=" + Arrays.toString(hobby) +
                '}';
    }

    public void setScore(Double score) {
        this.score = score;
    }

    public Student(Integer sid, String sname, String gender,Integer age) {
        this.sid = sid;
        this.sname = sname;
        this.gender = gender;
        this.age = age;
    }

    public Student(Integer sid, String sname, String gender,Double score) {
        this.sid = sid;
        this.sname = sname;
        this.gender = gender;
        this.score=score;
    }

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

}

我们载入如下bean:

  <bean id="studentSix" class="com.rgf.spring.pojo.Student">
        <property name="sid" value="1004"></property>
        <property name="sname" value="赵四"></property>
        <property name="age" value="26"></property>
        <property name="gender" value="男"></property>
       <property name="clazz">
         <bean id="clazzInner" class="com.rgf.spring.pojo.Clazz">
             <property name="cid" value="2222"></property>
             <property name="cname" value="远大前程班"></property>
           </bean>
       </property>
<!--字面量数值-->
        <property name="hobby">
            <array>
                <value>打球</value>
                <value>跑步</value>
                <value>运动</value>
            </array>
        </property>

我们测试之后如下所示:

 如果是类类型的数组,我们将如下所示:

 <property name="hobby">
            <array>
               <ref bean=""
            </array>
        </property>
<!--类类型的数组id放入即可-->

 6.依赖注入之为list集合类型的属性赋值

我们进行创建如下类:

package com.rgf.spring.pojo;

import java.util.List;

public class Clazz {
    private  Integer cid;
    private  String cname;
    private List<Student> students;

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    public Clazz() {
    }

    public Clazz(Integer cid, String cname) {
        this.cid = cid;
        this.cname = cname;
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "Clazz{" +
                "cid=" + cid +
                ", cname='" + cname + '\'' +
                ", students=" + students +
                '}';
    }
}

我们为集合载入bean:

 <bean id="clazzOne" class="com.rgf.spring.pojo.Clazz">
        <property name="cid" value="111"></property>
        <property name="cname" value="最强王者班"></property>
        <property name="students">
            <list>
                <ref bean="studentOne"></ref>
                <ref bean="studentTwo"></ref>
                <ref bean="studentThree"></ref>
            </list>
        </property>
    </bean>

我们所调用的bean内容如下:

<bean id="studentOne" class="com.rgf.spring.pojo.Student"></bean>

    <bean id="studentTwo" class="com.rgf.spring.pojo.Student">
        <property name="sid" value="1001"></property>
        <property name="sname" value="张三"></property>
        <property name="age" value="23"></property>
        <property name="gender" value="男"></property>
    </bean>

    <bean id="studentThree" class="com.rgf.spring.pojo.Student">
        <!--如果只有一个有参构造,则可以直接来为我们按照参数顺序进行赋值-->
        <!--利用有参构造对依赖进行注入所用标签为:constructor-arg-->
       <constructor-arg value="1002"></constructor-arg>
       <constructor-arg value="李四"></constructor-arg>
       <constructor-arg value="女"></constructor-arg>
        <constructor-arg value="24" name="age"></constructor-arg>
    </bean>

我们测试类如下所示:

 @Test
    public void  TestDI(){
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc.xml");
       Clazz clazz = ioc.getBean("clazzOne", Clazz.class);
        System.out.println(clazz);
    }

我们进行运行之后如下所示: 

 我们里面的集合类型的bean,如下所示:

  <bean id="clazzOne" class="com.rgf.spring.pojo.Clazz">
        <property name="cid" value="111"></property>
        <property name="cname" value="最强王者班"></property>
        <property name="students" ref="studentList"></property>
    </bean>
<!--配置一个集合类型的bean,需要使用util的约束-->
   <util:list id="studentList">
       <ref bean="studentOne"></ref>
       <ref bean="studentTwo"></ref>
       <ref bean="studentThree"></ref>
   </util:list>

我们继续进行测试,发现与我们所看到的一致:

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

 entry:在java中,表示的是一个类型,表示的是map集合里面的键和值。表示一个键值对。

key-ref:引用某一个bean作为键的值(键为类类型)

value:直接为value赋值(值为字面量)

(value-ref:引用某一个bean,来作为value值。(值为类类型)

key:键为字面量类型

我们所载入的bean如下所示:

 <bean id="studentFive" class="com.rgf.spring.pojo.Student">
        <property name="sid" value="1004"></property>
        <property name="sname" value="赵四"></property>
        <property name="age" value="26"></property>
        <property name="gender" value="男"></property>
        <property name="clazz" ref="clazzOne"></property>
        <property name="teacherMap">
          <map>
              <entry key="10086" value-ref="teacherOne"></entry>
              <entry key="10010" value-ref="teacherTwo"></entry>
          </map>
        </property>
    </bean>
    
    <bean id="teacherOne" class="com.rgf.spring.pojo.Teacher">
        <property name="tid" value="10086"></property>
        <property name="tname" value="大宝"></property>
    </bean>
    <bean id="teacherTwo" class="com.rgf.spring.pojo.Teacher">
        <property name="tid" value="10010"></property>
        <property name="tname" value="小宝"></property>
    </bean>

我们进行测试:

 @Test
    public void  TestDI(){
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc.xml");
       Student clazz = ioc.getBean("studentFive", Student.class);
        System.out.println(clazz);
    }

 我们利用另一种方法如下所示:

    <bean id="studentFive" class="com.rgf.spring.pojo.Student">
        <property name="sid" value="1004"></property>
        <property name="sname" value="赵四"></property>
        <property name="age" value="26"></property>
        <property name="gender" value="男"></property>
        <property name="clazz" ref="clazzOne"></property>
        <property name="teacherMap" ref="teacherMap"></property>
    </bean>
<util:map id="teacherMap" >
    <entry key="10086" value-ref="teacherOne"></entry>
    <entry key="10010" value-ref="teacherTwo"></entry>
</util:map>
 <bean id="teacherOne" class="com.rgf.spring.pojo.Teacher">
        <property name="tid" value="10086"></property>
        <property name="tname" value="大宝"></property>
    </bean>
    <bean id="teacherTwo" class="com.rgf.spring.pojo.Teacher">
        <property name="tid" value="10010"></property>
        <property name="tname" value="小宝"></property>
    </bean>

我们进行测试之后输出如下所示:

  8.依赖注入之p命名空间

p标签命名的时候需要如下约束:

xmlns:p="http://www.springframework.org/schema/p"

我们发现每个p都有两个值:

字面量使用p:不带ref进行赋值,p:带ref为赋值的是类类型的。 

我们所进行设计的代码如下所示:

  <bean id="studentSeven" class="com.rgf.spring.pojo.Student"
    p:sid="1005" p:sname="小明" p:teacherMap-ref="teacherMap">
    </bean>

我们运行之后如下所示:

 

 

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

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

相关文章

为kong网关添加限流插件

限流用于控制发送到上游服务的请求速率。 它可用于防止 DoS 攻击、限制网络抓取和其他形式的过度使用。 如果没有速率限制&#xff0c;客户可以无限制地访问您的上游服务&#xff0c;这可能会对可用性产生负面影响。 一、全局范围内的限流 1、启用限流 [rootmin ~]# curl -i…

AI落地:儿童节贺卡

昨天有个朋友Lisa找到我&#xff0c;她是幼儿园的老师&#xff0c;看到我最近搞了个爱落地星球&#xff0c;在研究各行各业AI落地的事情&#xff0c;问我能不能用AI帮她写一百多张贺卡。 说起来写贺卡&#xff0c;我只会写“节日快乐”。现在有了ChatGPT&#xff0c;那就大不一…

十六、多线程(中)

文章目录 一、线程互斥&#xff08;一&#xff09;四个概念1.临界资源2.临界区3.互斥特性4.线程互斥5.原子性 二、互斥&#xff08;一&#xff09;在执行语句的任何地方&#xff0c;线程可能被切换走&#xff08;二&#xff09;切换会保存上下文&#xff08;三&#xff09;抢票…

用HTML、CSS和JavaScript实现鼠标可交互的3D太阳和月亮切换效果

部分数据来源&#xff1a;ChatGPT 引言 太阳和月亮对于我们来说是一种常见的对比&#xff0c;这篇文章将介绍一个使用HTML、CSS和JavaScript创建的网页场景&#xff0c;能够把太阳和月亮切换展示给用户。这个场景能够让用户使用鼠标和滚轮与场景互动&#xff0c;带来更多的趣…

解锁Qt QListWidget的全部潜力——用最佳实践和技巧赢得用户的喜爱和赞誉!

文章目录 前言一、属性和方法添加列表项获取当前选中的列表项删除列表项列表显示模式交替背景色 二、信号与槽选中的行数变化item被点击 三、解决icon图标模式下图标不对称的问题1、设置属性2、面向结果的手动换行 总结 前言 在现代的GUI应用程序中&#xff0c;列表框是必不可…

什么是千兆光模块和万兆光模块?它们有什么区别?

众所周知千兆光模块和万兆光模块的主区别在于它们的传输速率不一样&#xff0c;那你还知道千兆光模块和万兆光模块的其他区别吗&#xff1f;接下来海翎光电的小编将对千兆光模块和万兆光模块的区别进行详细解析。 什么是千兆光模块&#xff1f; 千兆光模块即传输速率为1000Mbps…

Java之路:构建坚实基础,系统学习Java技术的终极指南

无论是初学者还是有经验的专业人士&#xff0c;在学习一门新的IT技术时&#xff0c;都需要采取一种系统性的学习方法。作为一名Java技术er&#xff0c;下面我将介绍我是如何系统的学习Java技术的。 一、Java技术介绍 Java是一种广泛应用于软件开发的高级编程语言&#xff0c;…

数据链路层:点对点协议PPP

数据链路层&#xff1a;点对点协议PPP 笔记来源&#xff1a; 湖科大教书匠&#xff1a;点对点协议PPP 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 数据链路层只负责直接相连的两个结点之间的通信 PPP是点对点数据链路层协议 用户通过ISP接入因特…

sklearn实现余弦相似度计算

from sklearn.metrics.pairwise import cosine_similarity cosine_similarity() 这个函数的输入是 n 个长度相同的 list 或 array 函数的处理是计算这 n 个 list 两两之间的余弦相似性 最后生成的是一个 n*n 的相似性矩阵s&#xff0c;s[i][j] 表示输入中第 i 个和第 j 个元…

如何在 Ubuntu Linux 上使用 SNAP 安装 Docker?

Docker 是一种开源的容器化平台&#xff0c;它允许开发人员将应用程序和其依赖项打包到一个可移植的容器中&#xff0c;以便在不同的环境中运行。在 Ubuntu Linux 上&#xff0c;我们可以使用 SNAP&#xff08;一种软件包管理系统&#xff09;来安装和管理 Docker。本文将详细介…

ProtoBuf 语法(一)

系列文章 ProtoBuf 语法&#xff08;二&#xff09; ProtoBuf 语法&#xff08;三&#xff09; 文章目录 前言一、字段规则二、消息类型的定义与使用2.1 定义2.2 使用 三、enum 类型3.1 定义规则3.2 注意事项 四、any 类型4.1 类型说明4.2 类型使用 五、oneof 类型六、map 类型…

HACKER KID: 1.0.1实战演练

文章目录 HACKER KID: 1.0.1实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、扫描目录4、查看源码5、请求参数6、burpsuite批量请求7、编辑hosts文件8、DNS区域传输9、编辑hosts10、访问网站11、注册账号12、burpsuite抓包13、XML注入14、解密15、登录网…

供应链对于小程序、app等平台能带来什么好处?

供应链对于小程序、 app等平台的重要性不言而喻&#xff0c;这是一个企业生存的根本&#xff0c;只有保证了供应链&#xff0c;才能获得足够的产品和服务&#xff0c;保证企业能够长期稳定发展。因此很多企业都开始重视供应链&#xff0c;同时也在为之努力。 那么&#xff0c;…

gradle环境的spring boot搭建

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

tensorrt yolov7 推理

参考 源码修改如下&#xff1a;如果将源代码cpp/norm/yolo.hpp修改为自己训练的数据时修改如下&#xff1a; class YOLO{ const char* INPUT_BLOB_NAME "images"; const char* OUTPUT_BLOB_NAME "output"; }根据自己转换onnx模型采用netron打开查看 输入…

(2022,MoCA)Few-shot 图像生成的原型记忆(Prototype Memory)和注意力机制

Prototype Memory and Attention Mechanisms for Few Shot Image Generation 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1 原型记忆学习 3.2 记忆概念注意力&#xff08;MEMORY CONCEPT ATTENTION&#xff0c;MoCA&#xff09; 3.3 空间上…

自平衡二叉树(AVL)及四种旋转方式详解

推荐可视化插入、删除节点的二叉树网站&#xff1a;AVL Tree Visualzation (usfca.edu) 1. 概述 AVL树是一种自平衡二叉搜索树&#xff0c;他是搜索二叉树(BST)的优化&#xff0c;它在每次插入或删除操作后&#xff0c;通过旋转节点来保持树的平衡性。AVL树的平衡条件是任意节…

代码随想录算法训练营第三十八天 | 力扣 509. 斐波那契数, 70. 爬楼梯, 746. 使用最小花费爬楼梯

509. 斐波那契数 题目 509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(…

几种经典算法

1.分治法 分治法也叫做分而治之法。核心思想是将一个难以直接解决的大问题依照相同的概念分割成两个或者多个相同的小问题&#xff0c;以便各个击破。 如图所示&#xff1a; 2.递归法 递归法和分而治之法像一对孪生兄弟&#xff0c;都是将一个复杂的算法问题进行分解&#x…

【JAVAWEB】CSS

目录 1.CSS是什么 2.基本语法规范 3.引入方式 3.1内部样式表 3.2行内样式表 3.3外部样式 4.代码风格 4.1样式风格 4.2样式大小写 4.3空格规范 5.选择器 5.1选择器的功能 5.2选择器的种类 1.基础选择器 2.复合选择器 6.常用元素属性 6.1字体属性 设置字体font-…