spring的基本框架主要包含六大模块:DAO、ORM、AOP、JEE、WEB、CORE
Spring DAO:Spring提供了对JDBC的操作支持:JdbcTemplate模板工具类 。
Spring ORM:Spring可以与ORM框架整合。例如Spring整合Hibernate框架,其中Spring还提供HibernateDaoSupport工具类,简化了Hibernate的操作 。
Spring WEB:Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案 。
Spring AOP:Spring提供面向切面的编程,可以给某一层提供事务管理,例如在Service层添加事物控制 。
Spring JEE:J2EE开发规范的支持,例如EJB 。
Spring Core:提供IOC容器对象的创建和处理依赖对象关系 。
方便解耦,简化开发,AOP编程支持,声明式事务支持,集成Junit更加方便的进行分层测试,方便集成各种优秀框架
1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦
2.可以使用容易提供的众多服务,如事务管理,消息服务等
3.容器提供单例模式支持
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供了众多的辅助类,能加快应用的开发
6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring属于低侵入式设计,代码的污染极低
8.独立于各种应用服务器
9.spring的DI机制降低了业务对象替换的复杂性
10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部
属性的依赖注入,spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性注入
依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色 需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中 创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 因此也称为依赖注入。
spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。
设置注入的优点:直观,自然
构造注入的优点:可以在构造器中决定依赖关系的顺序。
补充:
为什么叫DI:
- 正常情况下写一个接口,在一个包或者某一个类里需要用到它具体的一个实现类,写在另外一个包里。
- 在常规编程中,我们需要在定义这个接口使用的地方,直接new出来这个接口的实现类,这样的话,上层就需要依赖下层的某个东西。
- 实际上我们更期望这个灵活的编程模型能够做到:在上层使用的时候定义一个接口,我们现在不管他实现类是什么,在运行期只要有一个实现类塞进来,就可以装配进去,放在这里使用。
- 相当于装修房子:先在墙上留出来一个位置,准备放一幅画。只要把这个位置大小留好了,那幅画最终入住的时候放进来,是油画、水彩、素描都可以。只要我们留出来这个位置是合适的。那么在前期装修房子的时候,先就不用特别关注于这一小块,到底以后用什么类型的画。
- 这么做还有一个好处:就是当装修完房子以后,发现我现在放的这幅油画我不喜欢了,我就随时可以使用一个水彩画替换掉这个油画。
- 也就是说当我们实现依赖注入(控制反转)的方式装配对象,那么在运行期可以不去改我们的代码,改一下装配、配置这块的一些配置(配置文件、注解等),就可以把我们在运行期实际上这一块这个位置上使用的东西直接给替换掉。
IOC,即控制反转,把对象的创建、初始化、销毁交给 Spring 来管理,而不是由开发者控制,实现控制反转。IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂(BeanFactory 接口)。IOC的原理是基于xml解析、工厂设计模式、反射实现的。使用IOC可以降低代码的耦合度。
利用(反射+工厂)技术,根据配置文件中给出的类名生成相应的对象。
Class.forName(className).newInstance。
(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用。
在加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人
员进行使用。在加载配置文件时候就会把在配置文件对象进行创建
IOC操作Bean管理有两种形式,一种是基于xml方式,另一种是基于注解方式。
基于xml方式的Bean管理,Spring主要提供了
基于注解方式的Bean管理,Spring主要提供了@Component @Service @Controller @Repository等注解。
创建Bean及其依赖对象的工作交给IOC容器管理,业务代码只需要getBean就行了。将依赖关系写入配置文件中,有修改时,直接修改配置文件即可,而不用去业务代码中每一个使用Bean的地方修改。
构造器注入,Setter方法注入,接口注入
a、singleton : bean在每个Spring ioc 容器中只有一个实例。b、prototype:一个bean的定义可以有多个实例。
c、request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。d、session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
e、global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的作用域是Singleton.
a、编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
b、声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。 声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。
什么是面向方面编程,3个过程:
找到横切点:首要目标确定在程序的哪个位置进行横切逻辑
横切逻辑(业务代码):横切逻辑代码,这个就是横切业务代码,与aop无关
织入:将横切逻辑织入到横切点
开发者主要关心的是横切逻辑的编写,只需要很少的代码编写确定横切点有哪些,而不需要去为每个横切点添加横切逻辑,不然就是面向对象编程了。
在软件业,AOP为Aspect Oriented Programming的缩写,意味:面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续.将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入.在不修 改源码的基础上,还能对源码进行前后增强。
普通工程通过new ClassPathXmlApplicationContext("applicationContext.xml")初始化Spring。
在执行DogService类中的方法时,执行前会先执行PointCutXmlConf类中的beforeAdvice方法,执行后会执行PointCutXmlConf类中的afterAdvice方法。
前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
异常返回通知[After throwing advice]:在连接点抛出异常后执行。
返回通知[After advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。Spring切面可以应用五种类型的通知:
a、before:前置通知,在一个方法执行前被调用。
b、after: 在方法执行之后调用的通知,无论方法执行是否成功。c、after-returning: 仅当方法成功完成后执行的通知。
d、after-throwing: 在方法抛出异常退出时执行的通知。e、around: 在方法执行之前和之后调用的通知。