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
以上就是两种注入方法 (未完待续)
04 Spring框架 依赖注入(一)的更多相关文章
- 04 Spring的依赖注入
依赖注入:Dependency Injection.它是 spring 框架核心 ioc 的具体实现. 我们的程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖 ...
- 07 Spring框架 依赖注入(四)基于注解的依赖注入
前面几节我们都在使用xml进行依赖的注入,但是在实际的开发中我们往往偏爱于使用注解进行依赖注入,因为这样更符合我们人的思维,并且更加快捷,本节就来讲述Spring基于注解的依赖注入: 信息注入注解 @ ...
- 05 Spring框架 依赖注入(二)
上一节我们讲了三种信息的注入,满足一个类的属性信息的注入,但是如果我们需要向一个实例中注入另一个实例呢?就像我们创建一个学生类,里边有:姓名,性别,年龄,成绩等几个属性(我习惯把类的域叫做属性),但是 ...
- spring框架——依赖注入
依赖注入:DI 又称控制反转:IoC 项目名字spring_DI 一.implement包中定义了两个接口Food和Person 1.接口Food package org.interfaces; pu ...
- 06 Spring框架 依赖注入(三)多配置文件
在Spring前几节的学习中我们都使用了一个配置文件,就像struts2中可以包含其他的配置文件,我们能不能使用多个配置文件呢(在工程比庞大,配置比较多的时候)? Spring多配置文件分为两种: 平 ...
- Spring.NET依赖注入框架学习--实例化容器常用方法
Spring.NET依赖注入框架学习---实例化容器常用方法 本篇学习实例化Spring.NET容器的俩种方式 1.通过XmlObjectFactory创建一个Spring.NET容器 IResour ...
- Spring.NET依赖注入框架学习--简单对象注入
Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...
- Spring.NET依赖注入框架学习--简介
Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入. ...
- Spring.NET依赖注入框架学习--入门
Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...
随机推荐
- placeholder 不支持进行兼容处理
;(function () { //全局ajax处理 $.ajaxSetup({ complete: function (jqXHR) {}, data: { }, error: function ( ...
- c++ 用namespace实现java的package的功能
以前喜欢这样组织文件: myproject/src/moduleA放moduleA的所有cpp文件 myproject/include/moduleA放moduleA的所有h文件 对moduleB.C ...
- codeblocks中右键源文件没有Rename选项?
那是因为你右击的那个文件已经被CB的编辑器打开,关闭即可,你就能看到Rename选项了. 或者更简单,翻到Files那一栏,然后右击某个文件夹选择"Make root"即可,就跟w ...
- 树莓派、 Arduino 、传统单片机开发板该如何选择?
几十年前的电子爱好者,最喜欢的就是电烙铁.面包板和收音机:十几年前,出现了单片机,于是玩具就成了电烙铁.面包板和单片机:到了2015年,贴片技术的不断普及,让面包板不再那么有用武之地,经济的发展也让现 ...
- IOS MagicRecord 详解 (转载)
2014-10-22 14:37 6137人阅读 评论(6) 收藏 举报 IOSMagicRecordCoreData 目录(?)[+] 刚开始接触IOS不久,尝试着翻译一些博客,积累技术,与大家共享 ...
- (C#)System.Security.SecureString(表示应保密的文本)
正常的String类型值,在脱离开作用域之后,其值在内存中并不会被立即销毁,这时如果有人恶意扫描你的内存,程序中所保存的机密信息就会暴露;于是就有了System.Security.SecureStri ...
- php对gzip文件或者字符串解压实例参考
要采集一个网站,目标站采用了gzip压缩传输网页,本来应该只要发送一个http头 Accept-Encoding: identity或者干脆不发送这个头等,就可以使目标站返回没有经过gzip压缩的页面 ...
- 第二百零二节,jQuery EasyUI,Layout(布局)组件
jQuery EasyUI,Layout(布局)组件 学习要点: 1.加载方式 2.布局属性 3.区域面板属性 4.方法列表 本节课重点了解 EasyUI 中 Layout(布局)组件的使用方法,这个 ...
- 探讨把一个元素从它所在的div 拖动到另一个div内的实现方法
故事背景: 接到一个新需求,要求用vue搞,主要是拖动实现布局,关键点有:单个组件拖动,一行多列里面的组件拖动, 单个组件可以拖入一行多列里, 单个组件的拖动好实现,关键是把一个组件拖动到另一个类似 ...
- c++通过类名动态创建对象
转载:http://www.seacha.com/article.php/knowledge/cbase/2013/0615/2154.html 主要思想:在每次创建类的过程中,通过各自类的辅助类(所 ...