面试问题(五)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试问题(五)相关的知识,希望对你有一定的参考价值。

参考技术A 1、什么是天线效应?怎么修复?

在芯片生产过程中,暴露的金属线或者多晶硅(polysilicon)等导体,就象是一根根天线,会收集电荷(如等离子刻蚀产生的带电粒子)导致电位升高。天线越长,收集的电荷也就越多,电压就越高。若这片导体碰巧只接了MOS 的栅,那么高电压就可能把薄栅氧化层击穿,使电路失效,这种现象我们称之为“天线效应”。

跳线,而且最好是往上跳线

增加对地反向偏置diode,

在信号线上加一组buffer,这个方法既可以规避antena,也可以为信号增加驱动能力

2、 请说一下memory的摆放规则??

调整Macro的位置、摆放方向,注意出Pin的方向,为出pin的区域留出足够的空间,避免产生狭窄的通道。另外当多个Memory共用相同的数据线或者地址线时,可以调整它们的位置,使它们的Pin对齐,这样连线会比较规整,对Congestion有帮助。

3、 Place之后有timing violation,应该怎么办?

出现timing violation后的第一步是分析那条path,找出违反的原因,然后才是解决办法。造成timing violation的原因很多,随便列几个常见的,

(a)clock tree不平衡:CTS的定义有错误;不合理的FF位置,比如,放在了一个很细很长的通道中。利用useful skew消除setup违反

(b)起始FF与终点FF的距离太长:用group把它们拉近

(c)xtalk的干扰:加大线间距离,不要用infinit timing window算xtalk

(d)detour走线造成的大的延迟:解决congestion问题

(e)fanout太大:忘记set_max_fanout,或者设定不合理,或者对某些net set_dont_touch了

(f)单元的驱动能力太小:upsizeing cell,去掉大驱动能力cell的dont_use属性,检查是否局部placement太密,没有空间sizeup了;或者换阈值,HVT-SVT-LVT

(g)hold timing violation与setup violation同时存在,工具无法做了。这种情况多半是SDC的问题,很少是真的,除非那是一个非常特殊的IO timing

后端修timing的一些手段:

4、 后端的时序约束相对于综合版本需要修改吗?

有时需要,

如果综合时使用了过小的clock period,要还原回来

可以去掉SDC里面的wire load, operation condition, ideal net, max area

有些为综合而设置的dont_touch, dont_use

有些为综合而设置的clock latency

4、 APR之前需要做什么样的检查?

检查所有库是否一致,版本是否一样,使用单位是否一样,是否有重名

用zero wire load model 来 report timing,结果应该和同样条件下DC/RC的结果非常一致

check timing 保证所有的单元都有约束

check design,不能看到任何input悬空,不能有3态门以外的ouput短路

5、做floorplan时要考虑哪些因素?

IO的排放顺序

power和IR-drop

模拟信号与数字信号的隔离

内部数据的流向

macro的面积和连接

critical timing模块的距离

congestion模块的走线资源

5、route_opt执行哪些步骤?

(a)Global Routing

GR将net分配给特定的金属层和global routing cells(Gcells),这一步没有实际布线

(b)Track Assignment

TA将每条net分配到特定的track,并且布下实际的金属线,TA不检查或遵守物理设计规则

(c)Detailed Routing

DR fix物理设计规则违规

6、APR每一步都干什么?

place之后,只优化setup。使用粗糙的RC抽取,global route

CTS之后,可以只优化setup,也可以优化setup和hold。使用粗糙的RC抽取,global route,如果clock net 已经route过了,clock就用detail route的结果。 时钟走线要double width和double space,高速(>500MHz)时钟要shielding

route之后,要优化setup和hold

7、在CTS后,如果ICG放在离clock root很近(clock insertion delay很短)的地方,为什么enable信号的setup不容易收敛?

