Spring路上的小学习

IOC的技术实现:

DI: DI是IOC的技术实现。

DI: 依赖注入,只需要在程序中提供要使用的对象名就可以了,至于如何在容器中创建
、赋值、查找都有容器内部来实现

Spring时使用DI实现了IOC的功能,Spring底层创建对象使用的是反射机制

Spring 是一个容器,管理对象、给对象赋值,底层是反射机制

实现步骤:

  1. 创建Maven项目
  2. 加入maven的依赖:
    Spring的依赖,
    junit的依赖
  3. 创建类(接口和他的实现类)
    和没有使用框架一样,就是普通类
  4. 创建Spring需要使用的配置文件
    声明类的信息,这些类由Spring创建和管理
  5. 测试Spring创建的

告诉Spring 创建对象:
声明bean ,声明bean讲就是告诉Spring要创建某个类的对象
id: 对象的名称的自定义名称,且为唯一值,Spring通过这个名称找到这个对象
class: 类的全限定名称(不能是接口,因为Spring是通过反射机制创建对象的,不需使用类)

Spring 就完成SomeServlet someServlet=new SomeService();
一个Bean标签声明一个对象
例如:


Spring配置文件:

  1. beans:是跟标签,Spring把Java对象称为beans
  2. Spring-beans.xsd誓约书文件,和mybatis指定、dtd是一样的

Spring的创建时期

在容器的时候时就已经创建了这个对象

public class mySpring {
     

    @Test
    public void kda(){
     
        String a="bean.xml";
        ApplicationContext ac=new ClassPathXmlApplicationContext(a);
        Spring_A a2=(Spring_A) ac.getBean("Hello");
        a2.kda();
    }
}


//输出结果为:
//午餐
//01

说明文件在ApplicationContext时期就已经创建了,而生成的
01
则是调用其方法 doSome而生成的

其他的方法:

获取容器中定义对象的数量:
//int d=ac.getBeanDefinitionCount();
获取从容器中对象的名称
//        
//        //此处获得的是一个数组,类型为String
//        String[] e=ac.getBeanDefinitionNames();
//        //高级for循环进行循环,打印出数组
//        for (String kda:e){
     
//        System.out.println(kda);
//        }

单元测试——junit:

创建方法:
1.public方法
2.没有返回值 void
3.名称自定义,但是不能有返回值
上有@Test

Spring能够创建一个非自定义类,需要这个类存在

在Spring的配置文件中,给Java对象的属性进行赋值,

DI:依赖注入,表示创建对象,给属性赋值。
DI的两种实现方法:

  1. 在Spring配置文件中使用标签和属性进行完成,被称为基于XML的DI实现
  2. 使用Spring的注解,完成属性的赋值,被称为基于注解的DI实现

DI的语法分类:

  1. Set注入(设置注入):Spring调用类的Set方法,在Set方法中可以实现属性的赋值

    (80%都是通过此种方法实现的)这种方法直观、简单,因此在Spring中大量使用。
        
    
    Set注入方法确实十分的好用,但是存在一个弊端,当我们使用Set注入的时候,不存在Set方法时,就会发生报错
    同时我们需要明白的是,这个方法起使在赋值的时候就已经存在了

    此外我们需要明确的是:这个方法不是必须是真正意义的set方法,换句话说,就是只要含有set这个词就能够使用set注入的方法
    而且,不会发生报错

此外,Set注入还有另一种方法:引用Set注入方法:
所谓的引用Set注入方法,根据名字可以看出,其实就是进行了引用

<beans>
    <bean id="adc" class="com.***.ADC">
        <property name="name" value="KDA"/>
        <property name="School" ref="MySchool"/>
    bean>
    <bean id="MySchool" class="com.***.School">
        <property name="name" value="哈佛大学"/>
        <property name="address" value="哈尔滨"/>
    bean>
    
beans>
  1. 构造注入:Spring调用类的有参数构造方法,创建对象,在构造方法中完成赋值。
    构造注入的形式与Set注入的方法相似,但是它使用的标签与其不同,它所使用的标签是
    constructor-arg标签在这种标签中存在这三种形式
    1. name属性:这种属性的使用方法和Set注入用法相同,用于指定是哪一个
    2. index属性: 这个属性从0开始,类似于数组的形式,这个表示是哪一个参数或者说是第几个参数
    3. 省缺方式: 直接不用name、index 标签,他们所表示的其实还是index方式,默认的第一个为0,以此类推
<beans>

    <bean id="kda" class="wxk.School">
        <constructor-arg name="name" value="清华大学"/>
        <constructor-arg name="address" value="河南郑州"/>
        <constructor-arg name="args" value="2000000"/>

    bean>

    <bean id="kda" class="wxk.School">
        <constructor-arg index="0" value="清华大学"/>
        <constructor-arg index="1" value="河南郑州"/>
        <constructor-arg index="2"  value="2000000"/>

    bean>

    <bean id="kda" class="wxk.School">
        <constructor-arg  value="清华大学"/>   
        <constructor-arg  value="河南郑州"/> 
        <constructor-arg  value="2000000"/> 

    bean>

beans>

##自动注入
当我们的需要赋的值十分多时,重复的代码显得十分冗长,这会使我们的代码利用效率低下,这时候我们采用自动注入的方法
那么 这个该怎么实现自动注入呢?


自动注入分为两种,一种为 byName,一种为byType
###byName
byName的用法十分简单,就是你需要创建一个bean根标签,要求是这个根标签的id和属性的名称一样
,此外还需要我们的class指向相应的位置。此外,包含这个对象的需要在bean标签上加上 autowire=“byName”


这里我以一个对象为例,我需要对一个对象进行赋值,我使用的是byName自动注入的方法


这是一个单独的对象

public class Test{
     
    private String name;
    private String sex;
    private int age;

    public void setName(String name) {
     
        this.name = name;
    }

    public void setSex(String sex) {
     
        this.sex = sex;
    }

    @Override
    public String toString() {
     
        return "Test{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }

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

这是一个类,包含他的toString方法

public class Test01 {
     
    private Test test;
    private int a;

    public void setA(int a) {
     
        this.a = a;
    }

    public void setTest(Test test) {
     
        this.test = test;
    }
    public void k(){
     
        System.out.println(test.toString());
    }
}

接下来是咱们的xml文件


<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="kda" class="byName.Test01" autowire="byName">
    <property name="a" value="2"/>

bean>
    <bean id="test" class="byName.Test">
        <property name="sex" value=""/>
        <property name="age" value="99"/>
        <property name="name" value="KDA"/>
    bean>
beans>

这样子就完成了他的byName赋值,其原理是 当发现类中的一个变量未进行赋值,就会在xml文件中查询,当找到id与其相同且路径也相同的,就把他的值付给他
###byType
byType–按类型注入,这种方法按照他们的类型进行自动注入,与byName的用法相似


我们首先得明白这个同源关系:

  1. 同一个类
  2. 互为父子类
  3. 接口与其实现类

方法遇上相似,知识把autowire改为byType,且 下面的id不需要和变量中的相同


我们需要注意的是,在使用这个方法的时候,我们只能有一个符合要求,如果多个符合要求,则会报错,如果一个都没有,则会报空指针的错

你可能感兴趣的:(自我提升,spring)