spring面试

来源:互联网 发布:全天重庆时时计划数据 编辑:程序博客网 时间:2024/06/04 19:14

总结一下spring的基础面试题,正在不断补充,有错误的地方欢迎指出。

如何理解IOC,DI

控制反转,依赖注入。
不使用框架的话,初始化一个类需要程序员手动去new一个对象,而控制反转就是将这个对象提前加载到一个容器中,需要使用的时候直接从容器中去取而不是手动new。所以说控制反转就是将初始化对象的权力交给了容器。而从容器中取出对象放入要使用的地方这个过程就是依赖注入。这也符合了设计原则中的依赖倒置原则

插播一下六大设计原则:

单一职责原则:一个类只负责一个功能
里氏替换原则:所有使用父类的地方都可以使用它的子类
依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象
接口隔离原则:不要出现臃肿的接口,而应该是功能最小化的接口以保证相互之间隔离开,不受影响
迪米特法则:最少知道原则,一个类尽量少的与其他类耦合
开闭原则:对扩展开放,对修改关闭

如何自己简单的实现spring

首先需要了解到IOC最底层是BeanFactory接口中定义的getBean方法来实例化,管理对象,而他有一个扩展接口ApplicationContext是对BeanFactory的扩展,可以使用ApplicationContext的实现类ClassPathXmlApplicationContext,这个实现类可以通过类路径加载xml文件中的bean到容器中,需要从容器中获取bean时使用getBean方法获取。

讲讲ApplicationContext的三个实现类

它有三个实现类,ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,XmlWebApplicationContext,他们分别可以是根据类路径,根据文件,根据web系统中的xml文件载入bean定义信息。
其中XmlWebApplicationContext应用于web项目中,配置方法有两种:使用Listener(ContextLoaderListener)接口或者使用Servlet(ContextLoaderServlet)接口,再搭配contextConfigLocation指定要加载的路径。

  <listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:spring-config.xml,classpath:spring.xml</param-value>  </context-param>

PS:spring 3.0移除了ContextLoaderServlet。

spring的注入方法有几种

接口注入(不推荐),setter注入,构造器注入

讲讲spring的AOP(//TODO:)

面向切面编程就是可以通过预编译或者运行期动态代理实现在不修改源代码的条件下给程序动态统一添加功能的一种技术。
//TODO:AOP有两种方式,静态和动态
比较重要的就是
1.advice:通知,或者成为增强,定义了-做什么
2.pointCut:切点,定义了-在哪里做
3.aspect:切面,advice和pointCut的结合,定义了-什么时候,在哪里,做什么

 <bean id="advice" class="com.xrq.aop.TimeHandler" /> <aop:config>     <aop:aspect id="aspect" ref="advice">     <aop:pointcut id="pointcut" expression="execution(* com.xrq.aop.HelloWorld.*(..))" />     <aop:before method="printTime" pointcut-ref="pointcut" />     <aop:after method="printTime" pointcut-ref="pointcut" />     </aop:aspect></aop:config>

比如上面这段代码中,id为advice的bean就是增强部分,最外层的config标签内的aspect是切面,其中包含了advice(做什么),还有pointCut(在哪里做),最后面还定义了什么时候做。

再来一段事务的配置:

<bean id="transcationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">     <property name="dataSource" ref="dataSource" /></bean><tx:advice id="txAdvice" transaction-manager="transcationManager">    <tx:attributes>        <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>        <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>        <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>    </tx:attributes></tx:advice><aop:config>        <aop:pointcut id="pc" expression="execution(* com.cncert.satp.service..*(..))"/>        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/></aop:config>

这里的就是增强,advisor作用和切面比较类似。
只要理解了切面,增强和切点这三个概念就可以理解aop的配置了。

讲讲你常用spring注解(//TODO:)

首先需要开启注解,
<context:annotation-config></context:annotation-config>
或者使用<context:component-scan base-package="com.?.?"/>的方式指定扫描包。
@Autowired:自动注入,setter注入或构造器注入都可以,当不确定是否有某个bean时可以使用@Autowired(required=false)。这个注解默认使用byType(通过bean的class类型),如果出现多个同类型的bean,则注入会出现异常,这时候就需要加上下一个注解。
@Qualifier:配合@Autowired注入bean,使用它的时候默认变为byName(通过bean的id或name)
@Resource:与@Autowired类似,不过默认是byName,有两个属性name和type分别对应byName和byType

@Repository:用于将DAO层的类标示为bean
@Service:用于将Service层的类标示为bean
@Controller:用于将Controller层的类标示为bean
@Component:可以作用于任意层

@RequestMapping:通过路径映射到Controller
@RequestParam:通过路径映射到参数
@PathVariable:通过路径映射到参数,区别是前者是用?的格式,后者使用/的格式

@RequestBody:获取请求中body部分的数据
@ResponseBody:将数据写到response的body数据区
两者在开发中比较常见的应用场景是传递json,当然他们也可以传递别的格式的数据

@RestController:spring 4中新增注解,代表@Controller+@ResponseBody