1、四种会话跟踪技术作用域
(1)page:一个页面
(2)request::一次请求
(3)session:一次会话
(4)application:服务器从启动到停止
2、MVC 的各个部分都有那些技术来实现?如何实现
MVC 是 Model-View-Controller 的简写。
Model 代表的是应用的业务逻辑(通过 JavaBean,EJB 组件实现)
View 是应用的表示面(由 JSP 页面产生)
Controller 是提供应用的处理过程控制(一般是一个 Servlet)
通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用。
3、web.xml 文件中可以配置哪些内容
web.xml 用于配置 Web 应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验
证方式、错误页面.
4、session 和 cookie 有什么区别
1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session。
3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 COOKIE。
4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
5、Java 反射技术主要实现类有哪些,作用分别是什么
在 JDK 中,主要由以下类来实现 Java 反射机制,这些类都位于 java.lang.reflect 包中
1)Class 类:代表一个类
2)Field 类:代表类的成员变量(属性)
3)Method 类:代表类的成员方法
4)Constructor 类:代表类的构造方法
5)Array 类:提供了动态创建数组,以及访问数组的元素的静态方法
6、讲一下什么是 Spring
Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础性服务的一套框架,目的是用
于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于 XML 的
配置、基于注解的配置、基于 Java 的配置。
主要由以下几个模块组成:
Spring Core:核心类库,提供 IOC 服务;
Spring Context:提供框架式的 Bean 访问方式,以及企业级功能(JNDI、定时任务等);
Spring AOP:AOP 服务;
Spring DAO:对 JDBC 的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的 ORM 框架的支持;
Spring Web:提供了基本的面向 Web 的综合特性,例如多方文件上传;
Spring MVC:提供面向 Web 应用的 Model-View-Controller 实现。
7、Spring 的 IOC 和 AOP 机制
我们是在使用 Spring 框架的过程中,其实就是为了使用 IOC,依赖注入,和 AOP,面向切面编程,这两
个是 Spring 的灵魂。
主要用到的设计模式有工厂模式和代理模式。
IOC 就是典型的工厂模式,通过 sessionfactory 去注入实例。
AOP 就是典型的代理模式的体现。
代理模式是常用的 java 设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类
预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在
关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通
过调用委托类的对象的相关方法,来提供特定的服务。
spring 的 IOC 容器是 spring 的核心,spring AOP 是 spring 框架的重要组成部分。
在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例。但在
spring 里创建被调用者的工作不再由调用者来完成,因此控制反转(IOC);创建被调用者实例的工作通
常由 spring 容器来完成,然后注入调用者,因此也被称为依赖注入(DI),依赖注入和控制反转是同一
个概念。
面向方面编程(AOP)是以另一个角度来考虑程序结构,通过分析程序结构的关注点来完善面向对象编程
(OOP)。OOP 将应用程序分解成各个层次的对象,而 AOP 将程序分解成多个切面。spring AOP 只实现
了方法级别的连接点,在 J2EE 应用中,AOP 拦截到方法级别的操作就已经足够。在 spring 中,未来使 IoC
方便地使用健壮、灵活的企业服务,需要利用 spring AOP 实现为 IoC 和企业服务之间建立联系。
IOC:控制反转也叫依赖注入。利用了工厂模式
将对象交给容器管理,你只需要在 spring 配置文件总配置相应的 bean,以及设置相关的属性,让 spring 容
器来生成类的实例对象以及管理对象。在 spring 容器启动的时候,spring 会把你在配置文件
中配置的
bean 都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些 bean 分配给你需要 调用这些
bean 的类(假设这个类名是 A),分配的方法就是调用 A 的 setter 方法来注入,而不需要你在 A 里面 new 这些 bean 了。
注意:面试的时候,如果有条件,画图,这样更加显得你懂了
spring ioc 初始化流程
AOP:面向切面编程。(Aspect-Oriented Programming)
AOP 可以说是对 OOP 的补充和完善。OOP 引入封装、继承和多态性等概念来建立一种对象层次结构,
用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP 则显得无能为力。
也就是说,OOP 允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代
码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在 OOP 设计中,它
导致了大量代码的重复,而不利于各个模块的重用。
将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体
业务逻辑)中去。
实现 AOP 的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装
饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编
译器可以在编译期间织入有关“方面”的代码. 简单点解释,比方说你想在你的 biz 层所有类中都加上一个打印‘你好’的功能,这时就可以用 aop 思想来做. 你先写个类写个类方法,方法经实现打印‘你好’,然后 Ioc 这个类 ref=“biz.*”让每个类都注入即可实现。
8、Spring 中 Autowired 和 Resource 关键字的区别
@Resource 和@Autowired 都是做 bean 的注入时使用,其实@Resource 并不是 Spring 的注解,它的包
是 javax.annotation.Resource,需要导入,但是 Spring 支持该注解的注入。
1、共同点
两者都可以写在字段和 setter 方法上。两者如果都写在字段上,那么就不需要再写 setter 方法。
2、不同点
(1) @Autowired
@Autowired 为 Spring 提 供 的 注 解 , 需 要 导 入 包
org.springframework.beans.factory.annotation.Autowired;只按照 byType 注入。
public class TestServiceImpl {
// 下面两种@Autowired 只要使用一种即可
@Autowired
private UserDao userDao; // 用于字段上
@Autowired
public void setUserDao(UserDao userDao) { // 用于属性的方法上
this.userDao = userDao;
}
}
@Autowired 注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允 许
null 值,可以设置它的 required 属性为 false。如果我们想使用按照名称(byName)来装配,可以结
合@Qualifier 注解一起使用。如下:
public class TestServiceImpl
{ @Autowired
@Qualifier("userDao")
private UserDao userDao;
}
(2) @Resource
@Resource 默认按照 ByName 自动注入,由 J2EE 提供,需要导入包 javax.annotation.Resource。
@Resource 有两个重要的属性:name 和 type,而 Spring 将@Resource 注解的 name 属性解析为 bean
的 名字,而 type 属性则解析为 bean 的类型。所以,如果使用 name 属性,则使用 byName 的自动
注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不制定 name 也不制定 type 属性,这时将通 过反射机制使用 byName 自动注入策略。
public class TestServiceImpl {
// 下面两种@Resource 只要使用一种即可
@Resource(name="userDao")
private UserDao userDao; // 用于字段上
@Resource(name="userDao")
public void setUserDao(UserDao userDao) { // 用于属性的 setter 方法上
this.userDao = userDao;
}
}
注:最好是将@Resource 放在 setter 方法上,因为这样更符合面向对象的思想,通过 set、get 去操作属 性,而不是直接去操作属性。
@Resource 装配顺序:
①如果同时指定了 name 和 type,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异
常。
②如果指定了 name,则从上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常。
③如果指定了 type,则从上下文中找到类似匹配的唯一 bean 进行装配,找不到或是找到多个,都会抛 出
异常。
④如果既没有指定 name,又没有指定 type,则自动按照 byName 方式进行装配;如果没有匹配,则回 退
为一个原始类型进行匹配,如果匹配则自动装配。 @Resource 的作用相当于@Autowired,只不@Autowired 按照 byType 自动注入。
9、依赖注入的方式有几种,各是什么
一、构造器注入
将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。
优点:
对象初始化完成后便可获得可使用的对象。
缺点:
当需要注入的对象很多时,构造器参数列表将会很长;
不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函
数,麻烦。
二、setter 方法注入
IoC Service Provider 通过调用成员变量提供的 setter 函数将被依赖对象注入给依赖类。
优点:
灵活。可以选择性地注入需要的对象。
缺点:
依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用。
三、接口注入
依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参
数就是要注入的对象。
优点
接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。
缺点:
侵入行太强,不建议使用。
PS:什么是侵入行?
如果类 A 要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是
侵入性。
10、解释一下 spring bean 的生命周期
首先说一下 Servlet 的生命周期:实例化,初始 init,接收请求 service,销毁 destroy;
Spring 上下文中的 Bean 生命周期也类似,如下:
(1)实例化 Bean:
对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 bean 时,或初始化 bean 的时候需要注入 另一个尚未初始化的依赖时,
容器就会调用 createBean 进行实例化。对于 ApplicationContext 容器,当 容器启动结束后,通过获取 BeanDefinition 对象中的信息,
实例化所有的 bean。
(2)设置对象属性(依赖注入):
实例化后的对象被封装在 BeanWrapper 对象中,紧接着,Spring 根据 BeanDefinition 中的信息 以及 通过 BeanWrapper 提供的设置属性
的接口完成依赖注入。
(3)处理 Aware 接口:
接着,Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean:
①如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId)方法,此处传递的就是 Spring 配置文
件中 Bean 的 id 值;
②如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory()方法,传递的 是 Spring 工厂自身。
③如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用
setApplicationContext(ApplicationContext)方法,传入 Spring 上下文;
(4)BeanPostProcessor:
如果想对 Bean 进行一些自定义的处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,那将会调用
postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean 与 init-method:
如果 Bean 在 Spring 配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。
(6)如果这个 Bean 实现了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization(Object obj, String s)方法;由于
这个方法是在 Bean 初始化结束时调用的,所以可以被应用于内存或缓存技术;
以上几个步骤完成后,Bean 就已经被正确创建了,之后就可以使用这个 Bean 了。
(7)DisposableBean:
当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用其实现的
destroy()方法;
(8)destroy-method:
最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法。