SSM

作者: 一只小星_ | 来源:发表于2019-03-11 18:23 被阅读0次

    本文主要涉及下面10个【SSM】问题

    • 1、说一下Session的工作原理?如果客户端禁用cookie,session还可以用吗?
    • 2、SpringMVC和struts的区别?
    • 3、如何避免SQL注入?
    • 4、为什么要用spring?spring有什么好处(特性),怎么管理对象的?
    • 5、说说IOC。
    • 6、说说AOP。
    • 7、说说DI,和IOC有什么区别?
    • 8、什么是AOP,AOP的好处?
    • 9、AOP的实现原理:Spring AOP使用的动态代理。
    • 10、Spring的生命周期?
    • 11、Spring的配置方式,如何装配bean?bean的注入方法有哪些?
    • 12、bean的作用域?
    • 13、Spring中涉及到哪些设计模式?
    • 14、MyBatis和Hibernate的区别和应用场景?
    • 15.Spring Bean的生命周期讲一讲。
    • 16、说说spring有哪些主要模块。
    • 17、spring常用的注入方式有什么
    • 18、spring 中的bean是线程安全的吗?
    • 19、spring自动装配bean有哪些方式?
    • 20、spring事务的实现方式有哪些
    • 21、说一说springmvc的运行流程
    • 22、springmvc有哪些组件?

    1、说一下Session的工作原理?

    session是客户端登陆完成之后,服务器会创建对应的session,session创建完成之后,会吧session的id发给客户端,客户端再存储到浏览器中,这样客户端每次访问服务器的时候,都会带着session id,服务器拿到id之后会去找到对应的session,这样就可以正常工作了。
    如果客户端禁用cookie,session还可以用吗?可以的,因为session只是用cookie存储了sessionid,如果cookie禁用,可以用在url中添加sessionid的方式保证session的使用。

    2、SpringMVC和struts的区别?

    • 拦截级别:struts2是类级别的拦截,springmvc是方法级别的拦截
    • 数据独立性:springmvc 的方法之间基本是独立的,独享request和response数据,方法之间不共享变量,而struts2虽然方法也是独立的,但所有的action变量是共享的。
    • 拦截机制:struts有自己的拦截机制,Spring mvc用的aop方式。
    • 对ajax的支持:springmvc 集成了ajax,所以只需要一个ResponseBody就可以实现了,但是struts需要自己写代码或安装插件。

    3、如何避免SQL注入?

    使用预处理preparedstatement
    使用正则表达式过滤掉字符串中的特殊字符。

    4、为什么要用spring?spring有什么好处(特性)

    • spring提供ioc技术,容器会帮我们管理依赖的对象,不需要自己创建和管理依赖对象了,实现程序解藕。
    • spring提供事务支持,让事务操作更方便。
    • spring提供面向切面编程,可以分离功能性需求和非功能性需求,比如实现对程序的权限拦截、运行监控等。
    • 此外,spring可以方便的集成其他的框架。

    5、说说IOC。

    控制反转是一种思想,在spring之前我们可能需要自己创建对象,现在把对象的控制权交给了别人,对于spring框架来说,ioc就是借助于“第三方”实现具有依赖关系的对象之间的解耦,ioc把创建管理对象的控制权给了spring框架。
    IOC底层实现:工厂+反射+配置文件。除了spring,hibernate也用了ioc。
    比如在XML中配置了类的全限定名,然后Spring使用反射+工厂来创建Bean。
    BeanFactory是最简单的容器,只提供了基本的DI支持,ApplicationContext基于BeanFactory创建,提供了完整的框架级的服务,因此一般使用应用上下文。

    6、说说AOP

    • aop是面向切面编程,他是一种编程范式,可以将应用各处的功能分离出来形成可重用的组件。比如核心业务逻辑与安全、事务、日志等这些非核心业务逻辑分离,使得业务逻辑更简洁清晰。

    7、说说DI,和IOC有什么区别?

    DI依赖注入:在IOC容器运行期间,动态的把依赖对象注入到Bean组件。(就是把一个bean对象注入到另一个bean对象中。)DI的好处是使得各个组件之间松耦合,一个对象如果只用接口来表明依赖关系,这种依赖可以在对象毫不知情的情况下,用不同的具体类进行替换。
    DI和IOC的区别:都是将对象控制权交给第三方,只是角度不同,DI站在依赖对象的角度。IoC 控制反转,指将对象的创建权,反转到Spring容器 , DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。

    8、什么是AOP,AOP的好处?

    AOP,是把一些与业务无关,但对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),可以减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。

    AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。

    (1)AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。

    (2)Spring AOP使用的动态代理,所谓的动态代理是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

    Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:
    ①JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
    ②如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

    (3)静态代理与动态代理区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理,而Spring AOP则无需特定的编译器处理。

    具体来说,散布于应用中多处的功能被称为横切关注点,这些横切关注点从概念上与应用的业务逻辑是相分离的,但是又常常会直接嵌入到应用的业务逻辑中,AOP把这些横切关注点从业务逻辑中分离出来。安全、事务、日志这些功能都可以被认为是应用中的横切关注点。

    通常要重用功能,可以使用继承或者委托的方式。但是继承往往导致一个脆弱的对像体系;委托带来了复杂的调用。面向切面编程仍然可以在一个地方定义通用的功能,但是可以用声明的方法定义这个功能要在何处出现,而无需修改受到影响的类。横切关注点可以被模块化为特殊的类,这些类被称为切面(Aspect)。好处在于:

    • 每个关注点都集中在一个地方,而非分散在多处代码中;
    • 使得业务逻辑更简洁清晰,因为这样可以只关注核心业务,次要的业务被分离成关注点转移到切面中。

    AOP术语介绍

    通知:切面所做的工作称为通知。通知定义了切面是什么,以及在何时使用。Spring切面可以应用5种类型的通知。

    • 前置通知(Before):在目标方法被调用之前调用通知功能;
    • 后置通知(After):在目标方法被调用或者抛出异常之后都会调用通知功能;
    • 返回通知(After-returning):在目标方法成功执行之后调用通知;
    • 异常通知(After-throwing):在目标方法抛出异常之后调用通知;
      *( 环绕通知(Around):通知包裹了被通知的方法,在目标方法被调用之前和调用之后执行自定义的行为。

    连接点:可以被通知的方法。

    切点:实际被通知的方法。

    切面:即通知和切点的结合,它是什么,在何时何处完成其功能。

    引入:允许向现有的类添加新方法或属性,从而可以在无需修改这些现有的类情况下,让它们具有新的行为和状态。

    织入:把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:

    • 编译期,切面在目标类编译时织入。
    • 类加载期,切面在目标类加载到JVM时被织入。
    • 运行期,切面在应用运行的某个时刻被织入,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的。

    Spring AOP构建在动态代理基础之上,所以Spring对AOP的支持仅限于方法拦截。

    Spring的切面是由包裹了目标对象的代理类实现的。代理类封装了目标类,并拦截被通知方法的调用,当代理拦截到方法调用时,在调用目标bean方法之前,会执行切面逻辑。其实切面只是实现了它们所包装bean相同接口的代理。

    9、AOP的实现原理:Spring AOP使用的动态代理。

    Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。

    如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类。注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

    Spring使用动态代理,代理类封装了目标类,当代理拦截到方法调用时,在调用目标bean的方法之前,会执行切面逻辑。

    10、Spring的生命周期?

    Spring创建、管理对象。Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期。

    • 实例化:Spring对bean进行实例化。
    • 填充属性:Spring将值和bean的引用注入到bean对应的属性中。
    • 调用BeanNameAware的setBeanName()方法:若bean实现了BeanNameAware接口,Spring将bean的id传递给setBeanName方法。
    • 调用BeanFactoryAware的setBeanFactory()方法:若bean实现了BeanFactoryAware接口,Spring调用setBeanFactory方法将BeanFactory容器实例传入。
    • 调用ApplicationContextAware的setApplicationContext方法:如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext方法将bean所在的应用上下文传入。
    • 调用BeanPostProcessor的预初始化方法:如果bean实现了BeanPostProcessor,Spring将调用它们的叛postProcessBeforeInitialization方法。
    • 调用InitalizingBean的afterPropertiesSet方法:如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法。
    • 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialzation方法。
    • 此时bean已经准备就绪,可以被应用程序使用,它们将一直驻留在应用杀死那个下文中,直到该应用的上下文被销毁。
    • 如果bean实现了DisposableBean接口,Spring将调用它的destroy方法。

    11、Spring的配置方式,如何装配bean?bean的注入方法有哪些?

    • XML配置,如 <bean id="">。
    • Java配置即JavaConfig,使用@Bean注解。
    • 自动装配,组件扫描(component scanning)和自动装配(autowiring),@ComponentScan和 @AutoWired注解。

    bean的注入方式有:

    • 构造器注入。
    • 属性的setter方法注入。
    • 推荐对于强依赖使用构造器注入,对于弱依赖使用属性注入。

    12、bean的作用域?

    bean就是由IOC容器初始化、管理、装配的对象,初次之外和其他对象没有什么区别,spring的bean默认都是单例的,单例在此容器内只有一个,就像java的单例是在虚拟机里只有一个实例。 后三种只能用在基于 web 的 Spring ApplicationContext 环境。 Spring Framework支持五种作用域:

    单例(Singleton):在Spring IOC容器中仅存在一个Bean实例,默认。
    原型(Prototype):每次从容器中调用bean都返回一个新的实例。
    会话(Session):同一个http session共享一个bean,不同session使用不同的bean,就是在Web应用中,为每个会话创建一个bean实例。
    请求(Request):每次http请求都会创建新的bean,该bean只会在当前的HTTP request内有效,为每个请求创建一个bean实例。
    globalSession:一般用于Portlet应用环境,在基于 portlet 的 web 应用中才有意义。 默认情况下Spring中的bean都是单例的。

    默认情况下Spring中的bean都是单例的。

    13、Spring中涉及到哪些设计模式?

    • 工厂方法模式。在各种BeanFactory以及ApplicationContext创建中都用到了;
    • 单例模式。在创建bean时用到,Spring默认创建的bean是单例的;
    • 代理模式。在AOP中使用Java的动态代理;
    • 策略模式。比如有关资源访问的Resource类;
    • 模板方法。比如使用JDBC访问数据库,JdbcTemplate;
    • 观察者模式。Spring中的各种Listener,如ApplicationListener;
    • 装饰者模式。在Spring中的各种Wrapper和Decorator;
    • 适配器模式。Spring中的各种Adapter,如在AOP中的通知适配器AdvisorAdapter。

    14、MyBatis和Hibernate的区别和应用场景?

    Hibernate:是一个标准的ORM(对象关系映射)框架;SQL语句是自己生成的,程序员不用自己写SQL语句。因此要对SQL语句进行优化和修改比较困难。适用于中小型项目。

    MyBatis:程序员自己编写SQL, SQL修改和优化比较自由。MyBatis更容易掌握,上手更容易。主要应用于需求变化较多的项目,如互联网项目等。

    15.Spring Bean的生命周期讲一讲。

    定义、初始化、使用,销毁

    Bean容器找到配置文件中 Spring Bean 的定义。
    Bean容器利用Java Reflection API创建一个Bean的实例。
    如果涉及到一些属性值 利用set方法设置一些属性值。
    如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。
    如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
    如果Bean实现了BeanFactoryAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
    与上面的类似,如果实现了其他*Aware接口,就调用相应的方法。
    如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization()方法
    如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。
    如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。
    如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessAfterInitialization()方法
    当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法。
    当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。

    16、说说spring有哪些主要模块。

    • spring core:框架最基础的部分,提供ioc和依赖注入特性。
    • spring context:构建在core封装包基础上的context封装包,提供了一种对象式的访问方法。
    • spring dao:提供JDBC抽象层。
    • spring aop:提供了面向切面编程,可以自定义拦截器,切点等。
    • spring web:提供了web开发的集成特性,例如上传文件。
    • spring web mvc:mvc封装包web应用的mvc实现。

    17、spring常用的注入方式有什么?

    setter属性注入,构造方法注入,注解方式注入

    18、spring 中的bean是线程安全的吗?

    spring没有对

    • 19、spring自动装配bean有哪些方式?
    • 20、spring事务的实现方式有哪些
    • 21、说一说springmvc的运行流程
    • 22、springmvc有哪些组件?

    相关文章

      网友评论

          本文标题:SSM

          本文链接:https://www.haomeiwen.com/subject/hqxdpqtx.html