Spring核心之对 IOC的理解

Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

一 、IOC

IOC : Inversion of Control,中文译为“控制反转”,IOC不是一种技术,而是一种设计思想。

              Ioc意味着将设计好的对象交给容器控制,而不是传统的在对象内部直接通过new进行创建对象。

传统的程序设计是通过new主动创建对象,然后再通过对象调用方法,类似以下代码:

1 、先创建一个接口:

public interface UserDao {
public void save();
}

2 、创建接口的实现类:

public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("save方法执行了...");
}
}

3、编写一个测试类:通过new主动创建对象并调用方法

public class SpringDemo1 {
@Test
/**
* 传统方式的调用
*/
public void demo1(){
UserDao userDao = new UserDaoImpl(); //创建对象
userDao.save(); //通过对象调用方法
}
}

这样的程序设计会导致类与类之间高耦合,一旦后期维护,程序不想通过UserDaoImpl 来实例化userDao对象,而想通过另一个实现类 UserDaoIocImpl 来实例化userDao对象 ,就需要修改源代码为 UserDao userDao = new UserDaoIocImpl();   不易于后期维护。

IOC :将设计好的对象交给容器控制,由容器帮我们创建并实例化对象 ,而我们可以通过外部xml配置文件来告诉容器我们需要哪个实现类来实例化对象 ,一旦我们需要更改实现类,则直接修改xml配置文件即可。就能够在不修改源代码的情况下,维护程序。

首先编写一个将对象交给容器控制的程序:

1 、先创建一个接口:

public interface UserDao {
public void save();
}

2 、创建接口的实现类:

public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("IOC容器调用的save方法执行了...");
}
}

 3 、创建applicationContext.xml配置文件,将实现类交给Spring管理,即告诉容器调用哪个实现类实例化对象

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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">
<!-- 设置一个id, class为实现类的全路径,告诉容器调用这个实现类实例化对象-->
<bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl"></bean>
</beans>

4 、编写测试类

public class SpringDemo1 {
@Test
/**
* Spring IOC容器的方式的调用
*/
public void demo2(){
// 创建Spring的工厂来加载xml配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//读取到我们告诉容器需要哪个实现类来实例化对象
UserDao userDao = (UserDao) applicationContext.getBean("userDao"); //此处的参数为xml配置文件中 <bean>标签中id的值
userDao.save();
}

当我们需要将实现类UserDaoImpl更换为UserDaoIocImpl时,只需修改xml配置文件<bean>标签中 class 的路径,将其修改为UserDaoIocImpl 类的全路径即可,其余代码无需修改

 <bean id="userDao" class="com.czm.spring.demo1.UserDaoIocImpl"></bean>

二 、DI

DI :Dependency Injection,即“依赖注入” 。在IOC环境下,Spring管理的这个实现类在执行时依赖的一些属性,可直接在类          中注入,以供使用。

1 、比如 UserDaoImpl 实现类在执行时需要用到 name 属性,可直接定义 name 属性并提供 set 方法

public class UserDaoImpl implements UserDao {
//依赖注入
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("save方法执行了..."+name); //执行时直接使用注入的属性
}
}

在xml配置文件中通过<property>标签为 name 属性赋值

<bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl">
<property name="name" value="依赖注入的name属性"></property>
</bean>

2 、当我们需要 调用业务层 Service 方法时 也可注入Service  ,前提是在IOC环境下,即Service实现类也交给了Spring 管理了

注入Service,提供 set 方法

//注入Service
private UserService userService;
//提供Set方法
public void setUserService(UserService userService) {
this.userService = userService;
}

在xml配置文件中通过<property>标签来配置Service ,name 和 ref 属性值与配置Service 是 id 值相同

可直接调用Service 方法

public String regist(){
userService.regist(user); //调用依赖注入的Service方法
return LOGIN;
}

转载于:https://www.cnblogs.com/czmblog0/p/10540127.html

Spring核心之对 IOC的理解相关推荐

  1. Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧)

    1.IoC是什么?IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多轻量级容器都在广泛使用的模式.2.IoC解决了什么问题?在IoC出现以前,组件之 ...

  2. 透析Spring(一): Spring之IoC容器理解

    序言 记得刚毕业那会儿,出来招工作被问到Spring的核心时,都觉得简单的一笔,直接说不就是IoC(控制反转)和DI(依赖注入)么,然后省略一万字对两个名词的解释.最近空来整理了一下Spring中Io ...

  3. 小马哥spring编程核心思想_Spring源码高级笔记之——Spring核心思想

    Spring核心思想 注意:IOC和AOP不是spring提出的,在spring之前就已经存在,只不过更偏向于理论化,spring在技术层次把这两个思想做了非常好的实现(Java) 第1节loC 1. ...

  4. 谈谈对Spring IOC的理解

    2019独角兽企业重金招聘Python工程师标准>>> 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人 ...

  5. Spring核心——IOC处理器扩展

    为什么80%的码农都做不了架构师?>>>    非侵入式框架 Spring一直标注自己是一个非侵入式框架.非侵入式设计的概念并不新鲜,目标就是降低使用者和框架代码的耦合,毕竟框架的开 ...

  6. 谈谈我对Spring IOC的理解

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  7. 对Spring IOC的理解

    1.2.IoC能做什么 IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间 ...

  8. 谈谈Spring Ioc的理解

    原文:http://blog.csdn.net/qq_22654611/article/details/52606960 学了几天Ioc了,但是对它的理解还是模模糊糊,看了这篇博客感觉对Ioc有了更深 ...

  9. 浅谈Spring IOC的理解

    浅谈Spring IOC的理解 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊 ...

最新文章

  1. [JAVAEE] 理解“自然模板“+使用 ModelAndView 对象
  2. Morphia - mongodb之ORM框架
  3. JavaWeb从开发环境搭建,到第一个servlet程序(图文)
  4. 机器人 瓷砖墙面清洗_墙壁清洁机器人解析
  5. html5--6-50 动画效果-变形
  6. Leetcode每日一题:168.excel-sheet-column-title(Excel表名称)
  7. java JDK 自带的 native2ascii 和它的 reverse 命令
  8. 狼的故事9:共同的利益
  9. 前端关系图谱插件_前端拓扑图插件选型对比
  10. 一个页面崩溃,其他页面也跟着崩溃
  11. Ultra Recal 一款DIY的个人管理软件
  12. 抓取、下载某位博主的豆瓣日记
  13. Power bi 4.14 桑基图
  14. Python爬音乐--qq
  15. 最优化方法:八、多目标优化
  16. 【Linux】冯诺依曼体系结构
  17. 万能命令:wn.run/
  18. 自媒体去哪里找素材?
  19. 易基因|精准医学: TERT启动子DNA甲基化在癌症中的双重作用
  20. Python类调用类的实例方法的方式

热门文章

  1. iOS物理碰撞、唱吧音频处理、仿淘宝联动效果等源码
  2. vue的数组如何存储数据
  3. tomcat配置虚拟目录,虚拟目录,tomcat目录,tomcat服务器,网站图片虚拟目录
  4. Java的日期API真烂
  5. how to become a very good candidate at the investment bank?
  6. difference between finance and manufacturing from stakeholder‘s perspective
  7. 我不想just talk talk
  8. blockboard vs canvas
  9. HASHSET不能预留容量问题
  10. 安卓上为什么不能用system.io.file读取streammingAssets目录下的文件