在经历几次的面试中,逐渐的发现自己的基础还是很薄弱,现整理一下面试问的问题,以鞭策自己
1、从技术的角度讲解一下Spring的原理?
答:
IOC控制反转,不是一种技术,而是一种思想,对象的生命周期不是由程序本身来决定,而是由容器来控制,所以称之为控制反转。
ioc底层原理使用技术
(1)xml配置文件
(2)dom4j解决xml
(3)工厂设计模式
(4)反射
aop是面向切面编程,aop是对oop(面向对象编程)的补充和完善,OOP引入封装、继承和多态性等概念建立一种对象的层次结构。当我们需要为不具备上下级关系的对象添加一系列公共的行为时,oop显得很无力。如日志,日志代码所在所有对象之间毫无关系。使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统,提高代码的复用性。
1) Aspect :切面,切入系统的一个切面。比如事务管理是一个切面,权限管理也是一个切面;
2) Join point :连接点,也就是可以进行横向切入的位置;
3) Advice :通知,切面在某个连接点执行的操作(分为: Before advice , After returning advice , After throwing advice , After (finally) advice , Around advice );
4) Pointcut :切点,符合切点表达式的连接点,也就是真正被切入的地方;
2、angular中数据的双向绑定怎么实现的?
答:利用[(
ngModel)]
符号进行双向绑定
3、javaWeb中web.xml的配置有哪些?
答:1)、指定欢迎页 <welcome-file>
2)、命名与定制url <servlet-name>
3)、定制初始化参数 <param-name>
4)、指定错误处理页面,可以通过“异常类型”或“错误码”来指定错误处理页面<error-page>
5)、设置过滤器:比如设置一个编码过滤器,过滤所有资源<filter>
6)、设置监听器<listener>
7)、设置会话(Session)过期时间,其中时间以分钟为单位<session-config>
4、你所知道的集合有哪些?
答:主要有两种。一种Collection,另一种Map。其中Collection包括Set、List和Queue,Set(无序无重)又包括HashSet、LinkedHashSet及TreeSet,List(有序有重)又包括ArrayList、LinkedList及Vector;其中Map包括HashTable、LinkedHashMap、HashMap及TreeMap
5、spring中有哪些注解,请简单说明一下?
答: @Controller 表现层
@Service 服务层
@Autowired 它可以对类成员变量、方法及构造函数进行标注
@RequestMapping URL 请求
@RequestParam URL 参数
@ModelAttribute 我们可以在需要访问Session属性的controller上加上 @SessionAttributes,然后在action需要的User参数上加上 @ModelAttribute,并保证两者的属性名称一致。SpringMVC就会自动将 @SessionAttributes定义的属性注入到ModelMap对象,在setup action的参数列表时,去ModelMap中取到这样的对象,再添加到参数列表。只要我们不去调用SessionStatus的setComplete()方法,这个对象就会一直保留在Session中,从而实现Session信息的共享。
@Cacheable @Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,这个稍后会进行说明。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。@Cacheable可以指定三个属性,value、key和condition。
@CacheFlush 刷新缓存
@Resource @Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@PostConstruct 在方法上加上注解 @PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean 初始化包括,实例化Bean,并装配Bean的属性(依赖注入))。
@PreDestroy 在方法上加上注解 @PreDestroy ,这个方法就会在Bean 被销毁前被Spring 容器执行。
@Repository 持久化层
@Component 注解你的组件类
@Scope 通过bean的scope属性来定义一个Bean的作用范围
@SessionAttributes Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,
以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。
@InitBinder 解决类型转换问题
@Required @Required负责检查一个bean在初始化时其声明的set方法是否被执行,当某个被标注了 @Required的Setter方法没有被调用,则Spring在解析的时候会抛出异常,以提醒开发者对相应属性进行设置。@Required注解只能标注在Setter方法之上。因为依赖注入的本质是检查Setter方法是否被调用了,而不是真的去检查属性是否赋值了以及赋了什么样的值。如果将该注解标注在非setXxxx()类型的方法则被忽略。
@Qualifier 明确指定bean的名称进行注入
6、oracle的分页,请说明一下?
答:分页的目的就是控制输出结果集大小,将结果尽快的返回,选择第21到40条记录存在两种方法
例1:
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21
例2:
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN 21 AND 40
7、jsp中闭包是怎么一回事?
答:变量 add 指定了函数自我调用的返回字值。
自我调用函数只执行一次。设置计数器为 0。并返回函数表达式。
add变量可以作为一个函数使用。非常棒的部分是它可以访问函数上一层作用域的计数器。
这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能。
计数器受匿名函数的作用域保护,只能通过 add 方法修改。
简单说:闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。
直观的说就是形成一个不销毁的栈环境。
例:var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();