中科院计算所培训中spring应用框架技术主讲:John.Yu企业级开发需要什么1.高维护性2.性能和功能的高扩展性3.配置取代编码修改4.高可复用性5.高安全性6.成熟中间件的大量使用7.…….2EJB(EnterpriseJavaBean)1.全面诠释了企业级开发的概念,无以伦比的理论支持2.IBMWebSphere/OracleWebLogic/VMWareJBossAS等中间产品功能强大,且有着统一的JEE规范3.但它是一匹难以驾驭的怪兽。。。。。。34应用管理框架--spring1、开源的应用管理框架,项目地址:创始人RodJohnson。2、框架吸取了EJB2的经验与教训,提出了面向pojo的“轻量级”概念。自:《expertone-on-oneJ2EEDevelopmentwithoutEJB》3、“one-stop-shop”定位、微内核设计、可部分引入式设计。5为什么要提供Spring框架1、“面向抽象编程”及“工厂模式泛滥”,完美的架构设计遭遇丑陋的实现方式。思考工厂模式:2、javaEE分层体系开发结构、层间松藕合、易于单元测试等几方面催生其出现并发展3、EJB2.0规范的复杂性,由于java服务器厂商对标准执行的不一致性,造成“一次编译,处处调试”的尴尬境地。4、绝大多数项目并不需要“分布处理、集群”等特性。5、低侵入度设计,使得测试、移植变得十分容易。简单工厂、多态工厂,抽象工厂、分离使用与实现…..67Spring的主要优点1、解藕合:程序设计的“模块化”,必然形成客户端与服务端的藕合存在,而良好的设计,是将其藕合程序降至最低,即达到“松藕”的目的,“接口”、“抽象类”的存在,以及“多态”性,这从技术上保证了“面向抽象编程”可行性,从而达到“松藕”目的。而spring则从架构层面上使得达到目的的手段变得易行。我要吃羊羊懒是我续8Spring容器Spring的主要优点2、对被管理者不做假设:即并不要求bean必须实现某些接口,从而造成其无法脱离容器而工作(移植性变差、单元测试困难)。这与EJB形成鲜明对比。3、纳入spring管理的bean可以享受“服务器”级的待遇,如事务、日志、权限控制等都可以委托给spring来管理,使得业务代码量大大减少。想吃什么从容器得到,嘿嘿!9Spring的主要优点4、与分层体系开发方式相吻合,spring做为应用框架,可有效的对各层的Bean进行管理。10Springframework结构11Spring的细化结构CoreAopTxContextWebWebMVCWEB框架集成PortletMVC企业集成JDBCORM12SpringIOC与DI1、IOC(InversionofControl)控制反转实际上是指程序设计中的依赖关系进行转移,不要让高层模块直接依赖低层模块,而是依赖于抽象。如一个用户登录的设计:考虑:左侧设计的缺点:右侧设计怎么样:13SpringIOC与DI2、IOC的意义在于,当低层模块发生变动时,高层模块并不发生变动,即“避免水波效应”。3、Spring的IOC是使对象间的关系由容器进行“注入”,即改变原有的由编码决定依赖关系的方式。此种方式即“DI依赖注入”。4、DI是springIOC的手段。其理论依据为MartinFolwer(软件教父,目前是敏捷开发理论的领军人物)《InversionofControlContainersandDependencyInjectionpattern》14DI到底是如何实现的1、以面向抽象方式进行设计:15DI到底是如何实现的2、以外部文件形式设定对象相关联细节setWriter()16DI到底是如何实现的3、XML解析,及反射机制(反射生成对象及反射调用方法)生成已进行关系注入的对象。作业及案例:自行实现一个IOC容器(详见doc)。17以工厂模式为基础的IOC1、工厂模式可以实现IOC,但需要我们自行实现工厂类代码。2、工厂是针对接口设置的,随接口数量的增加,工厂数量也随之增加,程序的可维护性降低。案例:工厂模式为基础的IOC18以DI为基础的IOC1、DI方式的IOC,避免了硬编码方式实现IOC。2、DI方式的IOC,以配置文件标明对象关系,在程序运行期决定对象关系,使对象关系动态化。DI使得spring成为一个“万能对象工厂”,我想spring1中所使用的spring容器类为“BeanFactory”由此得名!案例:spring实现IOC19Spring的IOC(DI)SpringIOC举例20IOC特性21依赖注入的几种实现类型•接口注入--Type1型(InterfaceInjection)容器利用对象所实现的指定的接口,向其发送消息,并将消息(接口方法参数对象或其子类对象)内容发送给对象。在spring中,也部分采用了此种类型的注入:如:BeanNameAware接口、ApplicationContextAware接口等。优点:无需对注入细节进行过多配置。缺点:被管理对象无法脱离容器,较难进行单元测试。实现Servlet接口的对象处于一个servlet/jsp容器中,其service(ServletRequest,ServletResponse)方法,其方法参数实际上是被容器利用其接口被传入的。22依赖注入的几种实现类型•Setter注入—Type2型(SetterInjection)原理:外部容器利用对象的setter方法,在运行期将setter参数对象或其子类对象进行注入优点:(1)不需要有容器相关接口(可移植性、单元测试性好)(2)注入的组合方式灵活。缺点:(1)易遗漏某些属性,而出现只能在运行期才会发现的空指向异常(2)无法在编译期保证对客房端依赖关系的正确性注意是setSM()方法而不是sm属性Spring推荐使用2型注入23依赖注入的几种实现类型•Type3型(ConstructorInjection)原理:建立相应带参的构造器,容器利用其进行依赖注入。index来确定所注入值在参数列表中的位置,为防止重载方面的岐义,可加入type以确定所传参数的类型。优点:由构造器对对象状态的完整性进行验证,体现了“GoodCitizen”原则。缺点:需额外增加符合需要的构造器,当属性增多时,构造器的数量及复杂性变大。24几种依赖注入模式的对比1、接口注入模式的可移植性差,单元测试困难,目前看多出现在一些“标准容器”中(如Servlet/Jsp,EJB容器)以及一些早期框架如struts1中。目前看在轻量级开发领域使用会越来越少。2、2型注入:因其符合javaBean习惯、灵活、对第三方库兼容性高而备受欢迎,目前也是被推荐的一种方式。3、3型注入:以其符合“好市民原则”、依赖关系设定集中、状态一致等优点,作为一种很好的DI补充方式。使用原则:避免1型,提倡2型,辅以3型25向目标Bean传递”值”在spring配置中向目标注入的各种对象,可以使用value/ref两种方式。当协作对象是基本类型或其包装类型、String类型时,使用value元素或属性同时也包括url,Class(但不常用),注意Date是不可以使用value的26向目标Bean传递”对象”当协作bean不是以上类型时,需使用ref元素/属性。当目标与协作bean在同一配置文件中时,可使用localeRef指向同一容器中已存的bean,spring容器会保证其在被注入前已经被实例化了星期三,六月24,201527向目标Bean传递”集合”Spring2相较1在集合类型的注入有了较大的改进,主要区别为spring2将集合看成是一个Bean,而1将其看成是一个value,即2有较高的复用性。我们需引入一个新的名称空间(util)该项技术主要包括对:数组、List、Set、Map、Properties的注入方式,下面将逐一展示。28向目标Bean传递”数组和List”三个bean29向目标Bean传递”set”30向目标Bean传递”map”31向目标Bean传递”properties”32组件在容器中的生命周期具体过程参看文档33初始化方法和消毁方法(1)以非侵入方式使用(2)以侵入方式使用案例:自行编写测试代码,验证其工作流程34数据源dataSource的注入spring提供了将java.sql.DataSource注入,而需要换源时,只需要修改配置,并不需要改动代码在spring中提供了一个供开发测试使用的DataSource---DriverManagerDataSource只将其配置即可使用35数据源BasicDataSource的注入spring提供了将java.sql.DataSource注入,而需要换源时,只需要修改配置,并不需要改动代码需要引入jar36数据源dataSource的注入在项目真实运行环境,数据源往往交由服务器托管,而我们项目中所需的Dao就需要从服务中获取,利用java的JNDI的API是一种方式,但以此方式获取的DataSource是无法通过DI进入到Dao中的,spring提供了从服务器中获取JNDI资源的能力。星期三,六月24,201537AOP特性38AOP特性传统的OOP设计处理以下问题存在复用方面的难题:基于继承和装饰模式的方法,虽然可行,但其基本思路是:生成新的类生成对象,是在编译期解决问题方式,其灵活性较差。我们需要解决问题的新思路:将以下红色部分的动作(concern)设计为通用、不介入特定业务对象的职责清晰的对象。那么如何与业务对象再进行结合???39AOP领域名词释义•Concern:(关注):是指插入到业务逻辑中,但与业务无直接关系的日志、事务、安全检查等功能。如下例中的做日志功能。•Aspect:(方面/切面):将Concern进行收集,进而形成对象,此对象称为切面。如下例中的LogEnhancer类的对象。•Advice:(通知):它是功能增强的代码片段,是Aspect的代码片段,如下例中的invoke()方法中除Objecto=method.invoke(target,args);的其余代码。•Joinpoint:(连接点):Advice在业务执行的插入点或时机,如方法的前后等。•Pointcut:(切入点):是对哪些方法进行切入的契约,其表现为一表达式。•Target:(目标对象):执行核心业务逻辑的对象。•Weaving:(织入):将Aspect与Target整合,进而产生代理对象的方式。40AOP实现方式(1)编译期织入:如AspectJ,其采用java注解的方式,利用其自己的编译器,在编译的过程中将业务方法进行增强。41AOP实现方式(2)运行期织入通过动态代理或CGLIB方式,以纯java实现业务方法的动态增强。42基于动态代理机制实现原理动态代理:其核心为两个类java.lang.reflect.Proxy:提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。java.lang.reflect.InvocationHandler:是代理实例的调用处理程序实现的接口。调用处理程序接口被代理类方法执行由Proxy类以编码方式织入43应用springAOP的开发过程spring提供了四种Advice接口:MethodBeforeAdviceAfterReturningAdviceThrowsAdviceMethodInterceptor:每个advice隐含joinpoit编写实现类装入IOC容器织入44AdvisorPointcut的定义及使用需要在容器装入Advisor,包装Advice和PointCut,然后将其织入AdvicepointCut规则45spring2中四种通知的使用新名称空间的引入不再需要有与spring相关的接口目标方法的执行46spring2中四种通知的使用此配置相对于spring1大大进行了简化,容器的客户端可以透明的使用代理对象,其强