因为一般enable信号来自某个FF,那个FF是clock tree上的一个叶子节点,那么到FF的clock path就是整个clock tree的delay(假设skew很小),而那个ICG的clock path不足一个clock tree的delay,当然就容易出现setup的违法了。也就是launching path太长, capture path只是clock path的部分(因为icg)的原因造成的,

这也就是icg 放的位置的tradeoff问题,

放的前面(high level), clock gating的效果好,可以关断更多的flops, 但是setup timing难收敛

放在后面(low level) , timing好收敛, gating效果一般

一般都是有多级ICG,可以控制各个级别的gating, tradeoff一下

icg 时钟⻔控单元,是 clock tree 的⼀部分。icg 的 clk pin 在路径中默认为 non-stop pin (ignore pin),即不会和其他 sink reg 或者 ram 的 clk pin 做 balance。 因此, 从 icg 的 Q pin 到 sink reg/ram 的clk pin 之间的延时, 就成为了 icg 和 reg/ram 之间天然存在的 skew。 极易导致 icg 的 setup 问题。⽽在 cts 之前, icg ⽆法被⼯具看到, 因此这部分延时在⼯具做 timing 分析时候会被忽略。 所以reg2icg 或者 ram2icg 的路径优化过于乐观, 导致 datapath 很⻓。 当后续 cts 看到 icg 之后, launch clock + datapath更⻓,对setup⾮常不利且很难修掉。因此,place阶段需要对icg进⾏overconstrain,引导⼯具考虑实际存在的 clock tree delay, 将 datapath 做短。

做法是在 icg 的 clk pin 上进⾏设置⼀段负的延时(set_clock_latency), ⽬的是告诉⼯具, 这边实际存在⼀段延时, 需要在 timing 分析时候在 capture 端加上⼀个负延时, 使得 setup 约束更紧,从⽽把 datapath 做短。在 place 之后, 这段 latency 需要 remove 掉, ⼯具会使⽤实际的 clock tree 来进⾏优化。对于 place 阶段的, icg overconstrain 来说, 对 reg2icg 和 ram2icg 等 to icg 的路径⽣效, 其他类似 reg2reg 的路径, 实际上 launch 和 capture 上的 overconstrain 会抵消掉, 因此没有影响。

8、数字树为什么需要balance?

对于快速设计,时钟树的skew和latency影响时序收敛、功耗和面积。balance 可以使得timing收敛简单些

对于慢速设计,时钟树的skew和latency对时序收敛的影响重要性下降。但是对于skew大的时钟树,工具修复时序会增加更多的面积和功耗。创造一个skew小的时钟树,虽然看似在时钟树上多用了buffer,但是会减少在修复时序问题时需要的buffer

所以,一个balance对于时序收敛、面积和功耗都是有好处的。

除了PPA(performance、power、area)之外,时钟树还应该robust。即所谓设计中的时钟树在任意设计需求的corner下都能满足时序。这点对提高良率的意义重大。

考虑OCV等因素后,对称使得时钟树更加强壮。到达每个Reg的时钟路径拓扑结构、级数和Inverter/Buf都一样是最理想的。(不考虑usefull skew的需求)

使用专用的、较少的Inverter/Buf也可以降低OCV对时钟树鲁棒性的影响

9、什么是闩锁效应,如何解决?

闩锁效应是CMOS工艺所特有的寄生效应,严重会导致电路的失效,甚至烧毁芯片。闩锁效应是由NMOS的有源区、P衬底、N阱、PMOS的有源区构成的n-p-n-p结构产生的,当其中一个三极管正偏时,就会构成正反馈形成闩锁。避免闩锁的方法就是要减小衬底和N阱的寄生电阻,使寄生的三极管不会处于正偏状态。

10、写个脚本统计人名

11、PVT全称是什么?如何影响我们的芯片

Process: FF,FNSP,TT,SNFP,SS

Voltage: 电压降低,延时变大

