IOC
理解理解
使用IOC对象的依赖都是在对象创建是由负责协调系统中各个对象的外部实体提供的。
减少耦合的一个通常做法是具体实现隐藏在接口下,使得具体实现类的替换不会影响到引用类。
IOC也被称之为DI,是Spring的两大核心概念之一。
A. 依赖注入的概念
Spring的两大核心概念:一个是控制反转(IOC), 也叫做依赖注入(DI);还有一个是面向切面编程(AOP),IOC和DI虽然不是Spring的首创,但是他没在这两方面都非常优秀,可以说整个Spring框架都是围绕着其IOC实现和Aop实现架设起来的。
控制反转模式的基本概念:当某个java对象需要依赖另一个java对象时,不是自身直接创建依赖对象而是由实现IOC容器来创建,并将它注入到需要这个依赖对象的java对象中
B. Spring的依赖注入
Spring框架带有一个IOC容器它使用的注入方式有构造器注入和setter注入。
a) 构造器注入:通过构造器方法来传入所依赖的对象,从而完成依赖关系的设定
b) Setter注入:通过set方法来传入所依赖的对象,从而完成依赖关系的设定
什么是依赖注入?
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两个方法,
创建一个真正的业务实现类GoodsDAOImpl实现了DAO接口,
在GoodsDAOImpl类,包含name和price属性,并实现相应的set方法和DAO中的方法。
创建一个继承接口DAO的接口GoodsDAO,
创建GoodsAction类进行真正的业务处理,实现了接口GoodsDAO,包含一个GoodsDAOImpl类型的对象,用此对象来调用GoodsDAOImpl中的方法
代码如下:
public class GoodsAction {
/**此GoodsActionImpl的属性名称gdi一定要与 spring配置文件中propertyname的属性名称一致 必须有相应的set方法 通过此方法(set方法)注入*/
private GoodsDAOImpl gdi;
/***实现相应的set方法/
public void setGdi(private GoodsDAOImpl gdi){
this.gdi=gdi();
}
public String insert() {
System.out.println("-------------------------------");
gdi.insert
}
public String delete() {
gdi.delete();
}
}
在真正的业务实现类中代码如下
public class GoodDAOImpl implements DAO{
@Override
public String insert() {
System.out.println("插入成功");
}
public String delete() {
System.out.println("删除成功");
}
}
在applicationContext.xml配置文件中进行配置代码如下
<!-- 定义一个真正业务实现的Bean的实例,通过scope属性指明业务实例对象的作用域 每次请求都会创建一个新实例 --> <bean id="gDI" class="spr.impl.GoodsDAOImpl" scope=" s ingleton "/> <!-- 处理业务的Action类 ,创建该bean的一个实例,指明实例的作用域 --> <bean id="gAction" class="spr.ac.GoodsAction" scope="s ingleton"> <!-- 通过业务实现类属性gdi的setget方法, ref引用的实例注入到gid属性中 --> <property name="gdi" ref="gDI"/> </bea
创建Test测试类,在main方法里测试代码如下:
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext ("applicationContext1.xml");
GoodsAction ga = (GoodsAction)ac.getBean("GAction");
ga.insert();
}
1、 构造器注入介绍
构造器的注入通过调用带参数的构造器来实现,每个参数代表着一个依赖。
构造器注入方式:构造器参数类型匹配和构造参数索引。
下面通过一个例子进行介绍:
首先在上面的Goods
类中添加默认构造器和带有参数的构造器代码如下:
public class Test{
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"ap.xml"}); /**如果要解析多个文件可以定义一个String数组,用逗号隔开*/
Goods gds = (Goods) ac.getBean("goods");
System.out.println("商品的名称"+gds.getName()+" 商品的价格"+gds.getPrice());
}
}