Spring篇

第二章、Spring IoC简介

一、基本概念

控制反转是一个比较抽象的概念,是Spring框架的核心,用来消减计算机程序的耦合问题。

依赖注入是IoC的另外一种说法,只是从不同的角度描述相同的概念。

二、控制反转和依赖注入

  • 控制反转:当Spring框架出现后,对象的实例(汽车)不再由调用者(我)来创建,而是由Spring容器(汽车店)来创建。Spring容器负责控制程序之间的关系(汽车店控制我和汽车零件的关系),而不是由调用者的程序代码直接控制。这样,控制权由调用者转移到Spring容器,控制权发生了反转,这就是Spring的控制反转。
  • 依赖注入:从Spring容器角度上看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入。

【附】:依赖注入采用的Java 的反射机制

三、代码操作

1、布局

2、构造方法注入

2.1、接口

  • 在包dao中添加接口TestDao
package dao;

public interface TestDao {
public void sayHello();
}
  • 在包server中添加接口TestDIService
package server;

public interface TestDIService {
public void sayHello();
}

2.2、接口实现类

  • 在包dao中添加接口实现类TestDaoImpl
package dao;

/**
* 接口实现类
* lin
* 2018/11/22
*/
public class TestDaoImpl implements TestDao {
@Override
public void sayHello() {
System.out.println("TestDiDaoSay:“Spring,Make persistent efforts!”");
}
}
  • 在包server中添加接实现类TestDIServiceImpl
package server;

import dao.TestDao;

public class TestDIServiceImpl implements TestDIService {
private TestDao testDao;
//构造方法,用于实现依赖注入接口对象testDiDao
public TestDIServiceImpl(TestDao testDao){
super();
this.testDao=testDao;
} @Override
public void sayHello() {
//调用testDIDao中的sayHello方法
testDao.sayHello();
System.out.println("TestDIService构造方法注入say:Study Hard!");
}
}

2.3、配置文件

添加配置文件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">
<!--将指定类TextDaoImpl配置给Spring,让Spring创建其实例-->
<bean id="test" class="dao.TestDaoImpl"/>
<!--使用构造方法注入-->
<bean id="testDIService" class="server.TestDIServiceImpl">
<!--将myTestDIDao注入到TestDIServiceImpl类的属性testDIDao-->
<constructor-arg index="0" ref="test"/>
<!--constructor-arg:用于定义类的构造方法的参数-->
<!--index:定义参数的位置-->
<!--ref:某一个实例的引用-->
</bean>
</beans>

2.4、测试类

在包test添加测试类TestDI

package test;

import dao.TestDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import server.TestDIService; public class Test {
public static void main(String[] args) {
//初始化Spring容器ApplicationContest,加载配置文件
ApplicationContext appCon=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取test实例
TestDIService testDIService=(TestDIService)appCon.getBean("testDIService");
testDIService.sayHello();
}
}

3、使用属性setter方法注入

3.1、接口实现类

在包server中添加TestDIServiceImpl_setter类

package server;

import dao.TestDao;
import dao.TestDaoImpl; public class TestDIServiceImpl_setter implements TestDIService {
private TestDao testDao;
//添加testDIDao属性的setter方法,用于实现依赖注入o
public void setTestDIDao(TestDao testDIDao) {
this.testDao=testDIDao;
} @Override
public void sayHello() {
//调用testDIDao中的sayHello方法
testDao.sayHello();
System.out.println("setter方法注入say:Study Hard!");
}
}

3.2、配置文件

在原有的配置文件applicationContext.xml中添加bean属性

<bean id="testDIServicel" class="server.TestDIServiceImpl_setter">
<!--调用TestDIServiceImpl_setter中的setter方法,将myTestDIDao注入到TestDIServiceImpl_setter类的testDIDao上-->
<property name="testDIDao" ref="test"/>
</bean>

总:

<?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">
<!--将指定类TextDaoImpl配置给Spring,让Spring创建其实例-->
<bean id="test" class="dao.TestDaoImpl"/>
<!--使用构造方法注入-->
<bean id="testDIService" class="server.TestDIServiceImpl">
<!--将myTestDIDao注入到TestDIServiceImpl类的属性testDIDao-->
<constructor-arg index="" ref="test"/>
<!--constructor-arg:用于定义类的构造方法的参数-->
<!--index:定义参数的位置-->
<!--ref:某一个实例的引用-->
</bean>
<!--使用setter方法注入-->
<bean id="testDIServicel" class="server.TestDIServiceImpl_setter">
<!--调用TestDIServiceImpl_setter中的setter方法,将myTestDIDao注入到TestDIServiceImpl_setter类的testDIDao上-->
<property name="testDIDao" ref="test"/>
</bean>
</beans>

