SSM框架总结

目录

1. Spring

1. Spring IOC原理

2. 依赖注入的三种方式

3. Spring Bean的生命周期

4. Spring 事务管理

5.Spring Bean的作用域

6.AOP应用场景和原理

7.Spring中单例bean的线程安全问题

8.Spring中涉及到哪些设计模式?

2.Spring MVC

1.请求流程

2.开发流程

3.Mybatis


SSM框架 = Spring + Spring MVC + Mybatis

1. Spring

  • 基于IOC和AOP两大核心组件
  • IOC控制反转是Spring的基础,以前由程序员自己创建对象,现在交给Spring创建对象
  • DI依赖注入,spring配置一个bean时,如果需要给bean提供一些初始化参数,则需要通过依赖注入的方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程
  • AOP面向切面编程

1. Spring IOC原理

【链接】---- Spring IOC原理总结

IoC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring框架来管理。  IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。

将对象之间的相互依赖关系交给 IOC 容器来管理,并由 IOC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IOC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。 在实际项目中一个 Service 类可能有几百甚至上千个类作为它的底层,假如我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IOC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。

【Spring容器高层视图】

Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,根据Bean注册表实例化Bean,装配好Bean之间的依赖关系,将Bean实例放到Spring容器的Bean缓存池中,为上层应用提供准备就绪的运行环境。

IOC容器创建对象的几种方式

  • 无参构造器
  • 有参构造器
  • 工厂类创建对象:静态方法创建对象和非静态方法创建对象 
  • FactoryBean工厂bean,其返回的是该工作Bean的getObject方法所返回的对象。

2. 依赖注入的三种方式

1、使用属性的Setter方法注入,这是最常用的方式

【要求】

  1. 要求Bean提供一个无参构造器
  2. 为需要注入的属性提供对应的Setter方法,spring会将name值的单词首字母转换成大写,再在前面拼接上“set”构成一个方法名,通过反射的方式调用Setter方法实现注入

2、使用构造器注入

【要求】

  1. 在类中,不必为属性设置setter方法,但是需要生成带参的构造函数
  2. 在配置文件中配置该bean,并配置构造器,使用<constructor-arg>节点,该节点有四个属性:
  • index索引,从0开始;
  • type是指该属性所对应的类型;
  • ref是指引用的依赖对象;
  • value当注入的属性不是对象,而是基本数据类型时,就用value。

【autowire属性自动注入】

3、使用注解方式

【注入属性的注解】—— 配合PropertyPlaceholderConfigurer(引用外部文件:data.properties)使用

  • @Autowired,代替ref,默认按类型装配;
  • @Resource,默认按名称装配;
  • @Value,装配基本的数据类型。

3. Spring Bean的生命周期

------ Spring框架中,一旦把一个Bean纳入Spring IOC容器中,这个Bean的生命周期就会交由容器进行管理,一般担当管理角色的是BeanFactory或者ApplicationContext。

Spring Bean的生命周期分为四个阶段多个扩展点。扩展点又可以分为影响多个Bean影响单个Bean。如下:
四个阶段

  • 实例化 Instantiation
  • 属性赋值 Populate
  • 初始化 Initialization
  • 销毁 Destruction

多个扩展点

  • 影响多个Bean
    • BeanPostProcessor
    • InstantiationAwareBeanPostProcessor
  • 影响单个Bean
    • Aware(Aware类型的接口的作用就是让我们能够拿到Spring容器中的一些资源)
      • Aware Group1
        • BeanNameAware
        • BeanClassLoaderAware
        • BeanFactoryAware
      • Aware Group2
        • EnvironmentAware
        • EmbeddedValueResolverAware
        • ApplicationContextAware(ResourceLoaderAware\ApplicationEventPublisherAware\MessageSourceAware)
    • 生命周期(能够自己实现的有初始化和销毁两个生命周期阶段)
      • InitializingBean(对应生命周期的初始化阶段)
      • DisposableBean(对应生命周期的销毁阶段)
  1. Bean 容器找到配置文件中 Spring Bean 的定义。
  2. Bean 容器利用 Java Reflection API 创建一个Bean的实例。
  3. 如果涉及到一些属性值 利用 set()方法设置一些属性值。
  4. 如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入Bean的名字。
  5. 如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。
  6. 如果Bean实现了 BeanFactoryAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoade r对象的实例。
  7. 与上面的类似,如果实现了其他 *.Aware接口,就调用相应的方法。
  8. 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
  9. 如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。
  10. 如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
  11. 如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法
  12. 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。
  13. 当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。

4. Spring 事务管理

【链接】---- 事务管理

【链接】---- 声明式事务

5.Spring Bean的作用域

scope配置项有5个属性,用于描述不同的作用域。

① singleton

使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。

在启动(容器初始化之前),创建bean,整个应用只有一个对象。

② prototype

使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。在使用到对象时才创建。

③ request

该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。

④ session

该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。

⑤ global-session

该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。

6.AOP应用场景和原理

【链接】---- AOP详解

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理。

 

7.Spring中单例bean的线程安全问题

单例 bean 存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。

常见的有两种解决办法:

在Bean对象中尽量避免定义可变的成员变量(不太现实)。

在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。

8.Spring中涉及到哪些设计模式?

工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
代理设计模式 : Spring AOP 功能的实现。
单例设计模式 : Spring 中的 Bean 默认都是单例的。
模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

9.Spring是如何解决循环依赖的?

spring单例对象的初始化大略分为三步:

  • createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象
  • populateBean:填充属性,这一步主要是对bean的依赖属性进行填充
  • initializeBean:调用spring xmi中的init方法。

从上面讲述的单例bean初始化步骤我们可以知道,循环依赖主要发生在第一、第二步。
spring循环依赖有三种情况

  • 构造器的循环依赖:这种依赖spring是处理不了的,直接抛出BeanCurrentlyInCreationException异常。
  • 单例模式下的setter循环依赖:通过"三级缓存"处理循环依赖。
  • 非单例循环依赖:无法处理。

 

2.Spring MVC

1.请求流程

具体步骤:

第一步:发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)

第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

第四步:前端控制器调用处理器适配器去执行Handler

第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler

第六步:Handler执行完成给适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)

第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可

第九步:视图解析器向前端控制器返回View

第十步:前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)

第十一步:前端控制器向用户响应结果

2.开发流程

1、  DispatcherServlet 在 web.xml 中的部署描述,从而拦截请求到 Spring Web MVC

2、  HandlerMapping 的配置,从而将请求映射到处理器

3、  HandlerAdapter 的配置,从而支持多种类型的处理器

注:处理器映射求和适配器使用纾解的话包含在了注解驱动中,不需要再单独配置

4、  ViewResolver 的配置,从而将逻辑视图名解析为具体视图技术

5、  处理器(页面控制器)的配置,从而进行功能处理 

3.Mybatis

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值