Spring框架的基本思想就是IOC/DI
Spring就是一个IOC容器
2.spring的最大作用ioc/di,将类与类的依赖关系写在配置文件中,程序运行时根据配置文件动态加载依赖的类,降低的类与类之间的藕合度。
spring让对象与对象之间的关系都通过配置类说明管理,Spring根据这些配置内部通过反射去动态的组装对象
要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。
它的原理是在applicationContext.xml加入bean标签,在bean标签中通过class属性说明具体类名、通过property标签说明该类的属性名、通过constructor-args说明构造子的参数。
其一切都是反射,当通过applicationContext.getBean("id名称")得到一个类实例时,就是以bean标签的类名、属性名、构造子的参数为准,通过反射实例对象,唤起对象的set方法设置属性值、通过newInstance实例化得到对象。
正因为spring一切都是反射,反射比直接调用的处理速度慢,所以这也是spring的一个问题。
spring 第二大作用就是aop,其机理来自于代理模式,代理模式有三个角色分别是通用接口、代理、真实对象代理、真实对象实现的是同一接口,将真实对象作为代理的一个属性,向客户端公开的是代理,当客户端调用代理的方法时,代理找到真实对象,调用真实对象方法,在调用之前之后提供相关的服务,如事务、安全、日志。
其名称分别是代理、真实对象、装备、关切点、连接点。
动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射。反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟Spring的配置文件来动态的创建对象,和调用对象里的方法的 。
Spring里用的最经典的一个设计模式就是:模板方法模式。
3.AOP(Aspect-Oriented Programming)是面向切面编程,可以为某一类对象进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的模块)从而达到对一个模块扩充的功能。
这些都是通过配置类达到的。AOP的主要原理:动态代理
代理的两种方式:
静态代理:
针对每个具体类分别编写代理类;
针对一个接口编写一个代理类;
动态代理:
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类
事务处理:
在以往的JDBCTemplate中事务提交成功,异常处理都是通过Try/Catch 来完成,而在Spring中。Spring容器集成了TransactionTemplate,她封装了所有对事务处理的功能,包括异常时事务回滚,操作成功时数据提交等复杂业务功能。这都是由Spring容器来管理,大大减少了程序员的代码量,也对事务有了很好的管理控制。
1.
Spring的官方定义是:一个轻量级的IoC和Aop容器框架,它使用了一种叫做依赖注入的技术。
所谓依赖注入,就是指将创建对象以及协议依赖对象之间合作的责任从对象自身中转移到“工厂”中去,这个“工厂”通常由IoC容器提供。
Struts2与Spring的集成要用到Spring插件包,这个包是同 Struts2一起发布的。Spring插件是通过覆盖Struts2的ObjectFactory来增强核心框架对象的创建 。当创建一个对象的时候,它会用Struts2配置文件中的class属性去和Spring配置文件中的id属性进行关联,如果能找到则由Spring创建,否则由Struts2框架自身创建,然后由Spring来装配。 Spring插件具体有如下几个作用:
1. 允许spring来创建Action、Interceptror和Result
2. 由Struts创建的对象能够被Spring装配
3. 提供了2个拦截器来自动装配action,如果没有使用Spring ObjectFactory的话
这里要注意的是,我们不必在Spring中去注册action,尽管我们可以这么去做,通常Struts框架会自动的从action mapping中创建action对象。
当指定struts.objectFactory为spring时,struts2框架就会把bean转发给spring来创建,装配,注入。但是bean创建完成之后,还是由struts容器来管理其生命周期。.
需要注意的一个地方:Spring中的缺省作用域是Singleton作用域。而往往Action属于有状态的bean,应该使用prototype作用域。如果忽略这个细节,在我们方便实用set,get方法处理数据的时候,可能会有线程安全 上的风险。
这个属性用于说明Struts2的 对象池创建工厂,Struts2也有自己的对象池,就像Spring那样,在配置文件中你可以引用对象池中的对象,你可以借助于Spring中的对象池,当想要得到Spring中的对象池时,申明struts.objectFactory为Spring的对象池构建工厂
2.
切面aspect : 把横切的关注点(如安全性检查方法)抽取出来,将其放到一个类中,这个类就叫切面
通知advice : 是对横切关注点的实现,如checkSecurity()方法
切入点pointCut : 安全性检查的范围,即由切入点表达式判断在哪个方法(连接点Joinpoint) 上执行checkSecurity()
明明白白AOP(傻瓜也会心领神会!)
http://stamen.iteye.com/blog/1512388
3、Spring两种容器:
BeanFactory容器、应用上下文ApplicationContext
Bean工厂延迟载入所有的Bean,直到getBean()方法被调用时bean才被创建。
上下文则是在启动时预载入所有的单实例Bean,确保当你需要的时候它已经准备好了,不需要等待他们被创建 。
Spring对接口实现类通过Dynamic Proxy实现AOP,而对于没有实现任何接口的类 通过CGLIB实现AOP机制
对于没有实现接口的类 生成字节增强码的代理 其实就是生成真正实现类的子类