3.3、测试类

在test中插入代码

//通过容器获取testDIService实例,测试setter方法注入
TestDIService testDIService1=(TestDIService)appCon.getBean("testDIServicel");
testDIService1.sayHello();

package test;

import dao.TestDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import server.TestDIService; public class Test {
public static void main(String[] args) {
//初始化Spring容器ApplicationContest,加载配置文件
ApplicationContext appCon=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取test实例
TestDIService testDIService=(TestDIService)appCon.getBean("testDIService");
testDIService.sayHello();
//通过容器获取testDIService实例,测试setter方法注入
TestDIService testDIService1=(TestDIService)appCon.getBean("testDIServicel");
testDIService1.sayHello();
}
}

框架:Spring IoC的更多相关文章

  1. [Spring框架]Spring IOC的原理及详解。

    这里感谢 CSDN 的原博客:http://blog.csdn.net/m13666368773/article/details/7802126 看后  受益匪浅,这里再重温一遍Spring IOC ...

  2. AS3 IOC框架Spring Actionscript 的使用总结

    Spring Actionscript 是众多围绕依赖注入提供解决方案的Flex控制反转框架之一 AS3 下经典的IOC框架有Spring ActionScript.Parsley.Flicc和Swi ...

  3. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

  4. Spring框架之IOC(控制反转)

    [TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...

  5. 框架源码系列六:Spring源码学习之Spring IOC源码学习

    Spring 源码学习过程: 一.搞明白IOC能做什么,是怎么做的  1. 搞明白IOC能做什么? IOC是用为用户创建.管理实例对象的.用户需要实例对象时只需要向IOC容器获取就行了,不用自己去创建 ...

  6. Spring框架学习02——Spring IOC 详解

    1.Spring IOC的基本概念 IOC(Inverse of Control)反转控制的概念,就是将原本在程序中手动创建对象的控制权,交由Spring框架管理.当某个Java对象(调用者)需要调用 ...

  7. 十七、Spring框架(IOC/DI)

    一.Spring框架 Spring是一个基于IOC和AOP的结构J2EE系统的框架. 1.IOC反转控制是Spring的基础(Inversion Of Control).也就是说创建对象由以前的程序员 ...

  8. Spring框架中IoC(控制反转)的原理(转)

    原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...

  9. Spring框架的IOC核心功能快速入门

    2. 步骤一:下载Spring框架的开发包 * 官网:http://spring.io/ * 下载地址:http://repo.springsource.org/libs-release-local/ ...

随机推荐

  1. 小程序用户openid设置放缓存

    wx.setStorageSync('openid', res.data.data.openid),设置     var openid = wx.getStorageSync('openid')获取

  2. 诡异的楼梯 HDU - 1180

    Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向, ...

  3. 为什么一刷新页面session没了

    最常见的的原因: session_start(); 没有放在文件最上面……

  4. spring boot(一)入门

    什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...

  5. HDU-4587-tarjin/割点

    http://acm.hdu.edu.cn/showproblem.php?pid=4587 给出一幅无向图,问除去两个点之后子图的最大联通分量个数. 考虑每次ban一个点然后跑一遍tarjin统计下 ...

  6. python目录和文件操作

    一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法. 要操作目录,必须引入os模块 import os1.得到当前工作目录,即当前Python脚本工作的目录路径: os ...

  7. NOIP2003加分二叉树

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节点的分数为di,treedi,tree ...

  8. A Bug's Life(向量偏移)

    A Bug's Life Time Limit : 15000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  9. 有史以来性价比最高最让人感动的一次数据库&amp;SQL优化(DB &amp; SQL TUNING)——半小时性能提升千倍

    昨天,一个客户现场人员急急忙忙打电话找我,说需要帮忙调优系统,因为经常给他们干活,所以,也就没多说什么,先了解情况,据他们说,就是他们的系统最近才出现了明显的反应迟钝问题,他们的那个系统我很了解,软硬 ...

  10. RCNN 目标识别基本原理

    RCNN- 将CNN引入目标检测的开山之作 from:https://zhuanlan.zhihu.com/p/23006190 前面一直在写传统机器学习.从本篇开始写一写 深度学习的内容. 可能需要 ...