Spring框架的个人理解之IOC

 1、对于spring的理解

spring是个开源的框架,那什么是框架呢,框架又有什么用呢?它有什么有优点和缺点呢?

它的适用场景是什么呢?

框架这个东西我觉得就像是个半成品的软件,不过这个半成品的软件是你的软件的架构基础,就像一座房子的框架,一般来说总是先会把这个房子的设计的结构搭起来,然后什么外形的颜色是装饰完全由你自己之后再去添加,这也有点像装饰器模式,或者说是多态之中最上层的类,吸血鬼始祖,人的骨架是一样的但是外形怎样呢还是要看内部基因和粉刷了哈哈……

框架的作用也就不言而喻了,spring的框架的定位大概就像是类似我们的房间设计都是几室加几厅这种已经成为一种经典了。当然框架和建筑这种的类比并不是完全恰当的,因为在软件里面是留有很多API的,当这某种性能不符合你的要求的时候可以很方便的去扩展。最不相同的是软件架构的一个原则是对修改关闭和对扩展开放。

而使用现成的框架的好处就更不用说了而且还是免费的,不仅大大缩短了软件的开发周期,架构的设计也特别棒。

Spring团队列举出的优点:

1、非侵入性框架,使得目标程序对于框架的依赖最小化,应用程序可以在没有spring或者其它容器的情况下运行。

2、一致性编程模型,使应用直接使用POJO开发,从而可以与运行环境隔离开来。

3、spring推动应用程序面向对象以及面向接口编程转变,提高代码的可重用性和可测性

4、改进了体系结构的选择,spring可以和很多其他的架构集成和封装,例如S2SH,当然SpringMVC也有自己的实现对于数据的持久化以及WebUI层。



spring的不足:

个人觉得用框架开发确实是能解决很多业务上重复的东西,但是会让人太过于依赖框架,而不知道底层的实现机制是怎样的,而且对于开源代码别人很容易利用这个框架的漏洞来攻击你的网站。

吴老师的安全书里面就有提到web框架安全问题以及springMVC命令执行漏洞的问题

spring security为springMVC提供了很多安全机制,但是缺乏XSS、CSRF等问题的解决方案。

由于spring框架可以根据客户端所提供的值来更新对象的值,所以这也会导致攻击者修改class.classloader加载对象的类加载器的属性,就有可能执行任意命令。



Spring两大核心IOC依赖反转和AOP面向切面编程

IOC容器是Spring最核心的模块, IOC的两个主要容器系列。

1、实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能。

2、实现ApplicationContext应用上下文,它作为容器的高级形态而存在。应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境作了许多适配。

IOC的接口图





 

1、从接口beanFactory到HierarchicalBeanFactory再到ConfigurableBeanFactory是主要的BeanFactory设计路径。BeanFactory定义了基本的IoC容器的规范。

HIerarchicalBeanFactory中增加了getParentBeanFactory()的接口功能,使得BeanFactory具备了双亲IoC容器的管理功能。

ConfigurableBeanFactory 主要定义了一些对BeanFactory的配置功能

2、从BeanFactory到ListableBeanFactory在到ApplicationContext再到常用的WebApplicationContext或者ConfigurableApplication。常用的应用上下文基本上都是WebApplicationContext或ConfigurableApplication的实现。

在ListableBeanFactory接口中细化了许多BeanFactory的功能,而ApplicationContext实现了MessageSource、ResourceLoader和ApplicationEventPublisher等接口,在BeanFactory简单IOC容器中添加了许多高级容器的特性的支持,使其更加适应与应用上下文。



IOC容器初始化的过程

分为三步第一步:Resource定位也就是对于beanDefinition的定位

             第二步:BeanDefinition载入,先通过Xml的解析其得到document对象,完成通用Xml解析后再按照Spring的bean的规则进行解析。最后再完成BeanDefinition的处理。

            第三部:向容器中注入这些BeanDefinition。通过BeanDefinitionRegistry接口实现将BeanDefinition注入到HashMap中,IOC容器通过HashMap来持有这些BeanDefinition数据

IOC容器初始化的过程不包括bean的依赖注入,Bean的载入和依赖注入是两个独立的过程。



IOC的依赖注入

依赖注入一般是发生在应用第一次通过getBean向容器索取Bean的时候,当然也可以对属性lazyinit来实现预实例化配置。在上面IOC的接口图中可以看到BeanFactory中有getBean()接口的定义,这个接口的实现就是触发依赖注入的地方。

1、第一步是根据BeanDefinition生成Bean

getBean—调用—>createBean——>bean对象根据BeanDefinition定义生成——>之后还会有些属性初始化。

bean对象的实例化方法分两种方式,一种是BeanUtils利用JVM的反射,说到JVM的反射其实就是通过类本身来获取类的信息和动态调用类的方法的一种机制。另一种则是通过CGLIB的Enhaner类来完成

2、第二步则是解析bean的依赖关系后实现真正的注入

 参考资料:Spring技术内幕

猜你喜欢

转载自cindyliao.iteye.com/blog/2294619