04 Spring框架 依赖注入(一)

整理了一下之前学习spring框架时候的一点笔记。如有错误欢迎指正,不喜勿喷。 上一节我们讲了几个bean的一些属性,用来限制我们实例创建过后的状态。 但是细心的我们会发现其实上面demo创建的实例并不完整,对象创建出来过后只有一个方法,而没有包含其他信息(如属性)。 之前我们说了Spring的核心是IOC,这是使用Spring其他组件的前提条件。这里我们做一下补充:Spring依赖IOC,而IOC依赖注入。 什么是注入? 注入就是在Spring主配置文件bean中添加一些信息使得新创建的实体类能够带有属性值(这里的属性值可以是其他实例的对象)。 接下来就该看看注入有哪些方法了。注入一共有三种: ①setter注入 ②构造器注入 ③接口注入 第一种使用的比较频繁,其他两种尤其是第三种几乎不会使用。所以我们只讲前两种。 首先来讲setter注入: 在主配置文件中即applicationContext.xml中:

<!--set注入  -->

</bean>
<bean id="c2" class="com.Spring.Demo.Computer">
<property name="cpu" value="高通骁龙"></property>
<property name="hdd" value="希捷"></property>
<property name="mainbord" value="华硕"></property>
</bean >

这个就是bean的内容了,相比之前有了一点变化多了三项propertiy,里边包含name值和value值。这个是applicationContext.xml中的变化。 接下来实体类也同样需要变化一下:

实体类Computer:

package com.Spring.Demo;
//set注入
public class Computer {
    private String cpu;
    private String hdd;
    private String mainbord;
    public void execute(){
        System.out.println("cpu:"+cpu);
        System.out.println("hdd:"+hdd);
        System.out.println("mainbord:"+mainbord);
        
    }
    public String getCpu() {
        return cpu;
    }
    public void setCpu(String cpu) {
        this.cpu = cpu;
    }
    public String getHdd() {
        return hdd;
    }
    public void setHdd(String hdd) {
        this.hdd = hdd;
    }
    public String getMainbord() {
        return mainbord;
    }
    public void setMainbord(String mainbord) {
        this.mainbord = mainbord;
    }
}

对,这个实体类相比之前多了三个属性,同时增加了setter和getter方法和系统输出方法(系统输出方法是用来测试显示实例是否成功用的),其中setter方法是必须的,getter方法只是顺带添加了,以防备后边会用到。 接下来我们测试一下:

package com.Spring.Demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//set注入
public class TestComputer {
    public static void main(String[] args){
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        Computer c2=(Computer)ac.getBean("c2");
        c2.execute();
    }

}

控制台输出:

cpu:高通骁龙
hdd:希捷
mainbord:华硕

这样我们就把computer的信息注入进来了(是不是很神奇?)。

但是我们注入的要是一个引用类型的值怎么办? 例如一本书,它有一个书名,书号,出版社,但是出版社是一个引用类型(包含出版社名,出版社地址)。这样的情况我们怎么办呢? 看下面的示例:

    <bean id = "book" class = "com.testSpring.Book">
        <property name = "bname" value = "Java技术"></property>
        <property name = "bnumber" value ="201410185732" ></property><!--通过使用ref来注入引用类型-->
        <property name = "bpub" ref = "publisher"></property>
    </bean>
    
    <bean id = "publisher" class="com.testSpring.publisher">
        <property name="name" value="清华大学出版社"></property>
        <property name="address" value="xxxx"></property>
    </bean>
package com.testSpring;

public class Book {
    private String bname;
    private String bnumber;
    private publisher bpub;
    
    public void setBname(String bname) {
        this.bname = bname;
    }
    public void setBnumber(String bnumber) {
        this.bnumber = bnumber;
    }
    public void setBpub(publisher bpub) {
        this.bpub = bpub;
    }
    @Override
    public String toString() {
        return "Book [bname=" + bname + ", bnumber=" + bnumber + ", bpub=" + bpub + "]";
    }
}
package com.testSpring;

public class publisher {
    String name;
    String address;
    public void setName(String name) {
        this.name = name;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "publisher [name=" + name + ", address=" + address + "]";
    }
}
//测试(JUnit)
public class test {
    @Test
    public void Test01() {
        String resource = "com/testSpring/applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
        Book book = (Book)ac.getBean("book");
        System.out.println(book);
    }
}

控制台输出:

Book [bname=Java技术, bnumber=201410185732, bpub=publisher [name=清华大学出版社, address=xxxx]]

以上就是我们通过使用ref来注入引用类型


下面我们接着看构造器注入: 同理,先上主配置文件代码:

<!--构造器注入  -->
<bean id="c3" class="com.Spring.Demo.phone">
<constructor-arg index="0" value="高通骁龙"></constructor-arg>
<constructor-arg index="1" value="2G"></constructor-arg>
</bean>

这里的index是序号(记住是从0开始)。value为值。 当然我们这里的index也可以直接使用name指定,同时也可以省略,但是顺序上要和我们的类构造器要一致(不推荐,可读性差)

接下来是实体类代码:

package com.Spring.Demo;

public class phone {
    private String cpu;
    private String ram;
    public phone(String cpu,String ram){
        this.cpu=cpu;
        this.ram=ram;   
    }
    public void show(){
        System.out.println("cpu:"+cpu);
        System.out.println("ram:"+ram);
        
    }
}

从中我们可以看出这个实体类多了一个构造器对新建实例进行初始化。 接下来进行测试:

package com.Spring.Demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestPhone {
    public static void main(String[] args){
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        phone c3=(phone)ac.getBean("c3");
        c3.show();
        
        
    }

}

控制台输出:

cpu:高通骁龙
ram:2G

以上就是两种注入方法 (未完待续)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

Spring Boot中Web应用的统一异常处理

我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况。Spring Boot提供了一个默认的映射: /error,当处理中抛出异常之后,会转到该请求...

2926
来自专栏北京马哥教育

快收藏! 30 分钟包你学会 AWK

本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章 AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行...

3147
来自专栏Hongten

java开发_UUID(Universally Unique Identifier,全局唯一标识符)和GUID(Globally Unique Identifier,全球唯一标识符)

GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifie...

1061
来自专栏阿杜的世界

Spring实战3:装配bean的进阶知识主要内容:

在装配bean—依赖注入的本质一文中,我们探讨了Spring的三种管理bean的方式:自动装配、基于JavaConfig、基于XML文件。这篇文字将探讨一些Sp...

802
来自专栏Coding+

Gradle 的文件操作

是的你没有看错,任务中的4个问题就用上面这20几行代码轻松解决;但是,你可能还是不太清楚这些这些配置的规则,它们看上去就像一堆键值对类似于Json,然而实际上它...

2762
来自专栏北京马哥教育

快收藏! 30 分钟包你学会 AWK

本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章 AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行...

1973
来自专栏Android群英传

掌控 Android Gradle

1132
来自专栏Java与Android技术栈

从API到DSL —— 使用 Kotlin 特性为爬虫框架进一步封装

NetDiscovery 是一款基于 Vert.x、RxJava 2 等框架实现的爬虫框架。

1714
来自专栏日常分享

DAO设计模式的理解

它可以实现业务逻辑与数据库访问相分离。相对来说,数据库是比较稳定的,其中DAO组件依赖于数据库系统,提供数据库访问的接口。

1652
来自专栏闻道于事

Spring框架(二)反射机制, 注入, 单例模式, 自动装载, 延迟加载

 Spring反射机制: 1, 通过spring来获取一个对象的实例 1 <bean id="user" class="com.model.User">...

6688

扫码关注云+社区

领取腾讯云代金券