Spring IOC以及三种注入方式
IOC是spring的最基础部分,也是核心模块,Spring的其他组件模块和应用开发都是以它为基础的。IOC把spring的面向接口编程和松耦合的思想体现的淋漓尽致。
IOC概念
IOC(Inversion of Control)译为中文“控制反转”,许多应用都是由两个或更多个类通过彼此合作来实现业务逻辑的,这使得每个对象都要引用其合作对象(也就是它所以来的对象)来装配在一起工作,而这个装配过程如果靠硬编码来实现,他们之间的耦合性有多强就可想而知的。如果把这个装配过程交给第三方(如IOC容器)来实现,那么就能很好的解耦,此时控制就反转了,反转给了第三方(如IOC容器)。
IoC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:
- 依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。
- 依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。
Dependency Injection是时下最流行的IoC类型,所以有时我们说IOC的另一个名字叫依赖注入,它又有接口注入(Interface Injection),设值注入(Setter Injection)和构造子注入(Constructor Injection)三种方式。
IOC与旧方式的对比
本文Demo想实现的效果:架设需要之前是使用的MySql数据库,但后来却要转向Oracle数据,我们来看下使用IOC和不使用IOC的对比。当然这个例子并不合适,因为你可能立马想到Hibernate,所以请不要介意,这只是个Demo。
- 没有使用注入方式
package net.oseye; public class App
{
public static void main( String[] args )
{
//调用数据库操作
new MysqlHelper().insert();
}
}
/**
* Mysql数据库操作
*/
class MysqlHelper{
/**
* 插入数据
*/
public void insert(){
System.out.println("Mysql数据库插入操作");
}
}那么如果现在转向Oracle数据库,那么你不仅要增加Oracle操作类,还必须更改调用数据库操作的代码(PS:为了演示方便,数据库操作类我没有单独文件)
package net.oseye; public class App
{
public static void main( String[] args )
{
//调用数据库操作
new OracleHelper().insert();
}
}
/**
* Mysql数据库操作
*/
class MysqlHelper{
/**
* 插入数据
*/
public void insert(){
System.out.println("Mysql数据库插入操作");
}
}
/**
* Oracle数据库操作
*/
class OracleHelper{
/**
* 插入数据
*/
public void insert(){
System.out.println("Oracle数据库插入操作");
}
}可见耦合性是很强的。
- 使用IOC的构造器注入方式
使用IOC你能感受到面向接口编程的思想,App.java代码如下:package net.oseye; import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class App
{
public static void main( String[] args )
{
//IOC容器装载Bean定义资源
BeanFactory beanFactory=new ClassPathXmlApplicationContext("applicationcontext.xml");
//依赖装配
IDbHelperManager idbHelperManager= beanFactory.getBean("dbhelpermanager",IDbHelperManager.class);
idbHelperManager.insert();
}
}
/**
* 数据库操作管理接口
*/
interface IDbHelperManager{
public void insert();
}
/**
* 数据库操作管理实现
*/
class DbHelperManager implements IDbHelperManager{
//构造器注入准备工作
private IDbHelper dbHelper;
public DbHelperManager(IDbHelper dbHelper){
this.dbHelper=dbHelper;
} public void insert(){
this.dbHelper.insert();
}
}
/**
* 数据库操作接口
*/
interface IDbHelper{
public void insert();
}
/**
* Mysql数据库操作实现
*/
class MysqlHelper implements IDbHelper{
public void insert(){
System.out.println("Mysql数据库插入操作");
}
}
/**
* Oracle数据库操作实现
*/
class OracleHelper implements IDbHelper{
public void insert(){
System.out.println("Oracle数据库插入操作");
}
}applicationcontext.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mysqldbhelper" class="net.oseye.MysqlHelper"></bean>
<bean id="oracledbhelper" class="net.oseye.OracleHelper"></bean>
<bean id="dbhelpermanager" class="net.oseye.DbHelperManager">
<constructor-arg ref="mysqldbhelper"></constructor-arg>
</bean>
</beans>maven的pom.xml配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>net.oseye</groupId>
<artifactId>IOCDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>IOCDemo</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.3.RELEASE</version>
</dependency>
</dependencies>
</project>项目结构如下:
当你想切换使用Oracle数据库,只需要修改applicationcontext.xml配置文件,把dbhelpermanager的bean配置为oracledbhelper:<bean id="dbhelpermanager" class="net.oseye.DbHelperManager">
<constructor-arg ref="oracledbhelper"></constructor-arg>
</bean>
依赖注入三种方式
- 构造器注入
如上面Demo不在累述,构造器注入参数有值类型和引用类型(以下雷同)<constructor-arg ref="引用类型"></constructor-arg>
<constructor-arg value="值类型"></constructor-arg> - setter方法注入
通过 JavaBean的属性分配依赖性,只需要修改DbHelperManager类和配置文件即可。class DbHelperManager implements IDbHelperManager{
//构造器注入准备工作
private IDbHelper dbHelper;
public void setDbHelper(IDbHelper dbHelper){
this.dbHelper=dbHelper;
} public void insert(){
this.dbHelper.insert();
}
}applicationcontext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mysqldbhelper" class="net.oseye.MysqlHelper"></bean>
<bean id="oracledbhelper" class="net.oseye.OracleHelper"></bean>
<bean id="dbhelpermanager" class="net.oseye.DbHelperManager">
<property name="dbHelper" ref="oracledbhelper"></property>
</bean>
</beans>这里的property要用name才能找到setter;上面通过构造器注入,因为构造器只有一个参数,所以没有使用name;
- 接口注入
这种方式不常用,而且具有侵入性,暂不研究!
三种注入方式都是将对象交与IOC容器管理,避免在程序中出现具体实现。通过代码我们可以看出IOC依赖注入的好处:
- 对象之间的依赖关系,不由对象自身来负责,而是由容器依据配置文件动态建立,这样就很灵活,可配;
- 采用依赖注入,模块之间一定是松散耦合的;
- 代码易维护易测试;
Spring IOC以及三种注入方式的更多相关文章
- Spring IOC 中三种注入方式
项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样 ...
- Spring学习笔记(6)——IoC的三种注入方式
1.接口注入(不推荐) 2.构造器注入(死的应用) 3.getter,setter方式注入(比较常用) Type1 接口注入 我们常常借助接口来将调用者与实现者分离.如: public class C ...
- Spring常用的三种注入方式
好文要收藏,摘自:https://blog.csdn.net/a909301740/article/details/78379720 Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入 ...
- Spring:Spring-IOC三种注入方式、注入不同数据类型
一.Spring IOC(依赖注入的三种方式): 1.Setter方法注入 package com.jpeony.spring.setter; import com.jpeony.spring.com ...
- spring Bean的三种注入方式
1.构造函数注入: 构造函数的注入方式分为很多种 (1)普通构造函数,空参数的构造函数 <bean id="exampleBean" class="examples ...
- 【SSH系列】深入浅出spring IOC中三种依赖注入方式
spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...
- 深入浅出spring IOC中三种依赖注入方式
深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...
- spring ioc三种注入方式
spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...
- Spring IOC 三种注入方式
1. 接口注入 2. setter注入 3. 构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类 ...
随机推荐
- iPhone 屏幕分辨率
5S 640 x 1136 5 640 x 1136 4s 640 x 960 4 640 x 960 3gs 320 x 480
- 用mfix模拟流化床时压力边界条件和迭代步长需要注意的问题
没想到今天模拟一个冷态流化床都出现这么多问题.需要通入三种气体组成的混合物,这时入口边界的压力BC_P_g不能为零,否则会报错,但是,需要注意的是,收敛效果对这个压力边界非常敏感,我随意给了个30,结 ...
- eclipse 开始运行提示 Java was started but returned exit code=13
Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境. 当我们安装使用时,会出现eclipse启动不了,出现" ...
- 在Flex中使用文件系统
一.File和FileStream对象File和FileStream是AIR文件系统中,重要的组成部分,File对象有许多属性,用于唯一区别它与文件系统上的其他文件对象,属性包括:url/native ...
- 每一个Servlet只有一个实例,多个线程
每一个Servlet只有一个实例,多个线程: Servlet: package com.stono.servlet.synchronize; import javax.servlet.http.Htt ...
- Bootstrap入门(二十七)JS插件4:标签页
Bootstrap入门(二十七)JS插件4:标签页 标签页的切换可以带动内容的变化 首先我们引入CSS文件 <link href="bootstrap.min.css" re ...
- 递归编译的Makefile的实现
最近写了一个递归Makefile,目的是既可以实现子模块的单独编译,也可以不做任何修改就和整个程序的整体进行无缝衔接的编译.具体的思路是借助第三方文件,将子模块编译好的.o文件的路径自动写到confi ...
- EFCore扩展:IQueryable(linq)或sql执行的查询缓存与清理
前言 上一篇讲述了执行sql和配置的一些功能,这篇说明IQueryable(linq)或执行sql的查询缓存与清理,包括扩展到将缓存存储到Redis中. 扩展类库源码: github:https:// ...
- 支付宝ios支付请求Java服务端签名报的一个错(ALI40247) 原创
今天做app的支付宝支付,遇到些问题,以前做支付宝支付签名都是直接在客户端App进行,今天下了最新版本ios的支付宝支付demo,运行demo时底部有红色的显眼字体,告知用户签名必须在服务端进行... ...
- asp.net权限认证:OWIN实现OAuth 2.0 之密码模式(Resource Owner Password Credential)
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...