在这篇中,我学习了依赖注入的两种方式:设值注入和构造注入。

  在我们以前的思维中,如果调用一个类时,我们都需要将其手动实例化,当我们创建被调用的工作不需要我们完成时,这就是控制反转,当这个将被调用的实例过程被Spring完成,并注入调用者时,这就是依赖注入。

  一、先来学习学习设值注入:

  我们先来新建两个接口规范,分别命名为Computer.java 和 Key.java,其路径均在com.sep.basic.service包下:

  Computer.java代码如下:

 package com.sep.basic.service;

 public interface Computer {
public void useKey();
}

  Key.java代码如下:

 package com.sep.basic.service;

 public interface Key {
//一个方法
public String print();
}

  接下来写两个实现类,分别命名为Lenovo.java和LogiTech.java,分别实现Computer和Key接口,路径放在com.sep.basic.service.impl包下。

  Lenovo.java代码如下:

 package com.sep.basic.service.impl;

 import com.sep.basic.service.Computer;
import com.sep.basic.service.Key; public class Lenovo implements Computer{
private Key key; public Key getKey() {
return key;
} //设值注入所需的setter方法
public void setKey(Key key) {
this.key = key;
} //实现Computer接口中使用键盘的属性
public void useKey() {
System.out.println(key.print());
} }

  LogicTech.java的代码如下:

 package com.sep.basic.service.impl;

 import com.sep.basic.service.Key;

 public class LogiTech implements Key{
//实现Key接口中打印方法
public String print() {
return "用键盘打字";
} }

  接下来我们配置applicationContext.xml文件,在其中加入如下代码:

     <!-- 将配置Lenovo实例 -->
<bean id="lenovo" class="com.sep.basic.service.impl.Lenovo">
<!-- 将logicTech实例注入到key属性 -->
<property name="key" ref="logicTech"></property>
</bean>
<!-- 将配置LogicTech实例 -->
<bean id="logicTech" class="com.sep.basic.service.impl.LogicTech"></bean>

  ok,接下来回到我们之前测试用的主方法,SpringTest中,在其中加入如下代码:

//通过Spring来完成注入
Lenovo lenovo = ctx.getBean("lenovo", Lenovo.class);
lenovo.useKey();

  现在运行,可以看到控制台输出“用键盘打字”。

  在applicationContext.xml中<bean>标签中的id为bean的唯一标识,class为对应的需要实例化的类的地址。

  通过写在SpringTest中代码可以看出我们调用的lenovo类,我们并没有手动实例化,而且其中调用的key,我们也没有做过多余的操作,所有的工作都是spring帮我们完成的,它通过配置文件,不仅仅创建了我们的Lenovo实例,而且将其中设值注入的key实例也帮我们建好了。

  假如我们到时候需要改变key的值,我们只需要写好对应的key的实现类,在配置文件中将

 <!-- 将配置LogicTech实例 -->
<bean id="logicTech" class="com.sep.basic.service.impl.LogicTech"></bean>

  改为

<!-- 将配置LogicTech实例 -->
7 <bean id="logicTech" class="对应的实现类全名称"></bean>

即可。

  二、我现在开始学习构造注入:

  简单从字面意思上来看,构造注入是利用构造器来完成设置依赖关系的方式。

  首先我们需要对之前的Lenovo.class进行修改,修改后的代码如下:

 package com.sep.basic.service.impl;

 import com.sep.basic.service.Computer;
