




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1.简单来说,Spring是一个轻量级的控制反转(IoC Inversion of Control 中文翻译:控制反转)和面向切面(AOP)的容器框架。Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。2.关于侵入式的理解:好的(这里好的标准是扩展性强)设计的标准是"高内聚,解耦合",侵入性强指的是耦合太强了.判断的标准就是当引入了这个组件导致其它代码或者设计要做相应的更改以适应新组件.这样的情况我们就认为这个新组件具有侵入性.3. Spring的核心机制:依赖注入(Dependency Injection)和控制反转(Inversio
2、n of Control)是同一个概念。cSpring通过一种称作控制反转(IoC)的技术做到了解耦合。当应用了所谓的IoC的时候,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。此时创建被调用者的实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。而核心容器(也就是SpringIoC容器)的主要组件是 BeanFactory,它是工厂模式的实现。使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 依赖注入通常有两种:设值注入和构造注入,一般情况之下建议使用建议采用设值注入为主,也就是我们最常用的
3、 set方法,它的优点是简单明了。相应的构造注(也就是所谓的构造函数)入为辅助的注入策略。4.Spring AOP:由于spring框架具有通过配置文件管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使Spring 框架管理的任何对象支持 AOP编程。并且Spring AOP 模块为基于 Spring 的应用程序中的对象提供了良好的事务管理服务。通过使用 Spring AOP,将不再依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。注意:一般spring上下文中xml默认叫applicationContext.xml1.什
4、么是ORM ORM的全称是Object Relational Mapping,即对象关系映射。它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。基本实现原理:映射类:它的作用是描述数据库表的结构,表中的字段在类中被描述成属性,正是因为有了这种映射关系,那么将来就可以实现把表中的记录映射成为该类的对象进行处理。映射文件:它的作用是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系
5、等。(3)通过上面的映射关系配置,将该映射类的操作对象转换成sql语句,持久化到数据库当中。从而达到以面向对象的思想来实现对数据库的操作 1.hibernate的核心思想是:对象关系映射(ORM)是将表与表之间的操作,映射成对象和对象之间的操作,这样简化了持久层的代码, 减轻了程序员的负担*组成spring框架的每个模块都可以单独存在,或者与其他一个或者多个模块联合实现。下面列出了各个模块的主要功能。 1.核心容器 这是Spring框架最基础的部分,它提供了依赖注入(Dependency Injection)特征来实现容器对Bean的统一管理。这里最基本的概念是BeanFactory,也就是说
6、spring的核心容器是借助于BeanFactory来实现的。它是任何Spring应用的核心。BeanFactory是工厂模式的一个实现,它使用IoC将应用配置和依赖说明从实际的应用代码中分离出来。 2.应用上下文(Context)模块(默认叫applicationContext.xml) 核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。这个模块扩展了BeanFactory的概念,增加了对国际化(I18N)消息、事件传播以及验证的支持。 另外,这个模块提供了许多企业服务,例如电子邮件、远程以及时序调度(scheduling)服务。 3.Spring的A
7、OP模块(参考上面的该模块的具体的解释.) 4.JDBC抽象和DAO模块 使用JDBC经常导致大量的重复代码,取得连接、创建sql语句、处理结果集,然后关闭连接。Spring的JDBC和DAO模块抽取了这些重复代码,因此可以保持数据库访问代码的干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。 JDBC DAO抽象层提供了有意义的针对异常的层次结构,可用该结构来管理异常处理和不同数据供应商抛出的异常错误信息。异常层次结构简化了错误处理,并且大大的降低了需要编写的异常代码数量。 5.对象/关系映射集成模块(Spring ORM) Spring框架集成了若干ORM框架,从而提供了ORM的对象
8、关系工具,其中包括 JDO、Hibernate、iBatis(3.0版本以后改名为MyBatis)和TopLink。所有这些都遵从Spring的通用事务和DAO异常层结构。该模块拥有自己内在的ORM解决方案,是为几种流行的ORM框架提供了集成方案,包括Hibernate、JDO和iBATIS SQL映射。Spring的事务管理支持这些ORM框架中的每一个也包括JDBC。 6.Spring的Web模块(Spring WEB) Web上下文模块建立于应用上下文模块(应用上下文默认的情况下指的就是spring当中的applicationContext.xml)之上,它的主要的作用就是提供了一个适合于
9、Web应用的上下文。另外,这个模块还提供了一些面向服务的支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。 7.Spring的MVC框架 Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts2,但是集成以后的依赖性过强,而Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。 它也允许声明性地将请求参数绑定到业务对象中,此外,Spring的MVC框架还可以利用Spring的任何其它服务,例如国际化信息与验证。Struts2框
10、架由3个部分组成:核心控制器FilterDispatcher、业务控制器(业务控制器组件就是用户实现的Action类实例。)和用户实现的业务逻辑组件。在这3个部分里,Struts2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。 (1)核心控制器:FilterDispatcher FilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,注意它负责拦截用户的所有请求, 当用户请求到达时,该Filter会对请求进行过滤。如果用户的请求以action结尾,则该请求将被转入Struts2框架处理。
11、Struts2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件,例如,对于 login.action请求,Struts2将调用名称为login的Action来处理该请求。然后再调用当中的具体的方法对请求做处理, 处理的结果一般返回一个字符串,而最终方法的返回值结合Struts2的配置文件决定着对该请求的最终处理。 关于业务逻辑组件与struts2的配置文件结合使用来决定最终的处理原理如下: Struts2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action时,定义了该Action的name属性和class属性, 其中
12、name属性决定了该Action处理用户的哪个请求,而class属性决定了该Action的实现类。 Struts2当中用于处理用户请求的Action实例,并不是由用户实现的业务控制器来完成或者处理的,而是由Action代理进行处理 究其根本的原因是:用户所实现的业务控制器(也就是我们自己写的那个Action类),并没有与Servlet API直接耦合, 那么显然就无法处理用户请求。而Struts2框架提供了系列拦截器(也就是说所谓的拦截器栈或者拦截器链), 该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来, 传入到Action中,并回调Action的execute
13、方法来处理用户请求。TODO. (2)一个请求在Struts2框架中的处理大概分为以下几个步骤 1 .客户端初始化一个指向Servlet容器(例如Tomcat)的请求 ,即HttpServletRequest请求。 2 .这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于 Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3. 紧接着最重要的是(核心控制器)被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 4 .如果Act
14、ionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy ,也就是所谓的代理对象。 5 .ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 6 .ActionProxy创建一个ActionInvocation的实例。 注意:ActionInvocation就是Action的调用者。ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等 一系列元素的调度。Interceptor通过ActionInvocat
15、ion可以完全的改变Action行为:不让它执行、改变返回值、 甚至可以细颗粒的操作Action的方法。 7 .ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 8 .一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是 (但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 在上述过
16、程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。1. 如果拦截器堆栈中还有其他的Interceptor,那么ActionInvocation.invoke()将调用堆栈中下一个Interceptor的执行。2. 如果拦截器堆栈中只有Action了,那么ActionInvocation.invoke()将调用Action执行。注意:ActionInvocation.invoke()这个方法其实是整个拦截器框架的实现核心。1. 如果在拦截器中,我们不使用invocation.invoke()来完成堆栈中下一个元素的调用,而是直
17、接返回一个字符串作为执行结果,那么整个执行将被中止。2. 我们可以以invocation.invoke()为界,将拦截器中的代码分成2个部分,在invocation.invoke()之前的代码,将会在Action之前被依次执行,而在invocation.invoke()之后的代码,将会在Action之后被逆序执行。由此,我们就可以通过invocation.invoke()作为Action代码真正的拦截点,从而实现AOP。 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别。其主要区别为以下几点: 1)(本质区别)拦截器是基于JAVA反射机制的(拦截器是通过aop实现的,而aop是通过
18、动态代理实现的,动态代理有事通过反射实现的),而过滤器是基于函数回调的。 2)而拦截器不依赖于Servlet容器而过滤器依赖于Servlet容器(其实tomcat本身就是一个Servlet容器)。过滤器依赖于Servlet容器, 3)struts2的拦截器只能对Action请求起作用,而过滤器可以对几乎所有的请求起作用。/* 4)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能 5)在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。Tomcat weblogic jboss _* 解决丢失更新解决方法:悲观锁和乐观锁悲观锁:假设丢失更新一定发生
19、,基于数据库底层锁机制-写锁(排他锁)乐观锁:假设丢失更新不一定发生,使用版本字段,当事务提交时,比较版本字段跟数据库中的版本字段是否一致,如果不一致,hibernate会抛出异常,阻止修改。关于分页的重点总结:.分页* mysql-sql页面:mysql > select * from book limit 查询页的开始索引,每页显示的记录的条数(注意)* web开发层次之间传递多数据,进行数据封装Page。* pageNum,当前页(页面中是第几页)* pageSize,每页显示记录数* startIndex,开始索引(mysql数据库,分页查询需要,【可以通过计算获得】)start
20、Index = (pageNum - 1) * pageSize* totalRecord,总记录数(数据库的总条数,这是获得总共页数的前提条件)* totalPage,总页数(【可以通过计算获得】)* 算法1:totalPage = (totalRecord + pageSize - 1) / pageSize* 算法2:if(totalRecord % pageSize = 0)totalPage = totalRecord / pageSize; else totalPage = totalRecord / pageSize + 1;带条件的查询:public List<Book&
21、gt; findAll3(Book condition)try QueryRunner runner = new QueryRunner(JdbcUtil.getDataSource();String sql = "select id,title,price from book where 1=1 "List<Object> paramsList = new ArrayList<Object>();/注意该集合是一个有序的集合,可以达到参数的对应目标。/处理idif(condition.getId() != null && !&quo
22、t;".equals(condition.getId()sql += " and id like ? " /'%xx%'paramsList.add("%" + condition.getId() + "%");/处理titleif(condition.getTitle() != null && !"".equals(condition.getTitle()sql += " and title like ? "paramsList.add("%
23、" + condition.getTitle()+ "%" );/处理priceif(condition.getPrice() != null && !"".equals(condition.getPrice()sql += " and price like ? "paramsList.add("%" + condition.getPrice() + "%");System.out.println(sql);/设置参数Object params = paramsList
24、.toArray();System.out.println(Arrays.toString(params);/将list集合当中的左右元素变为字符串并拼接在了一起。return runner.query(sql, new BeanListHandler<Book>(Book.class) ,params); catch (SQLException e) throw new RuntimeException(e.getMessage(),e);关于hibernate的重点总结:1.Java按地址区分同一个类的不同对象.2.关系数据库用主键区分同一条记录3.Hibernate使用OID
25、来建立内存中的对象和数据库中记录的对应关系4.对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID赋值5.OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常_ get方法与load方法的比较1.get()采用立即加载方式,而load()采用延迟加载; Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的,它们间的不同在于: 2.如果找不到符合条件的纪录,ge
26、t()方法将返回null而load()将会报出ObjectNotFoundEcception 3.load()方法返回实体的代理类实例,而get()通常返回实体类对象如果get方法在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。 4.load()方法可以充分利用二级缓存和内部缓存的现有数据,而get()方法只在内部缓存中进行查找(经实际测试,get方法其实也会使用二级缓存),如没有发现对应数据将跳过二级缓存,直接调用完成查找注意:(注意)相应的调用get或者loa
27、d的时候不是直接去数据库当中查找或取值,而是先从缓存当中找起。而query.list()直接是作用于数据库。Evict(c);与clear的区别:* evict方法清除指定对象在一级缓存中的引用* clear方法清除所有对象在一级缓存中的引用Hibernate当中对象的三种状态:瞬时态(临时对象):没有与session关联,没有持久化标识OID托管态(离线对象):没有与session关联,有持久化标识OID持久态:与session关联,有持久化标识OID*持久化对象的状态是可以相互转换的*所有的持久态对象都被一级缓存引用直接获得瞬时对象:Customer c = new Customer();
28、瞬时 -> 持久 session.save(c);瞬时 -> 托管 c.setId(1);(注意)不能直接获得托管对象,必须由其他对象转换hibernate检索策略:分为类级别检索和关联级别(集合级别)检索类级别检索使用class元素的lazy属性进行设置lazy="true":使用延迟检索策略lazy="false":使用立即检索策略*(注意) session的get()方法和query的list()方法忽略lazy属性,都使用立即检索策略* 关联级别的检索策略1 在映射文件中, 用 <set> 元素来配置一对多关联及多对多关联
29、关系. <set> 元素有 lazy 和 fetch 属性2 lazy: 主要决定 orders 集合被初始化的时机. 即到底是在加载 Customer 对象时就被初始化, 还是在程序访问 orders 集合时被初始化3 fetch: 取值为 “select” 或 “subselect” 时, 决定初始化 orders 的查询语句的形式(也就是说会影响到sql语句的条数); 若取值为”join”, 则决定 orders 集合被初始化的时机,若把 fetch 设置为 “join”, lazy 属性将被忽略* Query 的list() 方法会忽略映射文件中配置的迫切左外连接检索策略,
30、 而采用立即检索还是延迟加载策略由set集合的lazy属性决定注意:迫切左外连接检索策略的优点在于比立即检索策略使用的 SELECT 语句更少* 如果在关联级别使用了延迟加载或立即加载检索策略, 可以设定批量检索的大小, 以帮助提高延迟检索或立即检索的运行性能. <set> 元素有一个 batch-size 属性, 用来为延迟检索策略或立即检索策略设定批量检索的数量. 批量检索能减少 SELECT 语句的数目, 提高延迟检索或立即检索的运行性能,默认值是1关于缓存:缓存的物理介质通常是内存Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务都
31、可以共享这个缓存。Hibernate中提供了两个级别的缓存第一级别的缓存是 Session 级别的缓存,它是属于事务范围的缓存。这一级别的缓存由 hibernate自身管理的,一般情况下无需进行干预第二级别的缓存是 SessionFactory 级别的缓存,它是属于进程范围的缓存.第SessionFactory 的缓存可以分为两类:内置缓存: Hibernate 自带的, 不可卸载. 外置缓存(二级缓存): 一个可配置的缓存插件. 在默认情况下, SessionFactory 不会启用这个缓存插件.外置缓存中的数据是数据库数据的复制, 外置缓存的物理介质可以是内存或硬盘(注意:一级缓存所缓存的
32、是并不是对象的本身,仅仅是该对象的一个引用。)适合放入二级缓存中的数据:很少被修改不是很重要的数据, 允许出现偶尔的并发问题不适合放入二级缓存中的数据:经常被修改财务数据, 绝对不允许出现并发问题与其他应用数据共享的数据注意;一级缓存更新数据会同步到二级缓存*二级缓存的开启流程:1 拷贝ehcache-1.5.0.jar到当前工程的lib目录下2.在hibernate的总配置文件hibernate.cfg.xml中添加以下代码:<!- 开启二级缓存 -><property name="hibernate.cache.use_second_level_cache&qu
33、ot;>true</property>3.<!- 指定二级缓存的提供者 -><property name="vider_class">org.hibernate.cache.EhCacheProvider</property>4.指定使用二级缓存的类,可以在类对用的配置文件中配置,也可以在总的配置文件中配置,但是后者比较常用,因为前者不便于管理。(注意,二级缓存分为类级别的二级缓存和集合级别的二级缓存。)如果是在类的对应配置文件中配置,只需要在<class name="
34、;cn.itcast.domain.User" table="user" select-before-update="false">下添加一行代码:<cache usage="read-write"/>如果是在总的配置文件当中进行配置:类级别的二级缓存的配置如下:<!- 类级别二级缓存 -><class-cache usage="read-write" class="cn.itcast.domain.Customer"/><class-c
35、ache usage="read-write" class="cn.itcast.domain.Order"/>集合级别的二级缓存的配置如下:<!- 集合级别二级缓存 -><collection-cache usage="read-write" collection="cn.itcast.domain.Customer.orders"/>5.配置ehcache默认的配置文件ehcache.xml(名字固定,其实这个配置文件是从ehcache-1.5.0.jar解压出来的配置文件ehcache-failsafe.xml,只需要改名为ehcache.xml即可。)(放在类路径下,即src下)注意:在读取缓存内容的时候,优先从一级缓存中获得数据,只有当前的session关闭后,一级缓存消失,从二级缓存中获取。query的list()方法默认的只向缓存中存放数据,却不使用缓存中的数据。Query 接口的 iterate() 方法同 list() 一样也能执行查询操作list() 方法执行的 SQL 语句包含实体类对应的数据表的所有字段Iterate() 方法执行的SQL 语句中仅包含实体类对应的数据表的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 体育馆停车场车位租赁服务协议
- 顶级汽车品牌专卖店租赁及品牌营销协议
- 买尿不湿活动方案
- 焦化项目冷鼓工段建筑及安装工程施工组织
- 公职律师人员管理制度
- 公司邮寄物品管理制度
- 小学假日值班管理制度
- 初中教师上课管理制度
- 医院基建维修管理制度
- 小学足球球场管理制度
- 2025年高纯硫酸锶项目市场调查研究报告
- 广东省广州市天河区2023-2024学年七年级下学期期末考试英语试题(含答案)
- 2025年防范和打击非法金融活动竞赛题库300题(含答案)
- 净水机服务合同协议书
- 古城煤矿压风系统远程监控改造技术协议
- 2025年上海市公务员录用考试《行测》真题及答案解析(B类)
- 村务管理岗面试题及答案
- 湖南兴湘资产经营管理集团有限公司招聘考试真题2024
- 电力企业应急预案评审与备案细则
- 院感各类应急预案培训
- 2024年四川省资中县事业单位公开招聘医疗卫生岗考前冲刺模拟带答案
评论
0/150
提交评论