1.什么是spring?

答:Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP   aspect oriene program)的容器框架.它的主要目的是简化企业开发

Spring负责业务逻辑 对象的实例化、初始化、服务(被调用)

优点:将大多数可重用、与业务逻辑无关的功能能够自行或交由其他组件完成

      轻量级,低侵入的设计

      Spring的DI机制降低了业务对象替换的复杂性

      spring不依赖于web容器,独立于各种应用服务器,一次编译到处运行

      高度开放性:Spring并不完全依赖于Spring,可自由选用Spring框架的部分或全部,它的架构仍然是内在稳定的

 

2.spring的组成部分七大模块

答:Spring Core:Spring的基石,提供了Spring的最主要的核心机制:控制反转和依赖注入

    Spring Context:提供了Spring的上下文信息,如:国际化,验证等    

    Spring Web支持:简化了处理多部分请求

    Spring MVC框架支持:一个全功能的构建Web应用程序的MVC实现,MVC 容纳了大量视图技术,其中包括 JSP、Velocity等。   

    Spring Dao支持:Spring的Dao支持大大的简化了JDBC操作数据库所带来的繁琐

    Spring ORM支持:Spring框架集成了若干ORM框架,从而提供了ORM的对象关系工具,其中包括 JDO、Hibernate、iBatis和TopLink。

                   所有这些都遵从Spring的通用事务 和DAO异常层结构。

    Spring AOP:面向方面编程,提供了事务,日志,权限,安全等处理机制

 

3、spring的核心机制:控制反转和依赖注入

    1).控制反转(IoC/Inverse Of Control):调用者不再创建被调用者的实例,由spring框架实现(容器创建)所以称为控制反转。

    2).依赖注入(DI/Dependence injection) :容器创建好实例后再注入调用者称为依赖注入。

 

4、spring提供了几个核心控制器

    1.)  Controller控制器

    2.)  AbstractController控制器

    3.)  MultiActionController控制器

    4.)  SimpleFormController控制器

    5.)  注解版控制器

 

5、spring Web MVC的特点

    1. 清晰的角色划分:

    2. 强大而直接的配置方式

    3. 可适配、非侵入:

    4. 可重用的业务代码:

    5. 可定制的绑定(binding) 和验证(validation):

    6. 可定制的 handler mapping 和 view resolution:

    7. 灵活的 model 转换:

    8. 可定制的本地化和主题(theme)解析:

    9. 简单而强大的 JSP 标签库(Spring Tag Library):

    10. Spring Bean 的生命周期可以被限制在当前的 HTTP Request 或者 HTTP Session.

 

6、spring容器

    职责:创建实例定位实例,管理对象之间的依赖关系.BeanFactory是所有容器的顶层接口,定义了一些容器基本功能.

    常用的3种获取spring容器:

        1.XmlBeanFactory:需要传入Resource

        2.文件系统:ApplicationContext,是XmlBeanFactory的增强版,提供了二个子类

               FileSystemXmlApplicationContext:根据文件系统获取容器

               ClassPathXmlApplicationContext:根据路径获取容器

        3.WebApplicationContext:获取web spring容器,必须要容器加载后才能获取    

    spring容器创建出来默认是单例的,可以更改为原型,在web环境下有request,session,globalsession.

    

    spring容器创建实例有3种方式:

        1.构造器创建

        2.静态方法创建

        3.非静态方法创建

 

    spring容器注入四种方式:

        1.set注入:通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法。

 

        2.构造器注入:基于构造器的DI通过调用带参数的构造器来实现,每个参数代表着一个依赖。构造器参数解析根据参              数类型进行匹配,如果bean的构造器参数类型定义非常明确,那么在bean被实例化的时候,bean定义              中构造器参数的定义顺序就是这些参数的顺序,依次进行匹配,

 

        3.接口注入:我们有一个ClassA类,它的身体内部有一个InterfaceB的属性接口。当ClassA类实例化后,希望查找            InterfaceB接口的依赖关系,并初始化InterfaceB目标对象,注入接口实现类的实例。(我们常常借助            接口来将调用者与实现者分离,降低类之间的耦合性,提高代码的可读性与操作性。)

 

        4.注解注入

 

7.依赖注入的优点 :

    代码将更加清晰,Spring管理bean的灵巧性, bean与bean之间的依赖关系放在配置文件里组织,不再担心对象之间的依赖关系之后,实现更高层次的松耦合将易如反掌

 