import com.sep.basic.service.Key; public class Lenovo implements Computer{
private Key key; //默认构造器
public Lenovo(){}; //构造注入带参数的构造器
public Lenovo(Key key) {
this.key = key;
} //设值注入所需的setter方法
public void setKey(Key key) {
this.key = key;
} //实现Computer接口中使用键盘的属性
public void useKey() {
System.out.println(key.print());
} }

  同样,配置文件需要做出对应的修改,构造注入需要使用<constructor-arg```>标签来完成,修改后代码如下:

 <?xml version="1.0" encoding="UTF-8"?>
<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.0.xsd">
<!-- 将配置Lenovo实例 -->
<bean id="lenovo" class="com.sep.basic.service.impl.Lenovo">
<constructor-arg ref="logicTech"></constructor-arg>
</bean>
<!-- 将配置LogicTech实例 -->
<bean id="logicTech" class="com.sep.basic.service.impl.LogicTech"></bean>
</beans>

  运行,同样可以看到语句输出:“用键盘打字”。

  ok,两种方法的依赖注入我就都实现了,需要消化的东西很多啊,我还得自己琢磨琢磨,话说打这么多字很累啊,要不是最近工作不怎么忙,我估计得打字打到吐血啊!

初学Java ssh之Spring 第三篇的更多相关文章

  1. 初学Java ssh之Spring 第四篇

    今天我来学习学习Spring中Bean. 在Spring中原来还有<beans.../>标签啊,它相当于<bean.../>标签的老爸,老爸可以有很多个儿子,但是老爸只有一个哦 ...

  2. 初学Java ssh之Spring 第二篇

    上一篇我们成功搭建好了spring开发的环境,接下来一起看看spring有什么神奇的地方吧(本人也是新手,有不太对的地方希望大神给指出便于修改呢,谢谢大家). 之前听说spring是在对xml文件的应 ...

  3. 初学Java ssh之Spring 第一篇

    之前虽然毕业前实习的工作是使用的C# .NET语言,但是,毕业后还是果断应聘Java.虽然自己对Java的理解不如C#深入,只是对基础知识比较熟悉,但还是义无返顾了··· 虽然应聘经历比较坎坷,但最终 ...

  4. spring第三篇

    在昨天下午更新sprin第二篇中,叙述了将对象交给spring创建和管理,今天在spring第三篇中,主要写两个点一是spring的思想 二是spring中bean元素的属性配置. 1 spring思 ...

  5. Spring第三篇【Core模块之对象依赖】

    前言 在Spring的第二篇中主要讲解了Spring Core模块的使用IOC容器创建对象的问题,Spring Core模块主要是解决对象的创建和对象之间的依赖关系,因此本博文主要讲解如何使用IOC容 ...

  6. SSH框架之Spring第三篇

    1.1 AOP概述 1.1.1 什么是AOP? AOP : 全称是Aspect Oriented Progamming既 : 面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技 ...

  7. Java Stream函数式编程第三篇:管道流结果处理

    一.Java Stream管道数据处理操作 在本号之前写过的文章中,曾经给大家介绍过 Java Stream管道流是用于简化集合类元素处理的java API.在使用的过程中分为三个阶段.在开始本文之前 ...

  8. 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇

    本文是Java IO总结系列篇的第3篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  9. Java框架之Spring(三)

    本文主要介绍Spring中, 1 Bean 的 init-method 和 destroy-method 2 集合类型的装配 3 注解方式装配 4 以自动扫描把组件纳入spring容器中管理 5 代理 ...

随机推荐

  1. 自定义ORM框架(转转)

    ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...

  2. (转)C#.NET使用TTS引擎实现文语转换

    (转)C#.NET使用TTS引擎实现文语转换 本文讲述使用微软TTS5.1语音引擎(中文)实现文本阅读和音频输出为WAV完美解决方案. 网上很多文章说的是要安装SAPI.51 SDK,而这个东西有好几 ...

  3. 第几天 switch做法 杭电

    第几天? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. 移动端app测试

    对于手机项目(应用软件),主要是进行系统测试. 而针对手机应用软件的系统测试,我们通常从如下几个角度开展测试工作: 功能模块测试: 交叉事件测试: 性能测试: 安全测试: 容量测试: 兼容性测试: 接 ...

  5. The given object has a null identifier解决之法

    <input type="hidden" name="memberPermission.id"            value="${memb ...

  6. pin导致路由器死掉的解决方法

    首先检测网卡: ifconfig -a 然后模拟端口: airmon-ng start wlan0 接下来用: airodump-ng mon0 扫描ap找到你pin死的路由器mac 用mdk3 做身 ...

  7. 转:CRect类 的介绍

    类CRect是对Windows结构RECT的封装,凡是能用RECT结构的地方都可以用CRect代替. 结构RECT表示一个矩形的位置和尺寸,其定义为: typedef struct tagRECT{ ...

  8. data-theme 几种值的样式

    代码片段: <div data-role="page"> <div data-role="header"> <h1>The ...

  9. 淺析LED、LED背光、OLED的技術原理與區別

    眼下很多廠商在推廣自己產品的時候都偷換了概念.明明是LED背光顯示器卻要簡稱為LED顯示器.事實上LED顯示器和目前的LED背光顯示器有著本質的區別.當然容易讓大家混淆的還有個技術非常先進的OLED. ...

  10. BZOJ2659: [Beijing wc2012]算不出的算式

    2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 668  Solved: 366[Submit] ...