Spring总结之IOC
一、Spring IOC 简介
IOC(Inverse of control):控制反转,又称作依赖注入,主要是把创建对象和查找依赖对象的控制权交给IOC容器,由IOC容器管理对象的生命周期,是一种重要的面向对象编程的法则来消减计算机程序的耦合问题,是Spring框架的核心。
1、IOC例子说明
业务场景:员工工作,当有一份工作出现时,会有对应的人来做此工作,如果在工作中直接new出员工,这样工作和员工就绑定到一起了,然而正确的场景却不希望这样,工作只负责工作,人员应该由主管来确定。
例子:工作与员工绑定到一起了
//员工张三
public class Zhangsan { public void doWork() {
System.out.println("张三开发");
}
} //工作业务逻辑
public class DoWork { public void doWork() {
Zhangsan zs = new Zhangsan();
zs.doWork();
}
} public class SpringTest {
//开发主管
@Test
public void zhuguan() {
DoWork dw = new DoWork();
dw.doWork()1;
}
}
例子:工作安排控制权交给主管
//员工逻辑
public interface Employee {
void doWork();
}
//员工张三
public class Zhangsan implements Employee{ public void doWork() {
System.out.println("张三开发");
}
}
//工作业务逻辑
public class DoWork { private Employee user; public void setUser(Employee user) {
this.user = user;
} public void doWork() {
user.doWork();
}
}
public class SpringTest {
//开发主管
@Test
public void zhuguan() {
DoWork dw = new DoWork();
dw.setUser(new Zhangsan());
dw.doWork();
}
}
这个控制由那位员工来开发权利可以交由spring控制,这样工作业务代码和员工就解耦了:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<bean id="zhangsan" class="top.ruandb.entity.Zhangsan"></bean>
<bean id="doWork" class="top.ruandb.service.DoWork">
<property name="user" ref="zhangsan"></property>
</bean>
</beans>
public class SpringTest { ApplicationContext ac ; @Before
public void setUp() {
ac = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void test1() {
DoWork doWork = (DoWork) ac.getBean("doWork");
doWork.doWork();
}
@After
public void tearDown() {
ac = null;
}
}
2、依赖注入
依赖注入其实就是控制反转的另一种说法,获得依赖对象的方式被反转了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- 属性注入 -->
<bean id="people" class="top.ruandb.entity.People">
<property name="name" value="张三"></property>
<property name="age" value="18"></property>
</bean>
<!-- 构造函数注入;(通过类型) -->
<bean id="people1" class="top.ruandb.entity.People">
<constructor-arg type="String" value="李四"></constructor-arg>
<constructor-arg type="int" value="18"></constructor-arg>
</bean>
<!-- 构造函数注入;(通过索引) -->
<bean id="people2" class="top.ruandb.entity.People">
<constructor-arg index="0" value="王五"></constructor-arg>
<constructor-arg index="1" value="18"></constructor-arg>
</bean>
<!-- 构造函数注入;(类型和索引联合使用) -->
<bean id="people3" class="top.ruandb.entity.People">
<constructor-arg type="String" index="0" value="赵六"></constructor-arg>
<constructor-arg type="int" index="1" value="18"></constructor-arg>
</bean>
<!-- 工厂注入(非静态工厂) -->
<bean id="peopleFactory" class="top.ruandb.factory.PeopleFactory"></bean>
<bean id="people4" factory-bean="peopleFactory" factory-method="createPeople"></bean>
<!-- 工厂注入(静态工厂) -->
<bean id="people5" class="top.ruandb.factory.PeopleFactory2" factory-method="createPeople"></bean>
<!-- 注入参数 -->
<bean id="dog" class="top.ruandb.entity.Dog">
<property name="name" value="tom"></property>
</bean>
<bean id="people6" class="top.ruandb.entity.People">
<!-- 基本类型值 -->
<property name="name" value="张三"></property>
<property name="age" value="18"></property>
<!-- 注入 bean参数(ref方式) -->
<property name="dog" ref="dog"></property>
<!-- 注入 bean参数(内部bean方式) -->
<property name="cat">
<bean class="top.ruandb.entity.Cat">
<property name="name" value="lucy"></property>
</bean>
</property>
<!-- 注入null -->
<property name="nullString">
<null></null>
</property>
<!-- 注入List -->
<property name="hobbys">
<list>
<value>吃饭</value>
<value>睡觉</value>
</list>
</property>
<!-- 注入Set -->
<property name="loves">
<set>
<value>上班</value>
<value>加班</value>
</set>
</property>
<!-- 注入Map -->
<property name="map">
<map>
<entry>
<key><value>1</value></key>
<value>2</value>
</entry>
<entry>
<key><value>3</value></key>
<value>4</value>
</entry>
</map>
</property>
</bean>
<!-- Spring默认的bean都是单例,可以通过配置 prototype ,实现多例.其他类通过某方法获取多例,方法注入 lookup-method -->
<bean id="dog1" class="top.ruandb.entity.Dog" scope="prototype"></bean>
<bean id="people6" class="top.ruandb.entity.People">
<lookup-method name="getDog" bean="dog1"/>
</bean>
<!-- bean关系 继承:parent;依赖:depends-on(依赖后会先初始化依赖的类);引用:ref -->
<bean id="abstractPeople" class="top.ruandb.entity.People" abstract="true">
<property name="className" value="高三5班"></property>
<property name="age" value="19"></property>
</bean>
<bean id="zhangsan" parent="abstractPeople" depends-on="autority">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
</bean>
<bean id="lisi" parent="abstractPeople">
<property name="id" value="2"></property>
<property name="name" value="李四"></property>
<property name="age" value="20"></property>
<!-- 引用dog -->
<property name="dog" ref="dog"></property>
</bean>
<bean id="autority" class="top.ruandb.entity.Authority"></bean> <!-- bean的作用范围 scope
1,singleton Spring ioc 容器中仅有一个 Bean 实例,Bean 以单例的方式存在;
2,prototype 每次从容器中调用 Bean 时,都返回一个新的实例;
3,request 每次 HTTP 请求都会创建一个新的 Bean;
4,session 同一个 HTTP Session 共享一个 Bean;
5,global session 同一个全局 Session 共享一个 Bean,一般用于 Portlet 应用环境;
6,application 同一个 Application 共享一个 Bean;
-->
</beans>
Spring总结之IOC的更多相关文章
- Spring学习之Ioc控制反转(1)
开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...
- Spring学习之Ioc控制反转(2)
开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...
- 比Spring简单的IoC容器
比Spring简单的IoC容器 Spring 虽然比起EJB轻量了许多,但是因为它需要兼容许多不同的类库,导致现在Spring还是相当的庞大的,动不动就上40MB的jar包, 而且想要理解Spring ...
- Spring学习笔记IOC与AOP实例
Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...
- Spring框架(3)---IOC装配Bean(注解方式)
IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...
- Spring框架之IOC(控制反转)
[TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- Spring系列之IOC的原理及手动实现
目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 导语 Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架.也是几乎所有J ...
- Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)
Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个 ...
- Spring框架中IoC(控制反转)的原理(转)
原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...
随机推荐
- GPU编程和流式多处理器(七)
6. 杂项说明 6.1. warp级原语 warp作为执行的原始单元(自然位于线程和块之间),重要性对CUDA程序员显而易见.从SM 1.x开始,NVIDIA开始添加专门针对thread的指令. Vo ...
- python+selenium_鼠标事件
引言--在实际的web产品测试中,对于鼠标的操作,不单单只有click(),有时候还要用到右击.双击.拖动等操作,这些操作包含在ActionChains类中. 一.ActionChains类中鼠标操作 ...
- LeetCode:322. 零钱兑换
链接:https://leetcode-cn.com/problems/coin-change/ 标签:动态规划.完全背包问题.广度优先搜索 题目 给定不同面额的硬币 coins 和一个总金额 amo ...
- python学习笔记01-简单接触
前言:陆陆续续学习python一年多了,每次都因为各种原因中断了,希望这次可以通过记录更新的方式坚持学完一轮. 简单了解python Python是一种解释型.面向对象.动态数据类型的高级程序设计语言 ...
- 无规矩不成方圆,聊一聊 Spring Boot 中 RESTful 接口设计规范
在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性.接口的稳定性.接口的跨域性.接口的协议规则.接口的路径规则.接口单一原则.接口过滤和接口组合等诸多因素,本篇文章将简要分 ...
- MySQL 架构|给你一个“上帝视角”
"我平时的工作就是 CRUD (增删改查)呀!我怎么提升自己的技术?"."平时开发我都是用开源的 MyBatis.Hibernate,连原生的 sql 我都没写过几行&q ...
- Java 提效神器 Stream 的冷门技巧
Stream 使用这个方法创建一个 Stream 对象. new ArrayList<>().stream() Filter 过滤器,里面传递一个函数,这个函数的返回结果如果为 true ...
- 01 JumpServer安装
1.0.环境说明: 操作系统类型 主机名称 用户及密码 角色 eth0(Vmnet8) eth1(Vmnet1) 防火墙状态 selinux centos7.4 controlnode root:12 ...
- 17、linux root用户密码找回
17.1.救援模式: 光盘模式启动(第一启动项) 删除/mnt/sysimage/etc/passwd root的密码,halt重启. 改为硬盘启动模式,无密码进入root,为root新建密码 17. ...
- 9.10、mysql进程、状态在线修改参数重要知识
1.-e :改参数表示不用登陆mysql就可以使用mysql的命令,有利于于加管道符对数据进行处理: mysql -uroot -p123456 -e "show databases;&qu ...