Spring依赖注入:
Spring管理action、service、Dao各层对象,实现松耦合
传统的方式:调用者来创建被调用者;
控制反转: Spring 被调用者实例化的工作不再由调用者实例。另一个说法,依赖注入: Spring容器完成实例化,然后注入到调用者中
工厂模式 调用者耦合工厂,而Spring只需要配置文件来管理各实例Bean。
依赖注入通常有两种方式:设值注入和构造注入
设值注入:通过调用者中实现set 被调用者的方法来注入
构造注入:调用者构造函数中传入被调用者参数
hibernate
1.hibernate优点:
对象关系映射框架,对JDBC的轻量级的对象封装,可应用在任何使用JDBC的场合(BS/CS),hibernate可以在应用EJB的J2EE框架取代CMP,完成数据持久化。
2.事务与并发:
事务
hibernate操作事务和sql方式差不多,通过session主动获取transaction来实现事务控制,同时交由应用服务器提供的JTA来实现事务控制,可采用Spring的事务框架。
并发
并发多采用锁策略,和数据库基本相同,分为乐观锁和悲观锁两种策略。乐观锁策略在hibernate中推荐使用version和timestamp来实现,具体覆盖根据应用而定,如果采用最新修改的覆盖还是采用版本本地冲突策略等。悲观锁策略通过对象的锁方式来实现,如LockMode.READ.
一般用户不需要担心锁策略问题,通常情况下,为JDBC连接指定隔离级别,然后给数据去搞定就行了额。高级用户有时需要进行一个排他的悲观锁定,或者在一个新的事务启动的时候,重新进行锁定。hibernate总是使用数据库的锁定机制,从不在内存中锁定对象。
如果数据卡不知从用户设置锁模式,hibernate将适当的替代模式,确保应用程序可移植性。从以下方式来指定锁定模式。
session.load()的时候指定锁定模式LockMode;
session.lock()
Query.setLoadMode()
3.hibernate提升性能方法:
(1)lazy load懒加载
hibernate懒加载:hibernate在获取一个PO的时候,将同时获取PO中的属性,PO中的集合及集合中的对象的属性、集合。
hibernate3默认的lazy设置为true,只有在调用属性、集合时才会从缓存或数据库中加载。
(2)cache缓存
hibernate对于cache有一级缓存和二级缓存。一级缓存是必需的,位于session部分;二级缓存是可选的,由开发人员指定。hibernate3默认使用EhCache,也可切换为OsCache、JbossCache对集群的支持。
二级缓存的设置:hbm.xml文件中增加Cache元素,指明用哪种策略:read-only,read-write等;或者直接在hibernate.cfg.xml中增加class-cache全局指定。
(3)高效的查询语句
采用占位符的数据库查询,只需要语法分析器分析一次,在参数不同的情况下不会重复解析,提高系统性能。
(4)配置
hibernate.cfg.xml中jdbc.fetch_size的设置等,连接池方面的设置,对于B/S应用尽量采用应用服务器的JNDI的方式。
4.面向对象思想的核心三要素封装、继承、多态,hibernate下如何发挥这三要素来优化持久化层的设计
(1)封装
hibernate中component的概念,采用细粒度级的领域模型设计。如:在User对象中记录User的firstname和lastname这些信息,而在其他表也有这种需求。则把firstname、lastname组装为UserName对象作为Component对象放入User中,在User中使用user.getUserName.getFirstName。同时hibernate还支持Elements、Properties元素。
(2)继承
一、单表策略
类和子类中的属性都放在一张表中,对子类属性不多的情况采用。hibernate采用@hibernate.subclass方式实现
二、每个子类一张表
@hibernate.join-subclass、@hibernate.join-subclass-key的组合方式,采用主键关联的方式
或者@hibernate.join-subclass、@hibernate.discriminator组合方式,采用discriminator(鉴别器)字段关联的方式
三、每个具体类一张表
适合类层次结构上有一定数量的抽象类情况下使用
一种显示多态方式,@hibernate.union-subclass;一种隐式多态方式,每个具体类的PO独立建表,在它的映射文件中将看不出任何的接口、抽象类的关系,对抽象类需指明abstract=true.
(3)多态
查询中体现。User和Employee分别继承自Person,同时Person和Organization对象关联。我们通过Organization获取关联的Person时得到的可能是User,也可能是Employee