依赖注入
1、 什么是依赖?
依赖指的是类之间的访问关系。如果类A访问类B的属性或方法或者类A负责实例化类B,那么可以说类A依赖类B,和关联关系不同,无需把类B定义为类A的属性。在Spring中是通过注入来实现依赖关系的。
2、 什么是依赖注入?
依赖注入背后的基本原理是对象之间的依赖关系(即一起工作的其它对象)只会通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。
依赖注入作用:容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系这些自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,这也正是控制反转(Inversion of Control, IoC) 名字的由来。 应用此原则后,代码将更加清晰。而且当bean自己不再担心对象之间的依赖关系(甚至不知道依赖的定义指定地方和依赖的实际类)之后,实现更高层次的松耦合。
依赖注入的主要注入方式有:setter注入和构造器注入。
此外还有接口注入,在此重点介绍setter注入和构造器注入。
3、 setter注入介绍
setter注入通过调用无参构造器或无参static
工厂方法实例化bean之后,调用该bean的setter方法,即可实现基于setter的注入。
下面通过一个例子进行介绍:
创建一个DAO接口,接口中有insert和delete两个方法,
创建继承此接口的类GoodsDAO,
创建一个业务实现类GoodsDAOImpl实现了GoodsDAO接口,
创建一个Goods类,包含name和price属性,并实现相应的get和set方法
创建GoodsAction类进行真正的业务处理,包含一个GoodsDAOImpl类型的属性及其get,set方法,还有inert和delete方法代码如下:
public class GoodsAction {
/**此GoodsActionImpl的属性名称gdi一定要与 spring配置文件中propertyname的属性名称一致 必须有相应的set方法与get方法 通过此方法(set方法)注入*/
private GoodsDAOImpl gdi;
/***实现相应的get,set方法/
……………
public String insert() {
System.out.println("-------------------------------");
return "success";
}
public String delete() {
return "success";
}
}
在applicationContext.xml配置文件中进行配置代码如下:
<!-- 定义一个真正业务实现的Bean的实例,通过scope属性指明业务实例对象的作用域 每次请求都会创建一个新实例 -->
<bean id="GDI" class="spr.impl.GoodsDAOImpl" scope="prototype"/>
<!-- 处理业务的Action类 ,创建该bean的一个实例,指明实例的作用域 -->
<bean id="GAction" class="spr.ac.GoodsAction" scope="prototype">
<!-- 通过业务实现类属性gdi的setget方法, ref引用的实例注入到gid属性中 -->
<property name="gdi" ref="GDI"/>
</bean>
创建Test测试类,在main方法里测试代码如下:
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext ("applicationContext1.xml");
GoodsAction ga = (GoodsAction)ac.getBean("GAction");
ga.insert();
}
4、 构造器注入介绍
构造器的注入通过调用带参数的构造器来实现,每个参数代表着一个依赖。
构造器注入方式:构造器参数类型匹配和构造参数索引。
下面通过一个例子进行介绍:
首先在上面的Goods类中添加默认构造器和带有参数的构造器代码如下:
public class Goods {
private String name;
private double price;
public Goods(){
}
public Goods(String name,double price){
this.name=name;
this.price=price;
}
/***实现相应的get,set方法/
……………
}
然后在配置文件中进行配置代码如下:
<bean id="goods" class="spr.impl.Goods" scope="prototype">
<!-- 参数类型匹配, constructor-arg传递构造器的参数,若类中有多个相同类型的属性那么就可以采用构造参数索引方式注入
<constructor-arg type="java.lang.String" value="hp电脑"/>
<constructor-arg type="double" value="100"/>
-->
<!-- 构造参数索引 -->
<constructor-arg index="0" value="hp电脑"/>
<constructor-arg index="1" value="100"/>
分享到:
相关推荐
最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这...
控制反转 依赖注入的c#实现,很好的教程。
较为框架式的演示了DI服务依赖注入 适用于熟悉C#中的继承,基本的Core命令使用等. 该示例演示了以服务器集群为背景的各种业务的依赖注入. 示例来自于B站杨中科老师的.NET Core(6.0)教学.
对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的 依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程(将依赖关系注入到对象中) ,spring的...
详解 Spring 3.0 基于 Annotation 的依赖注入实现。。详解 Spring 3.0 基于 Annotation 的依赖注入实现。。
✨一个轻量级的PHP依赖注入框架,让你自定义的方法也可以使用依赖注入.
javaEE 开发中 现在最成熟的框架之一应该就是spring了 spring框架最强大的地方就是实现了依赖注入 也叫控制反转 最近的一个项目中用的就是 spring框架 spring框架是工厂模式的应用结合了MVC的设计思想 大家可以...
[Manning Publications] 依赖注入 实战 (英文版) [Manning Publications] Dependency Injection (E-Book) ☆ 图书概要:☆ Dependency Injection is an in-depth guide to the current best practices for using ...
Entity Framework Repository(含依赖注入)
Unity为微软推出的一个轻量级依赖注入容器,内带了一个名为StopLight的快速入门示例,基于WindowsForm技术构建,里面有大量的冗余代码。我将全部程序用WPF技术进行了重构,保留使用Unity的全部技术和程序的全部功能...
IoC 依赖注入 技术总结 IoC 依赖注入 技术总结
EFcore Repository 依赖注入方式实现数据库基本操作
网上下载整理的关于依赖注入的介绍。循序渐进,非常不错。
Spring Ioc 注解 依赖注入
Angular6依赖注入Demo,包含懒加载实现。 Angular6依赖注入Demo,包含懒加载实现。
本项目为Java项目,使用Spring实现依赖注入,实现采用ApplicationContext,不再直接使用XmlBeanFactory方式。适合初学者了解Spring依赖注入的实现。
简介:一个小的依赖注入容器
spring依赖注入底层详解,很不错的资源,欢迎大家来下载学习。
该资源使用vs2017编写的一个关于如何使用Ninject进行依赖注入的事例,具体的说明步骤可以参考博客:https://blog.csdn.net/liudexin1985?t=1&orderby=UpdateTime
最近在熟悉反射与依赖注入,特意写了一下简单的实例,希望可以帮助到你我他