IoC

控制反转:是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度

控制反转常用的实现方式是依赖注入DI

通过控制反转,对象在被创建的时候,由系统的外部实体,将其所依赖的对象的引用传递(注入)进来,而不是系统内部进行对象的创建

具体实现:Spring Framework

以HelloWord程序为例

在面向对象的思想(OOP)的指导下,可将程序分为三个模块:

  • 从持久化数据(文件、数据库等)中读取字符串
  • 对读取的数据进行处理(编码、格式等)
  • 将数据展现在用户界面(命令行、GUI、HTML等)

针对上述三个功能可写出三个类:

  • FileHelloStr类:从持久化数据中读取信息
  • HelloWorld类:业务逻辑,如添加Software后缀
  • HelloWorldClient:将信息输出到命令行

存在的问题:

  • HelloWorld类依赖于FileHelloWord类
  • HelloWorldClient类依赖于HelloWorld类
  • 系统的各部分之间相互依赖,导致可维护性和可扩展性差,不适合大型、企业级软件开发

解决方案:

  • 面向接口的编程思想,将业务逻辑层(HelloWorld)和DAO层(FileHelloStr)的耦合消除
  • 业务逻辑针对接口操作,对具体的DAO类的操作,委托给外部类

工厂模式分析:

  • 业务逻辑、数据访问和界面逻辑三者之间完全解耦
  • 工厂类负责创建和集成应用所需的各类对象
  • 借助依赖注入(DI)和工厂模式实现了控制反转(IoC)

IoC原理总结

  • 用于降低耦合度,实现方式为依赖注入
  • 由系统外部实体将依赖的对象注入进来(不用new)
  • 调用方引用一个接口或类就可以获得对象

IoC核心思想:解耦合,将组件的构建和组件的使用分开,实现每个组件时只考虑组件内部的事情,要点是明确和定义组件间的接口

IoC实现基础:面向接口编程 + 工厂模式 + 依赖注入

依赖注入

构造注入

<constructor-arg>
<bean name="对象名" class="类从哪创建"><constructor-arg><ref bean="fileHello"></constructor-arg>
</bean>

设值注入

<property>
<bean id="userBiz" class="UserBizImpl"><property name="userDAO" ref="userDAO"/>
</bean>

区别

  • 设值注入支持大部分依赖注入,构造注入不支持
  • 设值注入不会重写构造方法的值
  • 设值注入不能保证某种依赖是否已经被注入,构造注入不允许生成依赖关系不完整的对象
  • 设值注入使DAO,Impl,Service,ServiceImpl,配置applicationContext.xml实现
    构造注入使用ServiceImpl,配置applicationContext.xml实现

Spring IoC

Spring IoC中最核心的组件时工厂类

  • Spring创建时通过Bean工厂来实现控制反转和依赖注入的,从而达到管理任意类型的应用对象的目的
  • Bean工厂使用统一的方式装配所有的应用对象,时实例化、配置和管理Bean的容器,是Spring其他组件服务的基础
  • Spring框架中,最基本的Bean工厂是接口BeanFactory
  • ApplicationContext构建在BeanFactory基础之上。除了具有BeanFactory的功能之外,还添加了大量的功能,如Spring IoC集成、国际化资源、事件机制。

FileSystemXmlApplicationContext:可将配置文件放在项目的任何地方,但需要告知

ClassPathXmlApplicationContext:将配置文件放在项目的根目录下

Spring Bean管理

  • 由Ioc容器初始化,装配,管理的类
  • Spring框架是实例化,配置,管理Bean的容器,通过Bean工厂实现Ioc和DI
  • 管理分为xml和注解

Bean的基本配置

  • Id和name
    • 一般而言,通过id属性指明Bean的实例名
    • id属性在整个IoC容器中必须唯一
    • 如果Bean的名称中含有特殊字符,就是用name属性进行设置
  • class
    • class属性用于设置一个类的完整路径名

Bean管理——xml方式
作用域:

  • singleton:Bean以单实例的方式存在,即在Spring IoC容器中只存在一个实例
  • prototype:每次调用getBean()时都会返回一个新的实例
  • request:仅适用Web环境。每次Http请求都会创建一个新的Bean
  • session:仅适用Web环境。作用域等同HTTP session的效用