Tenperature: 具有温度反转效应,工艺在90nm以上的时候,随着温度的升高,delay增大,所以worst corner是PVTmax,但是65nm以下,随着温度的降低,delay也会增大,worst corner可能是PVTmax,也可能是PVTmin,这就是温度反转效应(Temperature Inversion Effect)

12、STA和动态仿真的区别?

第一点是激励波形,STA是不需要的激励波形的,但是需要SDC(Synopsys Design ConstrAInt,时序约束), 而时序仿真时严重依赖激励波形的;第二点是完整度,STA能够对数字电路中所有的时序路径进行全面的检查,而时序仿真在覆盖率上有一定限制;第三点是效率,STA的比较简单,速度更快,而生成仿真需要的激励,建立仿真环境可能费时费力;第四点是鲁棒性,STA能够考虑到电路中串扰噪声以及OCV(On Chip Violation, 片上偏差)的影响,提高芯片制成后的良率,而时序仿真做不到这一点。

13、STA在什么阶段做,各个阶段的STA都有什么区别?

阶段placectsroute

clock设置ideal clockpropagated clockpropagated clock

clock uncertainty -maxskew+jitter+marginjitter+marginjitter+margin

clock uncertainty -minskew+marginmarginmargin

关注点setupsetup+holdsetup+hold

14、如何解决x-talk?

1)upsize victim net driver, downsize aggressor net driver

2)increase wire space, shielding, change layer,change wire width

3)insert butter in victim net

能答出以上3条的,在工作中已经基本够用,但是还有两个不常用到的,是AMD的一个大牛告诉我的。

4)把与victim net相连的输入端改成Hi-Vth的单元

5)改变信号的timing window。这个不易做到,但是也是解决方法

15、如何设计PAD Ring?

大的流程是:

1)根据系统(其他芯片的)要求,芯片内部的floorplan,决定信号PAD的位置

2)计算出power PAD的个数,插入到信号PAD里面

3)加其他的PAD,比如IO filler,powercut,power on control,corner PAD,ESD等

细节可以包括:

1)如何计算core power PAD:估算corepower,再加50%,算出电流,除以每个core power IO的最大电流,就是大致的PAD个数。插入到信号PAD ring后,还要再计算powerEM,防止一根电源线上的电流过大。

2)如何计算IO powerPAD:从信号IO的功耗算起,同时计算SSO,取2个结果里面较大的

3)在什么地方插入powercut:不同的core电压和不同的IO电压之间,power island之间,数字和模拟电源之间。

4)power on control PAD,一般每个IOring需要一个

5)ESD一般要加在每个不同的电源之间

16、分析X-talk后都输出哪些报告和结果?如何利用这些结果改善设计?

X-talk的分析结果中,至少要包含X-talk glitch和X-talk delay 的报告和数据,

可以把glitch报告读回到P&Rtool里面,让tool自动解决这些问题,也可以手动

X-talk delay就是incrementaldelay,反标回网表中以后,再做一次时序优化

17、设计的哪些地方容易出现IR-drop的问题?

1)从电源布线的角度看,那些远离电源端的地方,布线少的地方,比如wire bond芯片的中间,flip chip的四角

2)从switching activity的角度看,toggle rate高并且celldensiy高的地方IRdrop大,频率高的地方动态IR drop大

18、什么叫克隆(cloning)和缓冲(buffering),什么情况下用到这2种技术?

cloning:有多个sink的情况下,不改变逻辑功能把当前cell复制一份,分别驱动下一级的cell,这样可以减少当前单元的负载,从而获得更好的时序,缺点是会增加上一级的负载

buffering:不改变信号的情况下对信号再生,提高它的驱动能力,通常是两级反相器构成,可以提高电路的运行速度,有时也用来当延时单元,特点是不会增加上一级的负载

在多个sink的时序都比较紧的情况下适合用cloning,如果sink对timing的要求区别挺大的,一部分时序较紧的由上一级直接驱动,剩下的可以加一级buffer后驱动

19、大扇出net的buffer tree和CTS在时序和做法上的区别?

