SSM框架基础知识总结归纳整理
框架的基础知识
1.Javaweb
1. Servlet的运⾏过程?
Web容器加载Servlet并将其实例化后,Servlet⽣命周期开始,
容器运⾏其init()⽅法进⾏Servlet的初始化;
请求到达时调⽤Servlet的service()⽅法
service()⽅法会根据需要调⽤与请求对应的doGet或doPost等⽅法;
当服务器关闭或项⽬被卸载时服务器会将Servlet实例销毁,此时会调⽤Servlet的destroy()⽅法。
2. 讲解JSP中的四种作⽤域。
page代表与⼀个页⾯相关的对象和属性。
request代表与Web客户机发出的⼀个请求相关的对象和属性。⼀个请求可能跨越多个页⾯,涉及多个Web组件;需要在页⾯显⽰的临时数据可以置于此作⽤域。
session代表与某个⽤户与服务器建⽴的⼀次会话相关的对象和属性。跟某个⽤户相关的数据应该放在⽤户⾃⼰的session中。
application代表与整个Web应⽤程序相关的对象和属性,它实质上是跨越整个Web应⽤程序,包括多个页⾯、请求和会话的⼀个全局作⽤域。
3.Servlet⽣命周期
1.创建对象->初始化->service()->doXXX()->销毁
2.对象创建只有⼀次,单例
初始化⼀次
销毁⼀次
3.关于线程安全
不安全的三个因素
①多线程的环境(有多个客户端,同时访问Servlet)
②多个线程共享资源,⽐如⼀个单例对象(Servlet是单例的)
③这个单例对象是有状态的(⽐如Servlet⽅法中采⽤全局变量,并且以该变量的运算结果作为下⼀步操作依据)
4.Cookie和Session的区别
1.存储位置不同
Session:服务端
Cookie:客户端
2.存储的数据格式不同
Session:value为对象,Object类型
Cookie:value为字符串,如果我们存储⼀个对象,对象转J son
3.存储数据的⼤⼩
Session:受服务器内存控制
Cookie:⼀般来说,最⼤为4K
4.⽣命周期不同:
Session:服务器端控制,默认30分钟。关闭浏览器不会消失。
Cookie:客户端控制,其实是客户端的⼀个⽂件,分2种情况:
①默认会话级Cookie,随浏览器关闭⽽消失
②⽐如设置7天免登陆,SetMaxAge
5.Cookie和Session之间的联系
http协议是⽆状态的协议,为了记住⽤户的状态,服务器会通过会话级的cookie来保存session标识。JessionId保存session的id。
< 和 post 请求有哪些区别?
get 请求会被浏览器主动缓存,⽽ post 不会。
get 传递参数有⼤⼩限制,⽽ post 没有。
post 参数传输更安全,get 的参数会明⽂限制在 url 上,post 不会。
6.转发和重定向的区别
1.转发
发⽣在服务器内部的跳转,对客户端来说就⼀次请求,request对象可以传递。
2.重定向
多次请求之间传递数据,需要session对象。
2. Spring
SpringBean的作⽤域
SpringBean⽣命周期:
Spring对bean进⾏实例化,默认bean是单例;
Spring对bean进⾏依赖注⼊;
如果bean实现了BeanNameAware接⼝,spring将bean的id传给setBeanName()⽅法;
如果bean实现了BeanFactoryAware接⼝,spring将调⽤setBeanFactory⽅法,将BeanFactory实例传进来;
如果bean实现了ApplicationContextAware接⼝,它的setApplicationContext()⽅法将被调⽤,将应⽤上下⽂的引⽤传⼊到bean 中;
如果bean实现了BeanPostProcessor接⼝,它的postProcessBeforeInitialization⽅法将被调⽤;
如果bean实现了InitializingBean接⼝,spring将调⽤它的afterPropertiesSet接⼝⽅法,类似的如果bean使⽤了init-method属性声明了初始化⽅法,该⽅法也会被调⽤;
如果bean实现了BeanPostProcessor接⼝,它的postProcessAfterInitialization接⼝⽅法将被调⽤;
此时bean已经准备就绪,可以被应⽤程序使⽤了,他们将⼀直驻留在应⽤上下⽂中,直到该应⽤上下⽂被销毁;
若bean实现了DisposableBean接⼝,spring将调⽤它的distroy()接⼝⽅法。同样的,如果bean使⽤了destroy-method属性声明了销毁⽅法,则该⽅法被调⽤;
SpringAop核⼼概念
1. 切⾯:类是对物体特征的抽象,切⾯就是对横切关注点的抽象
2. 横切关注点:对哪些⽅法进⾏拦截,拦截后怎么处理,这些关注点称之为横切关注点
3. 连接点:被拦截到的点
4. 切⼊点:对连接点进⾏拦截的定义
5. 通知:所谓通知就是指拦截到连接点之后要执⾏的代码,通知分为前置,后置,异常,最终,环绕五类
6. ⽬标对象:代理的⽬标对象
7. 织⼊:将切⾯应⽤到⽬标对象并导致代理对象创建的过程
8. 引⼊:在不修改代码的前提下,引⼊可以在运⾏期为类动态的添加⼀些⽅法或字段
SpringAop动态代理的原理
Spring的AOP实现原理其实很简单,就是通过动态代理实现的。如果我们为Spring的某个bean配置了切⾯,那么Spring在创建这
个bean的时候,实际上创建的是这个bean的⼀个代理对象,我们后续对bean中⽅法的调⽤,实际上调⽤的是代理类重写的代理⽅法。
⽽Spring的AOP使⽤了两种动态代理,分别是JDK的动态代理,以及CGLib的动态代理。
(⼀)JDK动态代理
JDK的动态代理是基于反射实现。JDK通过反射,⽣成⼀个代理类,这个代理类实现了原来那个类的全部接⼝,并对接⼝中定义的所有⽅法进⾏了代理。当我们通过代理对象执⾏原来那个类的⽅法时,代理类底层会通过反射机制,回调我们实现的InvocationHandler接⼝
的invoke⽅法。并且这个代理类是Proxy类的⼦类。这就是JDK动态代理⼤致的实现⽅式。
优点:
1. JDK动态代理是JDK原⽣的,不需要任何依赖即可使⽤;
2. 通过反射机制⽣成代理类的速度要⽐CGLib操作字节码⽣成代理类的速度更快;
缺点:
1. 如果要使⽤JDK动态代理,被代理的类必须实现了接⼝,否则⽆法代理;
2. JDK动态代理⽆法为没有在接⼝中定义的⽅法实现代理,假设我们有⼀个实现了接⼝的类,我们为它的⼀个不属于接⼝中的⽅法配置
了切⾯,Spring仍然会使⽤JDK的动态代理,但是由于配置了切⾯的⽅法不属于接⼝,为这个⽅法配置的切⾯将不会被织⼊。
3. JDK动态代理执⾏代理⽅法时,需要通过反射机制进⾏回调,此时⽅法执⾏的效率⽐较低;
(⼆)CGLib动态代理
CGLib实现动态代理的原理是,底层采⽤了ASM字节码⽣成框架,直接对需要代理的类的字节码进⾏操作,⽣成这个类的⼀个⼦类,并重写了类的所有可以重写的⽅法,在重写的过程中,将我们定义的额外的逻辑(简单理解为Spring中的切⾯)织⼊到⽅法中,对⽅法进⾏了增强。⽽通过字节码操作⽣成的代理类,和我们⾃⼰编写并编译后的类没有太⼤区别。
优点:
1. 使⽤CGLib代理的类,不需要实现接⼝,因为CGLib⽣成的代理类是直接继承⾃需要被代理的类;
2. CGLib⽣成的代理类是原来那个类的⼦类,这就意味着这个代理类可以为原来那个类中,所有能够被⼦类重写的⽅法进⾏代理;
3. CGLib⽣成的代理类,和我们⾃⼰编写并编译的类没有太⼤区别,对⽅法的调⽤和直接调⽤普通类的⽅式⼀致,所以CGLib执⾏代理
⽅法的效率要⾼于JDK的动态代理;
缺点:
1. 由于CGLib的代理类使⽤的是继承,这也就意味着如果需要被代理的类是⼀个final类,则⽆法使⽤CGLib代理;
2. 由于CGLib实现代理⽅法的⽅式是重写⽗类的⽅法,所以⽆法对final⽅法,或者private⽅法进⾏代理,因为⼦类⽆法重写这些⽅法;
3. CGLib⽣成代理类的⽅式是通过操作字节码,这种⽅式⽣成代理类的速度要⽐JDK通过反射⽣成代理类的速度更慢;
4.
Spring框架中都⽤到了哪些设计模式?
1. 代理模式:在AOP和remoting中被⽤的⽐较多。
2. 单例模式:在spring配置⽂件中定义的bean默认为单例模式。
3. 模板⽅法模式:⽤来解决代码重复的问题。
4. 前端控制器模式:Spring提供了DispatcherServlet来对请求进⾏分发。
5. 依赖注⼊模式:贯穿于BeanFactory / ApplicationContext接⼝的核⼼理念。
6. ⼯⼚模式:BeanFactory⽤来创建对象的实例。spring系列框架有哪些
你⽤过哪些重要的 Spring 注解?
@Controller - ⽤于 Spring MVC 项⽬中的控制器类。
@Service - ⽤于服务类。
@RequestMapping - ⽤于在控制器处理程序⽅法中配置 URI 映射。
@ResponseBody - ⽤于发送 Object 作为响应,通常⽤于发送 XML 或 JSON 数据作为响应。
@PathVariable - ⽤于将动态值从 URI 映射到处理程序⽅法参数。
@Autowired - ⽤于在 spring bean 中⾃动装配依赖项。
@Qualifier - 使⽤ @Autowired 注解,以避免在存在多个 bean 类型实例时出现混淆。
@Scope - ⽤于配置 spring bean 的范围。
@Configuration,@ComponentScan 和 @Bean - ⽤于基于 java 的配置。
@Aspect,@Before,@After,@Around,@Pointcut - ⽤于切⾯编程(AOP)。
@Component, @Controller, @Repository, @Service有何区别?
@Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通⽤构造型。spring
的组件扫描机制现在可以将其拾取并将其拉⼊应⽤程序环境中。
@Controller:这将⼀个类标记为 Spring Web MVC 控制器。标有它的 Bean 会⾃动导⼊到 IoC 容器中。
@Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他⾏为。您可以在服务层类中使⽤
@Service ⽽不是 @Component,因为它以更好的⽅式指定了意图。
@Repository:这个注解是具有类似⽤途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO导⼊ IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。
有哪些不同类型的依赖注⼊实现⽅式?
依赖注⼊是时下最流⾏的IoC实现⽅式,依赖注⼊分为
1. 接⼝注⼊
2. Setter⽅法注⼊
3. 构造器注⼊
其中接⼝注⼊由于在灵活性和易⽤性⽐较差,现在从Spring4开始已被废弃。
构造器依赖注⼊:构造器依赖注⼊通过容器触发⼀个类的构造器来实现的,该类有⼀系列参数,每个参数代表⼀个对其他类的依赖。
Setter⽅法注⼊:Setter⽅法注⼊是容器通过调⽤⽆参构造器或⽆参static⼯⼚ ⽅法实例化bean之后,调⽤该bean的setter⽅法,即实现了基于setter的依赖注⼊。
5.1构造⽅法注⼊
spring 配置⽂件:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。