《Java从入门到放弃》框架入门篇:spring中IOC的注入姿势

IOC到底是个什么东东呢?控制反转(Inversion of Control,英文缩写为IoC),其实就是这个东东。

你随便百度一下就会得到比较书面的解释:通过引入实现了IoC模式的IoC容器,即可由IoC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。

说了这么多,通过一个例子就能很好的来理解。以前小王要找对象,要么云茫茫人海中进行匹配(通过 小王.对象=小张 这样的语法进行关联),要么通过3D打印直接打印出心中女神的样子(通过new实例化),而现在,只要到51CTO婚介中心去注册,同时提出自己的要求,51CTO婚介中心就会在所有的注册用户中进行匹配,如果有匹配上的就安排小王去相亲。

这儿的51CTO婚介心中就相当于是IOC容器,同时,因为有了中介(Ioc容器),找对象是不是变得非常简单了(很多事情不用小王自己去处理)。

解释完毕,接下来介绍spring中的IOC,其注入方式有以下三种:

  1. 属性注入(set注入)
  2. 构造器注入(构造方法注入)
  3. 工厂注入(很少使用,你如果非要用····,那就自己搞定吧,哈哈)

接下来,有请代码君上场!

(的写代码前记得导入spring相关Jar包)

一、属性注入

    属性注入有两种情况,一种是Java基本数据类型,一种是自定义类型,具体代码请往下看:

    1.1) 编写Song实体类

    //歌曲类
    public class Song {
	private int songID;		//歌曲ID
	private String songName;	//歌曲名
	private String songType;	//歌曲类型

	public Song() {	}
	public Song(int songID, String songName, String songType) {
		this.songID = songID;
		this.songName = songName;
		this.songType = songType;
	}

	public int getSongID() {
		return songID;
	}
	public void setSongID(int songID) {
		this.songID = songID;
	}
	public String getSongName() {
		return songName;
	}
	public void setSongName(String songName) {
		this.songName = songName;
	}
	public String getSongType() {
		return songType;
	}
	public void setSongType(String songType) {
		this.songType = songType;
	}
    }

    1.2) 在spring配置文件中注入bean对象

<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

	<bean id="yjm" class="com.pxy.entity.Song">
		<property name="songID" value="10086"></property>
		<property name="songName" value="一剪梅"></property>
		<property name="songType" value="经典老歌"></property>
	</bean>
</beans>

    1.3) 创建Test类进行测试(简单点,普通类包含main方法就行)

public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    Song song = applicationContext.getBean("yjm", Song.class);
    System.out.println("歌曲名:"+song.getSongName());
    System.out.println("歌曲类型:"+song.getSongType());
}

    1.4) 显示结果如下:

以上是基本数据类型的注入写法,如果包含自定义类型,则做如下修改:

    1.5) 添加Singer实体类

public class Singer {
    private int singerID;     	//歌手ID
    private String singerName;	//歌手姓名
    private String area;      	//所属地区
    
    public int getSingerID() {
        return singerID;
    }
    public void setSingerID(int singerID) {
        this.singerID = singerID;
    }
    public String getSingerName() {
        return singerName;
    }
    public void setSingerName(String singerName) {
        this.singerName = singerName;
    }
    public String getArea() {
        return area;
    }
    public void setArea(String area) {
        this.area = area;
    }
}

    1.6) 在Song类中添加Singer属性

//歌曲类
public class Song {
        //之前代码省略...
        
        //新增代码
	private Singer singer;		//对应歌手

	public Singer getSinger() {
		return singer;
	}
	public void setSinger(Singer singer) {
		this.singer = singer;
	}
}

1.7) 修改配置文件,添加Singer对象,并在Song对象中使用 ref 进行引用

        <!-- 创建Singer对象fyq -->
	<bean id="fyq" class="com.pxy.entity.Singer">
		<property name="singerID" value="10000"></property>
		<property name="singerName" value="费玉清"></property>
	</bean>
	<!-- 创建Song对象yjm -->
	<bean id="yjm" class="com.pxy.entity.Song">
		<property name="songID" value="10086"></property>
		<property name="songName" value="一剪梅"></property>
		<property name="songType" value="经典老歌"></property>
		<!-- 使用ref引用上面的bean -->
		<property name="singer" ref="fyq"></property>
	</bean>

    1.8) 修改测试类并查看结果

