《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系列博客

单例模式的各种实现

1746
来自专栏java达人

运用适配器模式应对项目中的变化

作者:张纪刚 链接: http://blog.csdn.net/zhangjg_blog/article/details/18779607 (点击文末阅读原文...

1897
来自专栏恰同学骚年

设计模式的征途—3.工厂方法(Factory Method)模式

上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代...

642
来自专栏Java学习之路

09 Spring框架 AOP (二) 高级用法

上一篇文章我们主要讲了一点关于AOP编程,它的动态考虑程序的运行过程,和Spring中AOP的应用,前置通知,后置通知,环绕通知和异常通知,这些都是Spring...

3535
来自专栏Kirito的技术分享

深入理解RPC之序列化篇--总结

上一篇《深入理解RPC之序列化篇--Kryo》,介绍了序列化的基础概念,并且详细介绍了Kryo的一系列特性,在这一篇中,简略的介绍其他常用的序列化器,并对它们进...

7637
来自专栏技术点滴

适配器模式(Adapter)

适配器模式(Adapter) 适配器模式(Adapter)[Wrapper] 意图:将类的一个接口转换成用户希望的另一个接口,使得原本由于接口不兼容而不能一起工...

1749
来自专栏ImportSource

Spring5以来注册Bean的各种姿势,特别最后的纯编码注册值得尝试

各位好,今天我们的内容是有关Spring 5以来有关注册bean的几种方式。前面两三个是比较常用的方式,最后两种是只有在特殊的场合下才会被用到和想到。我们会分别...

6166
来自专栏java一日一条

面试中问的话题Spring工作原理

Spring工作原理 内部最核心的就是IOC了, 动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射 反射其实就是在...

674
来自专栏ImportSource

设计模式-抽象类,只是想为你做更多

如果说面向对象中的接口是把所有的事情扔给你的话,那么抽象类显然是想要为你做一些事情,如果实在有一部分做不了再扔给你。 相信对于大部分业务开发的场景下都不太会需要...

2907
来自专栏竹清助手

谈谈模板方法设计模式的使用

在项目中经常会遇到一个类的某些方法和另一个类的某些方法功能是相同的,只有部分方法是不同的。这个时候就可以使用模板方法来操作了。其实这种情况很常见:比如我们项目里...

914

扫码关注云+社区