当前位置: 首页 > news >正文

Spring依赖注入的三种方式

Spring依赖注入(DI)的三种方式,分别为:

1. 接口注入
2. Setter方法注入
3. 构造方法注入

下面介绍一下这三种依赖注入在Spring中是怎么样实现的。

首先我们需要以下几个类:

接口 Logic.java

接口实现类 LogicImpl.java

一个处理类 LoginAction.java

还有一个测试类 TestMain.java

Logic.java如下:

package com.spring.test.di;

public interface Logic {

public String getName();

}

LogicImpl.java如下:

package com.spring.test.di;

public class LogicImpl implements Logic{

public String getName(){

   return "fengyun";

}

}

TestMain.java

package com.spring.test.di;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class TestMain {

/**

 * @param args

 */

public static void main(String[] args) {



   // 得到ApplicationContext对象

   ApplicationContext ctx = new FileSystemXmlApplicationContext(

          "applicationContext.xml");

   // 得到Bean

   LoginAction loginAction = (LoginAction) ctx.getBean("loginAction");



   loginAction.execute();

}

}

LoginAction.java 会根据使用不同的注入方法而稍有不同

下面按照注入的方法来看LoginAction.java类

Setter方法注入:

package com.spring.test.di;

public class LoginAction {

private Logic logic;



public void execute() {

   String name = logic.getName();

   System.out.print("My Name Is " + name);  

}



/**

 * @return the logic

 */

public Logic getLogic() {

   return logic;

}



/**

 * @param logic

 *            the logic to set

 */

public void setLogic(Logic logic) {

   this.logic = logic;

}

}

定义了一个Logic 类型的变量 logic, 在LoginAction并没有对logic 进行实例化,而只有他对应的setter/getter方法,因为我们这里使用的是Spring的依赖注入的方式

applicationContext.xml配置文件如下:

现在可以运行testMain.java了,我们可以看到控制台打出了 My Name Is fengyun

OK了,这就是spring的setter方法注入,非常简单

下面我们来看看构造方法注入

顾名思义,构造方法注入,就是我们依靠LoginAction的构造方法来达到DI的目的,如下所示:

LoginAction.java

package com.spring.test.di;

public class LoginAction {

private Logic logic;



public LoginAction(Logic logic) {

   this.logic = logic;

}



public void execute() {

   String name = logic.getName();

   System.out.print("My Name Is " + name);

}

}

这里我们添加了一个LoginAction的构造方法

applicationContext.xml配置文件如下:

我们使用constructor-arg来进行配置, index属性是用来表示构造方法中参数的顺序的,如果有多个参数,则按照顺序,从 0,1…来配置

我们现在可以运行testMain.java了,结果跟使用Setter方法注入完全一样.

其中需要注意一点有:构造函数有多个参数的话,如:参数1,参数2,而参数2依赖于参数1,这中情况则要注意构造函数的顺序,必须将参数1放在参数2之前。

下面继续说说我们不常用到的接口注入,还是以LogicAction为例,我们对他进行了修改,如下所示:

LogicAction.java

package com.spring.test.di;

public class LoginAction {

private Logic logic;



public void execute() {

   try {

       Object obj = Class.forName("com.spring.test.di.LogicImpl")

              .newInstance();

       logic = (Logic) obj;

       String name = logic.getName();

       System.out.print("My Name Is " + name);

   } catch (Exception e) {

       e.printStackTrace();

   }

}

}

配置文件:

对于接口注入这种方式,以上也只是我个人理解,不知道是否有什么问题。呵呵

我们最常用就是Setter和构造函数这两种注入方法,至于他们各自的对比,我想在只要baidu一下就可以有清楚的答案了。

对于Spring的依赖注入,最重要的就是理解他的,一旦理解了,将会觉得非常的简单。无非就是让容器来给我们实例化那些类,我们要做的就是给容器提供这个接口,这个接口就我们的set方法或者构造函数了。

相关文章:

  • iOS 之自动布局
  • Android四大基本组件(1)之Activity与BroadcastReceive广播接收器
  • css实现左侧固定宽,右侧自适应
  • Android四大基本组件(2)之Service 服务与Content Provider内容提供者
  • Android四大基本组件(3)之四大组件总结
  • Android 使用Gson解析json案例详解
  • 网络加载数据和解析JSON格式数据案例之空气质量监测应用
  • Android抽屉菜单DrawerLayout的实现案例
  • 进程注入的学习(中)
  • Android程序之全国天气预报查询(聚合数据开发)
  • 什么时候用webserver,什么时候用一般处理文件
  • Android注册短信验证码功能
  • Android程序解析XML文件的方法及使用PULL解析XML案例
  • 西安Uber优步司机奖励政策(12月21日-12.27日)
  • Android案例之新闻客户端服务器实现,完全属于自己的新闻展示平台
  • (三)从jvm层面了解线程的启动和停止
  • create-react-app项目添加less配置
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • EOS是什么
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Java编程基础24——递归练习
  • Java方法详解
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • react 代码优化(一) ——事件处理
  • XML已死 ?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 前端面试题总结
  • 区块链共识机制优缺点对比都是什么
  • 由插件封装引出的一丢丢思考
  • 仓管云——企业云erp功能有哪些?
  • ​520就是要宠粉,你的心头书我买单
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (10)STL算法之搜索(二) 二分查找
  • (3)llvm ir转换过程
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .gitignore文件---让git自动忽略指定文件
  • .Net 6.0 处理跨域的方式
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net MySql
  • .NET 回调、接口回调、 委托
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ C++ ] 继承
  • [@Controller]4 详解@ModelAttribute
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]