public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    Song song = applicationContext.getBean("yjm", Song.class);
    System.out.println("歌曲名:"+song.getSongName());
    System.out.println("歌曲类型:"+song.getSongType());
    System.out.println("歌手:"+song.getSinger().getSingerName());
}

属性注入的方式到这儿就告一段落....

二、构造器注入

前面我们已经在Song类中编写了构造方法Song(int songID, String songName, String songType),接下来,我们直接在spring配置文件中通过构造器方式来注入看看效果。

    2.1) 在spring配置文件中注入bean对象

<bean id="jht" class="com.pxy.entity.Song">
    <constructor-arg index="0" value="10088"></constructor-arg>
    <constructor-arg index="1" value="菊花台"></constructor-arg>
    <constructor-arg index="2" value="流行歌曲"></constructor-arg>
</bean>

    2.2) 在Test类中查看效果

public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    Song song = applicationContext.getBean("jht", Song.class);
    System.out.println("歌曲名:"+song.getSongName());
    System.out.println("歌曲类型:"+song.getSongType());
}

今天的内容就到这儿,感谢各位看官百闲中无聊逛到这儿并且还看完了!!!

最后,请各位看官离开前点个赞,如果实在没别的事做,顺便评论两句...

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构师之旅

【强烈推荐】Java工程师如何从一名普通的码农成长为一位大神

本文源自 http://www.hollischuang.com/archives/489 写在前面 java作为一门编程语言,在各类编程语言中...

2908
来自专栏racaljk

《代码整洁之道》摘录总结

1.     以下全部条款源于·<Clean Code Robert.C.Martin>Chapter 17,这里对其进行文字层面的加工,简化,便于以后能短时浏...

993
来自专栏WeTest质量开放平台团队的专栏

低于0.01%的极致Crash率是怎么做到的?

4594
来自专栏Java开发者杂谈

For update带来的思考

​ 之所以想写这个专题,是因为最近在做一个抢占任务的实现。假设数据库很多个任务,在抢占发生之前任务的状态都是FREE。现在假设同时有一堆抢占线程开始工作,抢占线...

1333
来自专栏水击三千

UML学习-状态图

1.状态图概述 状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(E...

28310
来自专栏何俊林

Android Multimedia框架总结(九)Stagefright框架之数据处理及到OMXCodec过程

不知不觉到第九篇了,感觉还有好多好多没有写,路漫漫其修远兮 ,吾将上下而求索。先说福利吧,此前在关于我, ? 曾说过,不定期搞活动,vip,书啥的,都可以有,...

2496
来自专栏安恒网络空间安全讲武堂

浙江省首届网络安全大赛决赛Write Up

直接打开pwd.docx,发现是空的,那么将其作为zip 解压,在其中找到了一张二维码

1672
来自专栏精讲JAVA

详述 PO VO BO DTO DAO 和 POJO 的概念及区别

 说实话,我相信对于刚接触 PO、VO、BO、DTO、DAO 和 POJO 这些概念的同学来说,大都会有一种“这都是什么鬼?”的感觉,可谓是云里雾里,不知今...

1402
来自专栏精讲JAVA

详述 PO VO BO DTO DAO 和 POJO 的概念及区别

 说实话,我相信对于刚接触 PO、VO、BO、DTO、DAO 和 POJO 这些概念的同学来说,大都会有一种“这都是什么鬼?”的感觉,可谓是云里雾里,不知今...

1785
来自专栏怀英的自我修炼

Java漫谈3

上次我们说道Java中的Hello World(以下简称HW)是什么样子的,还写了一段HW的输出程序。不知道你是否会有疑问,难道在Java的环境中只要输入这一句...

36711

扫码关注云+社区

领取腾讯云代金券