一,Hibernate部分
1,简述hibernate映射继承关系和映射组成关系有何异同?
映射继承关系:类和类之间除了关联和聚集关系外,还可以有继承关系。什么时候需要映射继承关系呢,举个例 --子,一个公司里面有不同种类的员工,这些不同种类的员工都有一些共同的属性,可以放在一个Employee类中,而员工的个性(不同的地方)可以放在Employee类的子类中,在映射Employee类时,需要用discriminate关键字来映射员工的类型,而用subclass关键字来映射Empoyee的子类。
映射组成关系:有一些类是有几个部分类组成的,例如一个顾客,可能有家庭住址和办公地址,每个地址的属性又是一样的,因此可以在映射顾客类的时候,抽象出一个地址类来,这样可以实现更细粒度的映射,在映射组成关系时,要使用component关键字来映射属性类。
2,简述在hibernate映射时,lazy属性有何意义?
首先hibernate 作对象装载的时候,在缺省的情况下是需要把对象相关的信息全部读出来的。这样后面的应用程序才能够直接访问这些值。
这样如果a 关联了 b, c;那么b,c 都会被装进来。如果b 还关联了d,e,f 。那么d,e,f 也会被装进来。如果对象设计不好,贪图方便,大家互相关联的话,那么拖进来的信息将非常巨大,甚至可能读一个简单的信息,把整个数据库给拖进来了。那自然会造成系统崩溃,性能很差等问题。即使设计得好,这个问题也很严重。因此需要lazy 。lazy 表示在第一次装载的时候不要装,用到什么装什么。
3,请为优化hibernate提几点建议
1,不要把所有的责任推在hibernate上,对代码进行重构,减少对数据库的操作,尽量避免在数据库查询时使用in操作,以及避免递归查询操作,代码质量、系统设计的合理性决定系统性能的高低。
2,对大数据量查询时,慎用list()或者iterator()返回查询结果,而应该结合HQL按需进行查询。
3,在一对多、多对一的关系中,使用延迟加载机制,会使不少的对象在使用时方会初始化,这样可使得节省内存空间以及减少数据库的负荷,而且若PO中的集合没有被使用时,就可减少互数据库的交互从而减少处理时间。
4,对于大数据量新增、修改、删除操作或者是对大数据量的查询,与数据库的交互次数是决定处理时间的最重要因素,减少交互的次数是提升效率的最好途径,所以在开发过程中,请将show_sql设置为true,深入了解Hibernate的处理过程,尝试不同的方式,可以使得效率提升。
二,spring部分
1,简述什么是IOC, IOC有哪几种注入方式?
IOC指控制反转,或者说是依赖注入,控制反转是指获得依赖对象的方式反转了,任何重要的系统都需要至少两个相互合作的类来完成业务逻辑,通常情况下,每个对象都要自己负责得到它的合作对象,这样会导致代码耦合度高,而难以测试,难以维护,难以扩展。使用IOC,对象的依赖都是在对象创建时由负责协调系统中各个对象的外部实体提供,这就是依赖被注入到对象中,实现了对象之间解耦
2,简述什么是AOP ,AOP会影响性能吗?
AOP 面向方面的编程。
传统的OOP能够很好的避免代码的重复。但是有的时候,我们无法用OOP避免代码的重复,或者无法使用OOP得到一个优雅的解决方案,例如事务,安全,异常等,我们程序中的每一个方法几乎都会和它们打交道,有没有什么办法就像EJB中一样,能讲这些方面模块化呢。
AOP出现了,它将系统分解为方面和关注点,而不是对象,它将横切性的问题以一种更加通用的方式模块化,从而提升程序的模块化程度。
举个例子,如果我们系统中的某一些方法都需要安全检查,安全检查对我们来说就是一个方面,我们可以将这些需要安全检查方法的某个切入点进行拦截,然后进行注入通知,从而将安全检查的代码(通知)放入一个函数中,而不用到处充满安全检查的代码。
AOP是通过反射机制来实现拦截,因此会影响性能,但是相对于EJB来说,对性能的影响不会很严重。因此我们在使用AOP时要注意使用的粒度,建议不要在非常细粒度的情况下使用AOP
3,简述spring是如何管理hibernate事务的?
Spring和EJB一样,也提供了声明性事务支持,spring使用了一种回调方式,把真实的事务实现从代码中抽离出来,它可以使用JTA的事务管理支持,也可以使用hibernate本身机制所提供的事务支持。另外还可以使用AOP将事务管理抽离出来放在一个专门的事务管理器中进行管理。
4,简述Acegi是如何实现: 根据数据库验证身份的。
Acegi在验证客户身份时需要先在数据库中建一个users表和authorities表,Acegi会根据客户输入的信息使用一个jdbc Dao在Users表中查找username和password ,如果客户输入的信息正确,则Acegi在authorities表中查找该客户所拥有的权限,从而完成了认证的工作。
三,JSF部分
1,简述JSF是如何实现页面跳转的
首先在jsf配置文件中的BacingBean配置一个页面跳转规则<navigation-rule> ,<navigation-rule> 中会包含一个<from-view-id>和一系列的<navigation-case> 。<from-view-id>代表当前页面,而<navigation-case>代表一些列可能跳转的页面,当该BackingBean中的某个方法返回一个字符串时,它会去根据当前页面去匹配<from-view-id>,如果找到了当前的页面,然后就会根据返回的字符串去匹配该<from-view-id>对应的一系列<navigation-case>中的<from-outcome>标签所包含的字符串,找到匹配的字符串后,则会从当前页面跳转到<navigation-case>所指定的页面。
2,请简要的描述如何在BackingBean中扩展验证器。
首先在BackingBean定义一个验证方法,比如nameValidator()
然后在jsf输入组件的 validator 属性中进行设置,例如
<h:inputSecret id="userInfo_name" value="#{userInfoAction.name}" required="true"
validator="#{userInfoAction.nameValidator}"/>
3,JSF的事件处理包括:动作事件,即时事件,值变事件,phase事件,请用简要描述jsf中的值变事件。
如果使用者改变了JSF输入组件的值后,就会发生值变事。
如果您想要处理这个事件,有两种方式,
一是直接设定JSF输入组件的valueChangeListener属性,例如
<h:selectOneMenu value="#{user.locale}"
onchange="this.form.submit();"
valueChangeListener="#{user.changeLocale}">
另一个方法是实现javax.faces.event.ValueChangeListener接口,并定义其processValueChange()方法,
四,系统设计部分
1,请画出DAO模式的UML类图,并简要描述该模式的原理以及适用范围。
Dao模式,由于根据数据源不同,数据访问也不同。根据存储的类型(关系数据库、面向对象数据库、文件等等)和供应商实现不同,持久性存储(比如数据库)的访问差别也很大。而且有时候我们的项目需要部署不同的数据库,因此在这些情况下,可以使用Dao模式,
如图所示,如果考虑为三种不同类型的数据库来实现这个策略,我们可以考虑采用抽象工厂设计模式.假设.这个工厂创建了CustomerDAO,AccountDAO,OrderDAO的一系列的DAO,该策略运用了在抽象工厂中产生的工厂类中的工厂方法的实现.
如下图所示:
2,如下源码所示,UserManager 和 AccountManager相互依赖对方,
public class UserManager {
AccountManager accountManager = new AccountManager();
public User searchByNameUser(String userName){
...................
}
public void doSomeUserThings(){
Long id = ........
accountManager.searchAccountById(id);
........................
}
}
public class AccountManager {
UserManager userManager = new UserManager();
public Account searchAccountById(Long id){
..............
}
public void doSomeAccountThings(){
........................
String userName = "tom";
userManager.searchByNameUser(userName);
........................
}
}
(1),请问这种设计好吗,如果使用spring IOC 会出现什么问题,请说明原因。
(2),请重新为该系统进行设计(不用写代码),用UML类图进行说明。
(1)AccountManager和 UserManager 两个类相互依赖对方,两个之间相互耦合,实例化一方的时候必须实例化另外一方,会造成循环依赖,无限依赖,程序运行时会报错。如果使用IOC,则spring不知道会先初始化谁而报错
(2)解决办法:当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点,如果子系统之间是相互依赖的,你可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。
类图如下:
3,设计题:关于某一个系统的权限管理。业务规则如下
(1) ,整个系统(包含多个模块)有一个管理员,可以管理整个系统的权限管理;
(2) ,每个模块有自己的管理员,本模块的管理员只能管理本模块的权限。
(3) ,某一个管理员是可以同时管理多个部门的。
(4) ,管理员不能查看数据,只能查看文件状态。员工可以查看数据以及文件的状态。
(5) ,管理员和管理员之间,管理员和普通员工之间允许相互调动。
请使用UML工具设计一个简单的管理系统
用例图如下:
类图如下:
DepartmentManager类记录管理员和部门之间的管理关系
Authorities类定义不同角色所拥有的不同权限,例如员工可以读文件,管理员可以看到文件状态等。
EmployeeActorLog :定义员工的角色。
4,Anne的宠物小屋有12个笼子,每个笼子可以放不同的动物,但只能放1只或0只,包括猫Cat,狗Dog,蛇Snake.请使用UML工具设计一个简单的管理系统,可增加、删除笼子中的宠物,查询每个笼子中存放的宠物类型,(包括笼子为空的情况),统计笼中宠物的种类和数量。
类图--用例图如下:
CoopManager为管理类,管理笼子中的动物。
5,论述JSH的开发经验(JSH: jsf + srping + hiberante)
描述自己曾经参与过的JSH项目,以及自己在项目中所处的角色,担任的主要工作。
结合自己实际参与过的JSH项目,谈谈自己对JSH项目的理解。
查看本文来源