buffer tree和clocktree的共同点是它们都是解决high fanout net的问题,只不过要求不同而已

buffer tree要求满足maxtrans/fanout/cap,有时还要满足setup/hold timing

clocktree不但要满足上面的所有要求,还有skew,max/min latency的要求

20、LEF是什么?与GDS的区别是什么?

LEF是一种简化版的GDS,它只包括size和metal层有关的信息,比如pin,blockage等,其他baselayer的东西只在GDS里面可以看到。

同时LEF还有一些GDS里面没有的信息,比如,metal的R,C,routing and placement rule等

LEF是一个文本文件,可以修改编辑。GDS是二进制文件,比较难修改

21、对标准单元所说的9 track和12track是什么意思?(同一种工艺下)这两种单元有什么区别?

一般site width就是metal 2 pitch,比如SMIC18 的 0.56 x 5.04 , 0.56 就是metal 2pitch,

因为std cell pin基本上都是由metal 2连接出来的,高度一般都是 site width的整数倍,比如7, 8, 9 ,10 ,12 倍,也就叫做7/8/9/10/12 track单元,比如 0.56 x 5.04 的就是9 track, 0.56 x 3.92 的就是 7 track,0.2 x 2.4 ( SMIC 65 ) 是12 track, 0.2 x 1.8 ( TSMC65) 是9 track,

一般来说9 track是 属于标准size,7 track属于小size,也就是低功耗一些,速度慢些,10、12 track 是高速,一般 metal1的rail做的更宽,管子好像没啥区别,rail做的宽自然能走更多的电流,自然速度就快了功耗大了,有的还添加metal2 rail比如65nm以下的库,这样速度更快了,选几个track 是由设计目标决定的,如果简单些 ,就选9track标准带tap的,比较方便低功耗选7 track,timing不够就选12 track的,

22、 时钟走线一般用那层金属?

假设共有8层金属层

最底层M1/2一般很薄,走线宽度最小,RC一般最大,而且会被cell的pin占去很多资源,肯定不适合做clockwire。

最高1/2层M7/8一般很厚,走线宽度大,RC很小,适合大驱动的clockbuffer走线。如果是用铜做金属层的话,最上面还会有一层极厚的铝金属层,一般不用做信号线的走线。

中间几层M3/4/5/6的厚度,宽度都适中,如果使用doublewidth,double space的走线的话,RC也比较小,也可以做clock wire。

如果考虑到VIA增加的电阻,一味地使用最高层不一定会得到最快的clocktree。

但是一般信号走线大多是先用下层的金属,所以建议根据各层的RC和整个设计的congestion来选择clockwire的层数。

如果最高1/2层M7/8的RC远小于中间几层M3/4/5/6的RC,就选最高1/2层

如果最高1/2层M7/8的RC与中间几层M3/4/5/6的RC相差不大,在很拥堵时,还是选最高1/2层;不太拥堵时,选中间几层里面的高层M5/6;根本没有拥堵时,用中间层里面的底层M3/4

23、设置虚拟时钟的作用?

上图是一个block (不是chip),问

1)有多少timing path?

2)place之后,假设setup和hold都正好为0ns,然后插入时钟树,树的完全平衡的,WC的时钟树insertiondelay是0.2ns,BC的insertion delay是0.1ns,这时做STA,会看到timing violation吗?有多少条violation,各违反了多少ns?他们是真的吗?如何解决?

答案:input hold -0.1, output setup0.2

如何修复违法是有些难度的问题,

简单的回答是:

在input delay上加clock insertiondelay的值(BC 0.1 WC 0.2),

在output delay上减去clock insertiondelay的值(BC 0.1 WC 0.2)

但是当有上千个input和output port时,做起来比较麻烦,有个非常简单的方法,想到了,就是满分!

设一个虚拟时钟,与clk同频同相,把所有input,output delay都指定到那个虚拟时钟上,CTS后,只要在虚拟时钟上加上(BC 0.1 WC 0.2)的latency就好了