8.BeanFacotry对象的作用(IOC容器的作用)?

答:在Spring中,BeanFactory是IOC容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖

 

9.使用FileSystemXmlApplicationContext,加载ApplicationContext.xml文件代码?

答:ClassPathXmlApplicationContext

    通过ApplicationContext加载(ClassPathXmlApplicationContext或者FileSystemXmlApplicationContext)

  ApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {"./beans.xml"});

  BeanFactory beanFactory = (BeanFactory) appContext;

    ClassPathResource res = new ClassPathResource("./beans.xml");

    XmlBeanFactory beanFactory = new XmlBeanFactory(res);

    或者 ApplicationContext ctx=new FileSystemXmlApplicationContext("src/bean.xml");

 

10.BeanFactory跟ApplicationContext区别?

答:ApplicationContext是BeanFactory的子类,

    ApplicationContext在BeanFactory的基础上增加了国际化,事务等功能

   

11.Bean组件的作用域范围(singleton,prototype,request,session,globalsession)?

答:

Singleton:

    单例,一个bean对应一个实例

 

Prototype:

    原型,一个bean对应多个实例

 

request:

    在一次HTTP请求中,一个bean定义对应一个实例

 

session:

    在一次HTTP Session请求中,一个bean定义对应一个实例

 

global session:

    在一个全局的HTTP Session中,一个bean定义对应一个实例

 

12.Bean组件的生命周期?

答:

1 bean的定义

    创建实例 在配置文件定义bean标签 xml 或者 注解方式

2 bean的初始化,指定初始化方法的两种方式:

    在配置文件中定义init-method属性来完成或者实现initializingBean接口,重写afterPropertiesSet方法

         

3 bean的调用

4 bean的销毁1

       指定销毁方法的两种方式

       在配置文件中定义destroy-method属性来完成或者实现disposbleBean接口,重写destroy方法。

 

13.Bean组件装配方式(byName,bType,constructor,default)?

答:byName(用于set注入)

    根据属性名自动装配。

                     

    byType

    如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配,可以通过设置dependency-check="objects"让Spring抛出异常。

                    

   constructor

    与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

 

14.在Web环境中怎么加载applicationContext.xml文件(Servlet监听器)?在web如何获取应用上下文WebApplicationContext?

答:在web.xml中:

  <!-- 初始化应用配置参数信息 -->

  <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

      classpath:applicationContext.xml

    </param-value>

  </context-param>

   在web.xml中

  <!-- 系统启动加载监听器,初始化配置文件信息 -->

  <listener>

    <listener-class>

           org.springframework.web.context.ContextLoaderListener

     </listener-class>

  </listener>

  

  获取上下文:

  在Web.xml中配置上下文载入器

  指定上下文载入器的配置文件

  获得应用上下文

  调用:WebApplicationContextUtils.getWebApplicationContext(servletContext);

 

15.Spring对DAO模块支持?有什么优点?

答:提供了模版类,比如jdbcTemplate,HibernateTemplate减少开发代码量 提高工作效率,降低系统资源消耗 提高系统性能,业务逻辑层与持久层(数据层)的分离,使数据与操作更为清晰。数据访问独立到了一层,修改具体实现类,不影响系统的架构运行

 

16.Spring的DAO模板增删查改数据代码?

17.Spring整合Hibernate模块的增删查改数据代码?

18.Spring整合Ibatis模块的增删查改数据代码?

19.Spring整合Mybatis模块的增删查改数据代码?

 

20.Spring对ORM模块的支持?有什么优点?

答:提供了一些集成的框架,比如Hibernate,iBaties这些框架,还提供了一些dao的实现类,比如Hibernatetemplate等等

    ①便于测试

    ②通用数据访问异常封装。

    ③通用的资源管理。

    ④完整的事务管理

 

21.AOP在Spring中的作用?

答:

    AOP在Spring Framework中的作用:

    提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理。

    允许用户实现自定义切面,用AOP来完善OOP的使用。

 

22.AOP中的通知有哪些?各有什么特点(前置型,后置型,环绕型,最终型,异常);

答:

    前置通知(Before advice):在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)

    后置通知(After returning advice):在某连接点正常完成后执行的通知;

    例如:一个方法没有抛出任何异常,正常返回。

    异常通知(After throwing advice):在方法抛出异常退出时执行的通知。

    最终通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

    环绕通知(Around Advice):包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。

 

23.AOP的特点和优缺点?

