<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
有关java各种框架的基础设计,笔者经验之谈,算是小结吧!:)
一,
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>所指定的页面。</navigation-case></from-outcome></navigation-case></from-view-id></from-view-id></navigation-case></from-view-id></navigation-case></from-view-id></navigation-rule></navigation-rule>
2,请简要的描述如何在BackingBean中扩展验证器。
首先在
BackingBean
定义一个验证方法,比如
nameValidator()
然后在
jsf
输入组件的
validator
属性中进行设置,例如
<inputsecret id="userInfo_name" value="#{userInfoAction.name}" required="true"></inputsecret>
validator="#{userInfoAction.nameValidator}"/>
3,JSF的事件处理包括:动作事件,即时事件,值变事件,phase事件,请用简要描述jsf中的值变事件。
如果使用者改变了JSF输入组件的值后,就会发生值变事。
如果您想要处理这个事件,有两种方式,
一是直接设定JSF输入组件的valueChangeListener属性,例如
<selectonemenu value="#{user.locale}"></selectonemenu>
onchange="this.form.submit();"
valueChangeListener="#{user.changeLocale}">
另一个方法是实现javax.faces.event.ValueChangeListener接口,并定义其processValueChange()方法,
四,系统设计部分
1,请画出DAO模式的UML类图,并简要描述该模式的原理以及适用范围。
Dao模式,由于根据数据源不同,数据访问也不同。根据存储的类型(关系数据库、面向对象数据库、文件等等)和供应商实现不同,持久性存储(比如数据库)的访问差别也很大。而且有时候我们的项目需要部署不同的数据库,因此在这些情况下,可以使用Dao模式,
如图所示,如果考虑为三种不同类型的数据库来实现这个策略,我们可以考虑采用抽象工厂设计模式.假设.这个工厂创建了CustomerDAO,AccountDAO,OrderDAO的一系列的DAO,该策略运用了在抽象工厂中产生的工厂类中的工厂方法的实现.
如下图所示:
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 309pt" type="#_x0000_t75"><imagedata o:title="pic1" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"></imagedata></shape>
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
进行通讯,从而简化了它们之间的依赖关系。
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 309pt" type="#_x0000_t75"><imagedata o:title="pic1" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png">类图如下:</imagedata></shape></span></shapetype></span></shapetype>
<shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shape style="WIDTH: 414.75pt; HEIGHT: 309pt" type="#_x0000_t75"><imagedata o:title="pic1" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/HuDon/pic2.BMP"></imagedata></shape></span></shapetype></span></shapetype>
<shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shape style="WIDTH: 414.75pt; HEIGHT: 309pt" type="#_x0000_t75"><imagedata o:title="pic1" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"><div style="TEXT-AUTOSPACE: ideograph-numeric">3,设计题:关于某一个系统的权限管理。业务规则如下</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(1) ,整个系统(包含多个模块)有一个管理员,可以管理整个系统的权限管理;</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(2) ,每个模块有自己的管理员,本模块的管理员只能管理本模块的权限。</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(3) ,某一个管理员是可以同时管理多个部门的。</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(4) ,管理员不能查看数据,只能查看文件状态。员工可以查看数据以及文件的状态。</div> <div style="TEXT-AUTOSPACE: ideograph-numeric">(5) ,管理员和管理员之间,管理员和普通员工之间允许相互调动。</div></imagedata></shape></span></shapetype></span></shapetype>
<shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: " times new roman mso-fareast-font-family: sans unicode mso-ansi-language: mso-fareast-language: mso-bidi-language: ar-sa><shape style="WIDTH: 414.75pt; HEIGHT: 309pt" type="#_x0000_t75"><imagedata o:title="pic1" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"><div style="TEXT-AUTOSPACE: ideograph-numeric">请使用UML工具设计一个简单的管理系统</div> <div style="TEXT-AUTOSPACE: ideograph-numeric"></div> <div style="TEXT-AUTOSPACE: ideograph-numeric">用例图如下:</div> <div style="TEXT-AUTOSPACE: ideograph-numeric"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/HuDon/pic3.BMP"></div> <div style="TEXT-AUTOSPACE: ideograph-numeric"> <div><span style="COLOR: blue">类图如下:</span></div> <div><span style="COLOR: blue"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/HuDon/pic4.BMP"></span></div> <div><span style="COLOR: blue"><div> <span style="COLOR: blue">DepartmentManager</span><span style="COLOR: blue">类记录管理员和部门之间的管理关系</span> </div> <div> <span style="COLOR: blue">Authorities</span><span style="COLOR: blue">类定义不同角色所拥有的不同权限,例如员工可以读文件,管理员可以看到文件状态等。</span> </div> <div> <span style="COLOR: blue">EmployeeActorLog </span><span style="COLOR: blue">:定义员工的角色。</span> </div> <div><span style="COLOR: blue"><div style="TEXT-AUTOSPACE: ideograph-numeric">4,Anne的宠物小屋有12个笼子,每个笼子可以放不同的动物,但只能放1只或0只,包括猫Cat,狗Dog,蛇Snake.请使用UML工具设计一个简单的管理系统,可增加、删除笼子中的宠物,查询每个笼子中存放的宠物类型,(包括笼子为空的情况),统计笼中宠物的种类和数量。</div> <div><span style="COLOR: blue"><div><span style="COLOR: blue">类图--用例图如下:</span></div> <div> <span style="COLOR: blue">CoopManager</span><span style="COLOR: blue">为管理类,管理笼子中的动物。</span> </div></span></div></span></div></span></div> <div><span style="COLOR: blue"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/HuDon/pic5.BMP"></span></div> <div><span style="COLOR: blue"><div style="TEXT-AUTOSPACE: ideograph-numeric">5,论述JSH的开发经验(JSH: jsf + srping + hiberante)</div> <div style="TEXT-AUTOSPACE: ideograph-numeric"> <span> </span>描述自己曾经参与过的JSH项目,以及自己在项目中所处的角色,担任的主要工作。</div> <div style="TEXT-INDENT: 21pt; TEXT-AUTOSPACE: ideograph-numeric">结合自己实际参与过的JSH项目,谈谈自己对JSH项目的理解。</div></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> <div><span style="COLOR: blue"></span></div> </div></imagedata></shape></span></shapetype></span></shapetype>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1782817