24、什么是ESD?在什么地方需要插入ESD 电路?

ESD(Electro-Static discharge)指静电释放,一般在IO 的Input 加ESD电路,在IC的测试、封装、运输、使用等过程中可以把静电有效泄放避免对CMOS 栅极的损伤,从而有效地保护IC。

二极管有一个特性:正向导通反向截止(不记得就去翻前面的课程),而且反偏电压继续增加会发生雪崩击穿(Avalanche Breakdown)而导通,我们称之为钳位二极管(Clamp)。这正是我们设计静电保护所需要的理论基础,我们就是利用这个反向截止特性让这个旁路在正常工作时处于断开状态,而外界有静电的时候这个旁路二极管发生雪崩击穿而形成旁路通路保护了内部电路或者栅极(是不是类似家里水槽有个溢水口,防止水龙头忘关了导致整个卫生间水灾)。PN结的击穿分两种,分别是电击穿和热击穿,电击穿指的是雪崩击穿(低浓度)和齐纳击穿(高浓度),而这个电击穿主要是载流子碰撞电离产生新的电子-空穴对(electron-hole),所以它是可恢复的。

25、DFM包含什么?

后端主要是double via, spead wire width/space, 还有add dummy metal,使metal desity更均匀

26、怎么增强FloorPlan和Placement的相关性?

可以使用命令create_fp_placement、legalize_fp_placement来执行VF(Virtual Flat)Placement,提高floorplan对congestion和timing的影响

它的特点是:

(a)标准单元和non-fixed的macro被legally place

(b)摆放默认是wirelength驱动的

(c)不作逻辑优化

(d)默认执行hierarchy-aware摆放

27、ICC是怎么计算Congestion的?怎么分析和解决Congestion?

用穿过GRC(global routing cell)的nets数目除以GRC中可供使用的routing tracks

分析:

(a)使用命令report_congestion -grc_based -by_layer -routing_stage global生成congestion map(heat map)来进行可视化,map上越红越亮的地方表示阻塞越大

(b)对比cell density map和congestion map,如果两者有一致性的话,可能是High cell density引起了阻塞

28、怎么分析IR-drop?

1、指定(a)Power/Ground net pair和target IR-drop,(b)power budget,(c)power pad information后,做PNS(power network synthesis),synthesize_fp_rail。通过IR-drop heat map进行可视化,帮助分析,analyze_fp_rail。

2、如果不满足target IR-drop,修改power network约束重新综合。

3、可以创建Virtual Power/Ground pads进行分析,如果添加新的pad有用且必要的话,那就重做floorplan,加入更多的power pad cell

29、在FloorPlan阶段如何去优化timing?

执行in-place优化,optimize_fp_timing -fix_design_rule <-effort high>

具体地:

(a)cell sizing,buffer insertion,AHFS(Automatic high fanout synthesis)

(b)改善timing和DRC违规

(c)合法化placement

如果timing仍然不可接受,就修改Floorplan,或者修改设计约束或partitioning重新综合(DC-T)

30、DC-T怎么做?

原文链接: 后端一些常考知识点 - 笑着刻印在那一张泛黄 - 博客园 (cnblogs.com)

[Java面试五]Spring总结以及在面试中的一些问题.

1.谈谈你对spring IOC和DI的理解,它们有什么区别?

IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理,简单说,就是创建UserService对象控制权被反转到了Spring框架

DI:Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件

 

面试题: IoC 和 DI的区别?

IoC 控制反转,指将对象的创建权,反转到Spring容器 , DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入

2.BeanFactory 接口和 ApplicationContext 接口有什么区别 ?

    ①ApplicationContext 接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
    ②ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现 

开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory

 

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
IHelloService helloService = (IHelloService) beanFactory.getBean("helloService");
helloService.sayHello();

3.spring配置bean实例化有哪些方式?

    1)使用类构造器实例化(默认无参数)

 