答:

    AOP的好处:消除了编码模块之间的依赖,在不改变原代码的情况下,添加一些功能

    AOP的特征: 各步骤之间的良好隔离性 , 源代码的无关性

    缺点:Spring AOP(动态):通过代理程序运行时织入

    优点:简单,易用

    缺点:性能略低,仅适用于方法调用,必须在Spring容器

 

24.AOP三种代理方式(动态代理,CGLIB代理,代理工厂bean)

答:jdk动态代理 :

     Proxy.newProxyInstance(目标类的类加载器,目标类的接口,InvocationHandler实现类)InvocationHandler实现类中的invoke方法可以实现对目标类方法的回调,此时我们就找到了连接点,

    cglib 面向具体类

    继承 MethodInterceptor类编写回调类 ,通过Enhancer类采用字节码技术对目标类进行增强,给 Enhancer设置目标类,设置回调类,实现回调类中的intercept方法,实现对目标类方法的回调,此时我们就找到了连接点.

 

25.说说你对IOC的理解

答:

    IOC :Inversion(反转) of Control(控制)

    概念:调用者不再创建被调用者的实例,由spring框架实现(容器创建)所以称为控制反转。

    ioc容器 :bean工厂(BeanFactory) 和 应用上下文(Application Context)

    在Spring中,BeanFactory是IoC容器的核心接口。 它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

 

26.如何在Spring中使用JNDI的数据源?

答:

    第一步:在tomcat6.0的conf文件夹下找到 context.xml 文件,在<context></context>中加入

    第二步:在web.xml中加入

    第三步:在spring配置文件中配置dataSource

 

27.Spring如何整合Struts1.x?

答:

    1.直接使用WebApplicationContextUtils.getWebApplicationcontext(servlet上下文),获得spring容器没有使用struts1与spirng的整合特性

    

    2.让struts1的action继承spring 的ActionSupport, ActionSupport 类提供方法getWebApplicationcontext()方法获得spring容器,这种整合方法会使Struts1与Spring严重耦合、不能使用DispatchAction、没有利用Spring的ioc

    

    覆盖struts1的处理器RequestProcessor,使用spring的处理器    DelegatingRequestProcessor,重写里面的processActionCreate方法让spring容器来创建Action实例这样做,虽然解决了Struts1的单例所带来的问题,也利用到了Spring的ioc。但是毕竟是修改了源码,如果RequestProcessor类修改了怎么办?

    

    把struts1全权委托给spring的代理类DelegatingActionProxy

    

    5.spring还提供了一个专门针对于struts1的插件来加载spring容器作用等同于加载spring容器的监听器或者servlet,配置如下

          <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">

          <set-property value="/WEB-INF/applicationContext.xml" property="contextConfigLocation"/>

          </plug-in>

 

28.Spring如何整合Struts2.x?

配置scope为prototype

struts2中的action实例交给spring容器创建,由于struts2通过插件来对其功能进行扩展,提供了插件包struts2-spring-plugin-x.x.x,在该插件巴中

       通过常量指定struts2的对象实例有spring创建 <constant name="struts.objectFactory" value="spring" />

       struts.xml配置class指向spring容器中的bean id

 

 

 

29.Spring如何整合IBatis?

30.Spring如何整合MyBatis?

先导入Spring和mybatis整合的jar包,然后在applicationContext.xml文件中注入Mybatis工厂,在工厂中创建SqlSessionFactoryBean对象,然后再导入Mybatis核心配置文件,同时导入数据源和映射文件,注入SqlSessionTemplate实例

 

 

 

31.Spring的JDBC跟传统的JDBC的区别?

答:Spring的jdbc:节省代码,不管连接(Connection),不管事务、不管异常、不管关闭(con.close() ps.close )

    JdbcTemplate(dataSource):增、删、改、查

    TransactionTemplate(transactionManager):进行事务处理

 

32.如何在Spring中实现国际化?

答:

    在applicationContext.xml加载一个bean

    <bean id=”messageSource” class=”org.springframework.context.support.ResourceBundleMessageSource”>

      <property name=”basename”>

       <value>message</value>

      </property>

    </bean>

     在src目录下建多个properties文件

     对于非英文的要用native2ascii -encoding gb2312 源  目转化文件相关内容

     其命名格式是message_语言_国家。

     页面中的中显示提示信息,键名取键值。

     当给定国家,系统会自动加载对应的国家的properties信息。

     通过applictionContext.getMessage(“键名”,”参数”,”区域”)取出相关的信息。