三种实例化方式:类构造器(默认无参构造方法)/静态工厂(简单工厂模式)/实例工厂(工厂方法模式)

//Bean的实例化
//...............................................................//类构造器(class中填类名)//如果有参需要使用<constructor-arg>
<bean id="exampleBean" class="examples.ExampleBean"/>
//...............................................................
//静态工厂
//在class助兴中填静态工厂类名,factory-method属性中填方法名
<bean id="clientService" class="examples.ClientService" factory-method="createInstance"/>
//
public class ClientService{private static ClientService clientService=new ClientService();private ClientService(){}public static ClientService createInstance(){//1.私有(别人不可用)//2.对外获取方法需为静态(可以直接使用类名调用方法)return clientService;}
}
//...............................................................
//实例工厂
//先定义工厂bean,再设定factory-method和factory-bean属性
<bean id="serviceLocator" class="examples.DefaultServiceLocator" >
</bean>
<bean id="clientService" factory-bean="serviceLocator" factory-method="createClientServiceInstance"/>
//
public class DefaultServiceLocator(){private static ClientService clientService=new ClientServiceImpl();private DefaultServiceLocator(){}public ClientService createClientServiceInstance(){return clientService;}
}

Bean的生命周期

实例化、属性赋值、初始化、销毁

bean的依赖注入:构造注入/设值注入

//构造注入
<beans><bean id="Foo" class="x.y.Foo">//Foo下有两个属性<constructor-arg ref="bar"/><constructor-arg ref="baz"/></bean><bean id="bar" class="x.y.Bar"><bean id="baz" class="x.y.Baz">
</beans>
//
package x,y;
public class Foo{public Foo(Bar bar,Baz baz){//...}
}//...............................................................
//设值注入
<bean id="exampleBean" class="examples.ExampleBean"><property name="beanOne"><ref bean="anotherExampleBean"/><property name="beanTwo"><ref bean="yetAnotherBean"/><property name="integerProperty" value="1">
</bean>
<bean id="anotherExampleBean" class="examples.AnotherBean">
<bean id="yetAnotherBean" class="examples.YetAnotherBean">
//
public class ExampleBean(){private AnotherBean beanOne;private YetAnotherBean beanTwo;private int i;public void setBeanOne(AnotherBean beanOne){this.beanOne=beanOne;}public void setBeanTwo(YetAnotherBean beanTwo){this.beanTwo=beanTwo;}public void setintegerProperty(int i){this.i=i;}
}

其他注入方式:

  • 复杂数据类型注入:List、Set、Map
  • p名称空间方式:p:<属性名>
  • SpELl表达式语言:#{表达式}

Bean管理——注解方式

  • @Component:用于一般意义的Bean注解
  • @Repository:用于对DAO实现类的注解
  • @Service:用于对Service业务逻辑类的注解
  • @Controller:用于对Controller控制器的注解
  • @Autowired:实现属性的自动注入
    • @Autowired注解默认按类型进行自动注入,类型相同时则按照名称进行注入
    • @Autowired注解的required属性用来指定一定要找到匹配的Bean
  • @Resource:与@Autowired类似

【软件开发架构平台】CH2 Spring IoC和Bean管理相关推荐

  1. Spring IOC容器-Bean管理——基于XML方式

    Spring IOC容器-Bean管理--基于XML(续集) 1.IOC 操作 Bean 管理(FactoryBean) ​ 1).Spring 有两种类型 bean,一种普通 bean,另外一种工厂 ...

  2. spring IOC容器 Bean 管理——基于注解方式

    IOC 操作 Bean 管理(基于注解方式) 1.什么是注解 ​ (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值-) ​ (2)使用注解,注解作用在类上面,方法上面, ...

  3. 物联网大数据平台软件开发架构案例解析

    物联网大数据平台软件开发架构案例解析 有人说物联网是引领信息技术的第三次浪潮. 第一次浪潮是个人电脑的出现,开创了信息时代的第一次革命,此次浪潮成就了微软.IBM等巨头. 第二次浪潮是以信息传输为特征 ...

