spring面试相关总结

1、spring控制器的类名

org.springframework.stereotype.Controller

其他的介绍:

org.springframework.stereotype.Service 

org.springframework.web.context.ContextLoaderListener


ContextLoaderListener
在web项目启动时候创建 Spring环境的(初始化ioc容器),并且把ioc(Inversion Of Control反向控制器)容器放入ServletContext中(可以打印出key来查看)。 

contextConfigLocation是一个全局变量名。
查看ContextLoader的源码:
public static final String CONFIG_LOCATION_PARAM = "contextConfigLocation";93行;
wac.setConfigLocation(servletContext.getInitParameter(CONFIG_LOCATION_PARAM));253行
可以看出,是listener执行的时候,获取的初始化变量而已。

DispatcherServlet
核心控制器,和struts2中的filter,dwr中的dwrServlet,一样的前置控制器。 拦截请求,分发请求。


2、ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别

ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别

spring通过在web.xml 中配置ContextLoaderListener 来加载context配置文件,在DispatcherServlet中也可以来加载spring context配置文件

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>


<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<description>ddd</description>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-servlet.xml</param-value>---------也可以加载application.xml
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>

DispatcherServlet所加载的applicationContext可以认为是mvc私有的context,由于保存在servletContext中的key值与通过ContextLoaderListener加载进来的applicationContext使用的 key值不相同,因此如果只使用DispatcherServlet加载context的话,如果程序中有地方使用 WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext) 来试图获取applicationContext时,就会抛出"No WebApplicationContext found: no ContextLoaderListener registered?"的exception。


3、spring事物失效问题解决

http://icanfly.iteye.com/blog/778401

a.applicationContext.xml中,去掉对controller的扫描

<context:component-scan base-package="com.trans">

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<property name="dataSource" ref="dataSource" />

</bean>

b.**-servlet.xml 中,去掉对 service的扫描,加入对controller的扫描

<context:component-scan base-package="com.trans">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>

c.事务的配置只有在 applicationContext.xml中才会起作用,即

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

必须配置在 applicationContext.xml 中

d.用事务去控制的service,不能加try catch去捕获异常,否则不能被spring拦截到,事务就失效了。

因为spring的context是父子容器,所以会产生冲突,由ServletContextListener产生的是父容器,springMVC产生的是子容器,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。 
还有一种方式是将service层改用xml配置,其实这样做也是变相的让springmvc无法扫描service,而只能依赖父窗口也就是ServletContextListener来进行初始化,这样同样被赋予了事务性。 


4、spring中lib中常用的jar包

cglib-2.2.jar GLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充

commons-beanutils-1.8.3.jar

commons-collections-3.1.jar

dom4j-1.6.1.jar

httpclient-4.2.1.jar

jackson-all-1.9.10.jar

log4j-1.2.15.jar

mail.jar

servlet-api.jar

jsp-api.jar


5、spring @ResponseBody返回json格式数据(list map 结构体等自动转换)


在dispatherservlet中扫描的srpingmvc-servlet中配置

<bean name="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>

参考 spingmvc3 返回json


6、web.xml元素及加载顺序

首先可以确定的一点是, 不同类型节点的加载顺序与它们在web.xml里出现的次序无关,即不会因为filter写在listener之前而先加载fiter.

    就<context-param>、<listener>、<filter>、<servlet>四种节点而言,启动服务器时的加载顺序是context-param --> listener --> filter --> servlet

    首先是<context-param>,启动一个WEB项目的时候,WEB容器会读取配置描述符文件(web.xml)中的<context-param>节点信息。<context-param>它用于向 ServletContext 提供键值对,即应用程序上下文信息。在初始化listener, filter和servlet时到可能会用到这些信息。


7、Spring框架下获取Bean的几种方式

http://blog.csdn.net/wayfoon322/article/details/2420541

通过xml配置文件bean配置在xml里面,spring提供多种方式读取配置文件得到ApplicationContext.

第一种方式:FileSystemXmlApplicationContext

通过程序在初始化的时候,导入Bean配置文件,然后得到Bean实例:
ApplicationContext ac = new
 FileSystemXmlApplicationContext("applicationContext.xml")
ac.getBean("beanName");

第二种方式:WebApplicationContextUtil

在B/S系统中,通常在web.xml初始化bean的配置文件,然后由WebAppliCationContextUtil得到ApplicationContext.例如:
ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ctx =  WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);

其中 servletContext sc 可以具体 换成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext(); 

另外,由于spring是注入的对象放在ServletContext中的,所以可以直接在ServletContext取出WebApplicationContext 对象:

WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

getRequiredWebApplicationContext和 getWebApplicationContext的区别是,获取失败时候,getRequiredWebApplicationContext抛出异常,getWebApplicationContext抛出null


8、Spring注解@Component、@Repository、@Service、@Controller区别

@Component是通用的 
@Repository、@Service、@Controller则是细化 

Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。


9、@RequestParam必选参数如果没有发过来有什么办法?

当@RequestParam的时候,既可以使用@ExceptionHandler来自定义处理返回错误界面或者字符串
 还可以使用AOP进行前置处理(配合 required=fasle进行前置默认值补救处理)。

或者Parameters using this annotation are required by default, but you can specify that a parameter is optional by setting @RequestParam'srequired attribute to false (e.g., @RequestParam(value="id", required=false)).


10、一个request的处理流程

17:13:19,375 DEBUG DispatcherServlet:824 - DispatcherServlet with name 'springmvc' processing GET request for [/SpringServer/wx1/aop_two]
17:13:19,391 DEBUG RequestMappingHandlerMapping:220 - Looking up handler method for path /aop_two
17:13:19,391 DEBUG RequestMappingHandlerMapping:227 - Returning handler method [public java.lang.Object com.control.WXControl.aop_schema_two(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]
17:13:19,391 DEBUG DefaultListableBeanFactory:245 - Returning cached instance of singleton bean 'WXControl'
17:13:19,391 DEBUG DispatcherServlet:933 - Last-Modified value for [/SpringServer/wx1/aop_two] is: -1
17:13:19,422 DEBUG WXControl:314 -  aop_two schema 配置方法!

................

17:13:19,469 DEBUG RequestResponseBodyMethodProcessor:140 - Written [aop_two] as "text/html" using [org.springframework.http.converter.StringHttpMessageConverter@110195c]
17:13:19,485 DEBUG DispatcherServlet:1023 - Null ModelAndView returned to DispatcherServlet with name 'springmvc': assuming HandlerAdapter completed request handling
17:13:19,485 DEBUG DispatcherServlet:962 - Successfully completed request

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值