33.Spring有哪些核心类?

答:

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

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

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

 

34.SpringMVC的工作机制?

答:springmvc会把请求交给dispatcherServlet,DispatcherServlet会查询HandleMapping,并找到到处理的Controller,将请求交给Controller之后,Conntroller完成处理后返回一个ModelAndView,Deispathcher会查询试图解析器,找到ModelAndView对象制定试图对象,返回客户端。

 

35.SpringMVC注解标签有哪些?

    @RequestMapping:映射请求

    注解@RequestMapping被用于映射如“/login.do”这样的URL映射到一个完整的类或者一个特定的处理方法。

    @SessingAttributes:储存会话中的属性;

    @RequestParam:绑定请求参数到方法参数上;

 

36.SpringMVC的特点(优点)?

    清晰的角色划分;2.强大而直接的配置方式;3.可适配、非侵入;

    可重用的业务代码;5.可定制的绑定(binding) 和验证(validation);

    可定制的handler mapping和view resolution;7.灵活的model转换;

    可定制的本地化和主题(theme)解析;

    9.简单而强大的JSP标签库(Spring Tag Library);

    10.Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。

 

37.SpringAOP的注解标签有哪些?

    @AspectJ切面:

    @Aspect注解:在application context中定义的任意带有一个@Aspect切面(拥有@Aspect注解)的bean都将被Spring自动识别并用于配置Spring AOP。

    @Pointcut("execution(public * *(..))"):切入日志方法

    @Before("log()"):切入后通知目录方法

    @After():后置通知:获取返回参数

    最终通知: *1代表返回类型;*2代表方法;(..)代表方法参数:

    @AfterReturning(

      value="execution(* com.lxit.spring.service.LoginService.*(..))",     returning="name")

    异常通知:

    @AfterThrowing("execution(

      * com.lxit.spring.service.LoginService.exce(..))")

    环绕通知:

    @Around(

    "execution(* com.lxit.spring.service.LoginService.around(..))")

    引入默认目标类:

    @DeclareParents(value = "com.lxit.spring.service.*+",

      defaultImpl = DefaultUsageTracked.class)

    @annotation(com.lxit.spring.Geren)表示任何标注了@Geren注解的目标类方法。(方法切点函数)

    @args():通过判别目标方法的运行时入参对象的类是否标注特定注解来指定连接点。(方法入参切点函数)

    @within():假如目标类按类型匹配于某个类A,且类A标注了特定注解,则目标类的所有连接点匹配这个切点。

    @target():目标类标注了特定注解,则目标类所有连接点匹配该切点。

 

38.Spring如何配置连接池?