<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>
    2)使用静态工厂方法实例化(简单工厂模式)

 

 

//下面这段配置的含义:调用Bean2Factory的getBean2方法得到bean2
<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2"></bean>
    3)使用实例工厂方法实例化(工厂方法模式)

 

 

//先创建工厂实例bean3Facory,再通过工厂实例创建目标bean实例
<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>

4.简单的说一下spring的生命周期?

    1)在配置 <bean> 元素,通过 init-method 指定Bean的初始化方法,通过 destroy-method 指定Bean销毁方法

 

<beanid="lifeCycleBean"class="cn.itcast.spring.d_lifecycle.LifeCycleBean"init-method="setup"destroy-method="teardown"></bean>
需要注意的问题:

 

    *  destroy-method 只对 scope="singleton" 有效 

    *  销毁方法,必须关闭ApplicationContext对象(手动调用),才会被调用

 

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
applicationContext.close();

    2)Bean的完整生命周期 (十一步骤)【了解内容,但是对于spring内部操作理解有一定帮助】

①instantiate bean对象实例化

②populate properties 封装属性

③如果Bean实现BeanNameAware 执行 setBeanName

④如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext

⑤如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization,BeanPostProcessor接口提供钩子函数,用来动态扩展修改Bean。(程序自动调用后处理Bean)

 

publicclassMyBeanPostProcessorimplementsBeanPostProcessor{
publicObject postProcessAfterInitialization(Object bean,String beanName)
throwsBeansException{
System.out.println("第八步:后处理Bean,after初始化。");
//后处理Bean,在这里加上一个动态代理,就把这个Bean给修改了。
return bean;//返回bean,表示没有修改,如果使用动态代理,返回代理对象,那么就修改了。
}
publicObject postProcessBeforeInitialization(Object bean,String beanName)
throwsBeansException{
System.out.println("第五步:后处理Bean的:before初始化!!");
//后处理Bean,在这里加上一个动态代理,就把这个Bean给修改了。
return bean;//返回bean本身,表示没有修改。
}
}
注意:这个前处理Bean和后处理Bean会对所有的Bean进行拦截。
⑥如果Bean实现InitializingBean 执行 afterPropertiesSet

 

⑦调用<bean init-method="init"> 指定初始化方法 init

⑧如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization

⑨执行业务处理

⑩如果Bean实现 DisposableBean 执行 destroy

?调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

5.请介绍一下Spring框架中Bean的生命周期和作用域

 

(1)bean定义

    在配置文件里面用<bean></bean>来进行定义。

(2)bean初始化

    有两种方式初始化:

A.在配置文件中通过指定init-method属性来完成

B.实现org.springframwork.beans.factory.InitializingBean接口

(3)bean调用

    有三种方式可以得到bean实例,并进行调用

(4)bean销毁

    销毁有两种方式

A.使用配置文件指定的destroy-method属性

B.实现org.springframwork.bean.factory.DisposeableBean接口

##作用域

singleton

当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。

prototype

Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean() 方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用 singleton作用域

request

在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用 域仅在基于web的Spring ApplicationContext情形下有效。

session

在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

global session

在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于 web的Spring ApplicationContext情形下有效。

 

6.Bean注入属性有哪几种方式?

 
spring支持构造器注入和setter方法注入
    构造器注入,通过 <constructor-arg> 元素完成注入
    setter方法注入, 通过<property> 元素完成注入【开发中常用方式】

7.什么是AOP,AOP的作用是什么?

面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足,除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理

Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP 提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上。允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强

 

8.Spring的核心类有哪些,各有什么作用?

BeanFactory:产生一个新的实例,可以实现单例模式

BeanWrapper:提供统一的get及set方法

ApplicationContext:提供框架的实现,包括BeanFactory的所有功能

9.Spring里面如何配置数据库驱动?