  4. 分享一个 物联网大数据平台软件开发架构案例

    物联网大数据平台软件开发架构案例解析 有人说物联网是引领信息技术的第三次浪潮. 第一次浪潮是个人电脑的出现,开创了信息时代的第一次革命,此次浪潮成就了微软.IBM等巨头. 第二次浪潮是以信息传输为特征 ...

  5. 电子烟的软件开发架构及欧美测试标准+中国标准+多国标准

    电子烟的软件开发架构及欧美测试标准+中国标准+多国标准 1. 什么是电子烟 2. 电子烟软件架构 2.1. 平台 2.2. 模块划分 2.3. 模块内设计框架 3. 为什么需要制定电子烟标准 4. 电 ...

  6. 软件开发架构模式浅谈:一些思考和实践记录

    一 背景和问题 我个人平时会比较慎用"架构"这个词 一方面是觉得业界有很多架构大师和架构模式,而我的认知和实践有限: 另一方面是因为这个词看着挺高大上.有点务虚,如果不结合实际场景 ...

  7. 浅谈软件开发架构模式

    本文作者将介绍他对于软件开发架构模式的一些思考和实践. 背景和问题 我个人平时会比较慎用"架构"这个词 一方面是觉得业界有很多架构大师和架构模式,而我的认知和实践有限: 另一方面是 ...

  8. 软件开发架构介绍||OSI七层协议之物理层、数据链路层、网络层、传输层(mac地址、ip协议、断开协议、tcp协议之三次握手四次挥手)

    阅读目录 一.网络编程 一.网络编程 软件开发架构 C/S架构 C:客户端 想体验服务的时候才会去找服务端体验服务 S:服务端 24小时不间断的提供服务,即时监听,随时待命 B/S架构 B:浏览器 想 ...

  9. 软件开发架构的演变过程

    软件开发架构的演变过程 单体架构 >分布式架构 >SOA架构 >微服务架构 1.单体架构 就是把所有的功能模块打到一个包里面然后再部署,采用了单体架构的项目被称之为单体应用. 优点: ...

  10. iOS软件开发架构理解

    iOS软件开发架构理解 这个东西是硬伤,框架?自带的mvc? 自带的UIViewController UIView UINavigationController 这些算不算?当然算的,cocoa框架嘛 ...

最新文章

  1. fb50 sap 报记账码未定义_SAP隐秘的角落:记账代码Posting Key
  2. 利用MEGA32制作辉光数码管显示电路
  3. gitblit.cmd运行自动关闭
  4. 50多个强大的jQuery插件应用实例
  5. Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(5)
  6. python if 比较小数浮点数
  7. 如何快速制作脚本,不用插件也能用按键精灵后台发送消息
  8. Icon图标格式(用于生成*.ico图标)
  9. java实现小姐姐做我女朋友好么抖音表白神器
  10. Android项目开发:简易计步器
  11. 计算机属性中只有远程协助,使用Windows自带的远程协助功能解决电脑问题
  12. hihoCoder1290. Demo Day
  13. Go 语言如何自定义 linter(静态检查工具)
  14. 亚信安全:坚持自主可控 做中国本土化专业化的安全公司
  15. 关于Wav音频压缩MP3
  16. 非隔离AC-DC恒压开关电源控制驱动降压芯片功能应用及原理图参考
  17. 【基于mini2440开发板的交叉编译环境及内核树配置.
  18. UVALive - 2093 Moving Pegs bfs
  19. iPhoneX设计稿适配Android,设计干货:iPhone X APP UI设计尺寸和适配【完整版】
  20. 李开复博士------美国大学启示录

热门文章

  1. SetupFactory使用
  2. 如何制作统计报表(盈帆报表: efreprt.com)
  3. Linux学习新篇章C高级:day1
  4. Linux下编译OpenSSL
  5. 小米手机解锁,root
  6. CI框架 where 跟 OR 怎么连用
  7. 如何手工制作html网站地图,网站地图制作_sitemap自动生成方法详解
  8. Linux中c语言strcmp,c语言常用函数strcmp函数和strcpy函数
  9. 【白帽子讲Web安全】第一章 我的安全世界观
  10. 微软文本转语音小工具(Text to speech)