答:

    (1)建立数据库连接池对象(服务器启动)。

    (2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。

    (3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。

    (4)存取数据库。

    (5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。

    (6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。

 

39.Spring的全局事务(JTA)和局部事务(JDBC)的区别?

答:

  1 局部事务:局限于一个数据库连接内;

  2 全局事务:可以跨越多个数据库连接;

  区别:

  全局事务也叫本地事务,他由应用服务器管理; 局部事务是和资源相关的,比    如一个和JDBC连接关联的事务。

  局部事务控制的局限性在一个数据库连接内,但是其使用简单。

  全局事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。

 

40.Spring事务实现的方式有哪些,优缺点?

答:

实现事物的方式:

  在XML中进行事物配置.TrancationManager

  代理实现事物.

  使用拦截器

  使用tx标签配置的拦截器 (这个也是声明式事务)

  使用注解, 需要事务的类加上@Transactional注解

 

41.编程式事务的特点?声明式事务的特点?

答:从实现的角度划分,Spring把事务分为两种一种是:编程式事务,一种是声明式事务。

       1.编程式事务是侵入式事务比较灵活,编程式事务则要操作逻辑代码。存在重复的代码比较多,相对繁琐,而且不利于系统的扩展;

       2. 声明式事务是非侵入式的事务。声明式事务只需在配置文件中配置,而不需要去操作逻辑代码。当你只有很少的事务操作时,编程式事务管理通常比较合适。

 

42.事务7大传播属性?指定事务策略的格式代码?

答:

    事务的7大传播属性  

     required   要求在事务环境中执行该方法,如果当前执行线程已处于事务中,则直接调用,如果当前执行线程不已处于事务中,则启动新的事务后执行该方法

     required_new 该方法要求有一个在新的事务环境中执行,如果当前执行线程已处于事务中,先暂停当前事务,启动新的事务后执行该方法;如果当前执行线程不已处于事务中,则启动新的事务后执行该方法

     support  如果当前执行线程已处于事务中,则使用当前事务,否则不使用事务

     not_suppot  如果调用该方法的线程处于在事务中,则先暂停当前事务,然后执行该方法

     never  不允许调用该方法的线程处于事务环境下,如果调用该方法的线程处于事务环境下,则抛出异常

     嵌套(NESTED)  如果执行该方法的线程已处于事务环境下,依然启动新的事务,方法在嵌套的事务里执行。如果执行该方法的线程并未处于事务中,也启动新的事务,然后执行该方法,此时与PROPAGATION_REQUIRED相同

     mandatory 要求调用该方法的线程必须处于事务环境中,否则抛出异常。

     spring mvc的配置文件与ContextLoaderListener加载的包含service层 dao层实例的配置文件最好分开

 

    <propertyname="method*">传播行为,隔离层级/只读,+异常/-异常

    </property>

    <propertyname="method*">传播行为,隔离层级/只读,+异常/-异常

    </property>

 

43.在Spring中事务管理器的实现方式有哪些?

答:

    使用tx标签引入事务管理器。

  使用bean标签配置事务管理器:给DataSourceTransactionManager注入dataSource。

 

44.AOP的概念(切面,连接点,通知[顾问],切入点,[引入,关注点],目标对象,代理对象,织入目标)

答:

    切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。

    连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。(表示一个方法的执行)

    通知(Advice):在切面的某个特定的连接点上执行的动作。(

    “around”环绕通知、“before”前置通知 、“after”后置通知、异常通知、最终通知);

    切入点(Pointcut):匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(连接点的集合);

    目标对象(Target Object): 被一个或者多个切面所通知的对象。

    AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约。

    (AOP代理可以是JDK动态代理或者CGLIB代理。)

    织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。

 

45.AOP在Spring中的作用?

答:

    AOP在Spring Framework中的作用:

    提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理。

    允许用户实现自定义切面,用AOP来完善OOP的使用。

 

46.AOP中的通知有哪些?各有什么特点(前置型,后置型,环绕型,最终型,异常);

答:

    前置通知(Before advice):在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)

    后置通知(After returning advice):在某连接点正常完成后执行的通知;

    例如:一个方法没有抛出任何异常,正常返回。

    异常通知(After throwing advice):在方法抛出异常退出时执行的通知。

    最终通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

    环绕通知(Around Advice):包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。

 

 

47.AOP的特点和优缺点?

答:

    AOP的好处:

    消除了编码模块之间的依赖,在不改变原代码的情况下,添加一些功能

    AOP的特征: 各步骤之间的良好隔离性 , 源代码的无关性

    缺点:

 

    Spring AOP(动态):通过代理程序运行时织入

    优点:简单,易用

    缺点:性能略低,仅适用于方法调用,必须在Spring容器

 

48.AOP三种代理方式(动态代理,CGLIB代理,代理工厂bean)

答:

1 jdk动态代理 :

     Proxy.newProxyInstance(目标类的类加载器,目标类的接口,InvocationHandler实现类)InvocationHandler实现类中的invoke方法可以实现对目标类方法的回调,此时我们就找到了连接点,

2 cglib 面向具体类

    继承 MethodInterceptor类编写回调类 ,通过Enhancer类采用字节码技术对目标类进行增强,给 Enhancer设置目标类,设置回调类,实现回调类中的intercept方法,实现对目标类方法的回调,此时我们就找到了连接点.

 

49.Spring如何整合Hibernate?

答:

        <1>

            将原Hibernate的hibernate.cfg.xml文件中关于数据源的配置整合为   

            Spring的applicationContext.xml文件中的一个bean

                

        <2>

            将Hibernate的核心SessionFactory接口的配置参数,

          整合为Spring的  LocalSessionFactoryBean类   注入数据源            

        

        <3>

            DAO类继承Spring的HibernateDaoSupport类,通过getHibernateTemplate()

            方法获得HibernateTemplate实例<要注入sessionFactory>,

             通过此实例进行CRUD操作,将SessionFactory,Session以及Transaction交由Spring框架负责管理。

             //HibernateDaoSupport本身提供setSessionFacotry(Session session)方法

            //它会在创建该bean的时候自动设置SessionFactory,并将该SessionFactory给HibernateTemplate

            <4>在Spring的applicationContext.xml中配置DAO的bean   给HibernateTemplate注入sessionFactory