SSM

本文主要涉及下面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有哪些组件?
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容