使用”org.springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。示例如下:
  1. <bean id=”dataSource”> 
  2.     <property name=”driverClassName”> 
  3.         <value>org.hsqldb.jdbcDriver</value>
  4.     </property> 
  5.     <property name=”url”> 
  6.         <value>jdbc:hsqldb:db/appfuse</value> 
  7.     </property> 
  8.     <property name=”username”><value>abc</value></property> 
  9.     <property name=”password”><value>abc</value></property> 
  10. </bean> 

10.Spring里面applicationContext.xml文件能不能改成其他文件名?

ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的 位置。示例如下: 

 

  1. <listener> 
  2.     <listener-class>org.springframework.web.context.ContextLoaderListener
  3.         <context-param> 
  4.          <param-name>contextConfigLocation</param-name> 
  5.          <param-value>/WEB-INF/xyz.xml</param-value> 
  6.         </context-param>   
  7.     </listener-class> 
  8. </listener> 

11.Spring里面如何定义hibernate mapping?

 

添加hibernate mapping 文件到web/WEB-INF目录下的applicationContext.xml文件里面。示例如下:

  1. <property name=”mappingResources”> 
  2.     <list> 
  3.         <value>org/appfuse/model/User.hbm.xml</value> 
  4.     </list> 
  5. </property>

12.Spring如何处理线程并发问题?

Spring使用ThreadLocal解决线程安全问题

我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全状态采用ThreadLocal进行处理,让它们也成为线程安全的状态,因为有状态的Bean就可以在多线程中共享了。

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。

在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。

而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。

由于ThreadLocal中可以持有任何类型的对象,低版本JDK所提供的get()返回的是Object对象,需要强制类型转换。但JDK5.0通过泛型很好的解决了这个问题,在一定程度地简化ThreadLocal的使用。

概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

13.为什么要有事物传播行为?

 

14.介绍一下Spring的事物管理

    事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。

开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管 理,可以通过Spring的注入来完成此功能。spring提供了几个关于事务处理的类:

TransactionDefinition //事务属性定义

TranscationStatus //代表了当前的事务,可以提交,回滚。

PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类 AbstractPlatformTransactionManager,我们使用的事务管理类例如 DataSourceTransactionManager等都是这个类的子类。

一般事务定义步骤:

 

  1. TransactionDefinition td =newTransactionDefinition();
  2. TransactionStatus ts = transactionManager.getTransaction(td);
  3. try
  4.     //do sth
  5.     transactionManager.commit(ts);
  6. }catch(Exception e){
  7.     transactionManager.rollback(ts);
  8. }
    spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。

 

编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.

 

  1. void add(){
  2.     transactionTemplate.execute(newTransactionCallback(){
  3.         pulic Object doInTransaction(TransactionStatus ts){
  4.          //do sth
  5.         }
  6.     }
  7. }
声明式:

 

使用TransactionProxyFactoryBean:PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly

围绕Poxy的动态代理 能够自动的提交和回滚事务

org.springframework.transaction.interceptor.TransactionProxyFactoryBean

PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与 PROPAGATION_REQUIRED类似的操作。

15.解释一下Spring AOP里面的几个名词

切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。

连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。

通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。

切入点(Pointcut):匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。

目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。

AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。

织入(Weaving):把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。

 

16.通知有哪些类型?

前置通知(Before advice):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
返回后通知(After returning advice):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。 
抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知。 
后通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 
环绕通知(Around Advice):包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。 
  
环绕通知是最常用的一种通知类型。大部分基于拦截的AOP框架,例如Nanning和JBoss4,都只提供环绕通知。 
切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键,这使得AOP不同于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次。 例如,一个提供声明式事务管理的around通知可以被应用到一组横跨多个对象中的方法上(例如服务层的所有业务操作)。







以上是关于面试问题(五)的主要内容,如果未能解决你的问题,请参考以下文章

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

java面试题汇总五

java面试题汇总五

每天五个java相关面试题--spring篇

Java面试技巧