Spring的理解
spring的核心就是IOC(控制反转)和AOP(切面编程)
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两
个是Spring的灵魂。
主要用到的设计模式有工厂模式和代理模式。
IOC就是典型的工厂模式,通过sessionfactory去注入实例。
AOP就是典型的代理模式的体现。
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类
预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在
关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通
过调用委托类的对象的相关方法,来提供特定的服务。
spring的IOC容器是spring的核心,spring AOP是spring框架的重要组成部分。
IOC和AOP
IOC控制反转
(1)IOC就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。
(2)最直观的表达就是,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。
(3)Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入。
IoC让相互协作的组件保持松散的耦合,而AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。
AOP切面编程
OOP面向对象,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。
Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
Spring的常用注解
@Controller 定义在控制器上,在mvc中是一个controller对象
@service 用于标记业务层组件
@restController 是responseBody和controller的结合,将请求返回值转换成json对象
@repository 标注dao组件,配置在dao实现类上
@responseBody 在使用@requestmapping后返回值一般都是跳转路径,使用这个注解后,返回值就会转换成json写入http response body中
@requestMapping 处理请求映射地址的注解
@pathvarlable 将请求地址上的参数转换为java对象
@requestParam 获取请求参数
@requestHeader 获取请求header中的参数
@modelattribute 在控制器所有方法执行前执行,可以用于basecontroller, controller集成base,可实现在调用controller方法前先执行@modelattribute方法
@autowride 可以配置在类成员变量、方法、构造函数上,配合完成spring自动装配功能,可以消除get,set方法
spring的设计模式
常用的是工厂模式和代理模式,ioc使用的是工厂模式,通过sessionfactory注入参数,aop使用的是代理模式
bean的作用域
- singleton 默认,单例模式,容器中只会存在一个对象
- prototype 为每一个bean请求提供一个实例,每次注入都会生成一个新的对象
- request 为每个request请求生成一个实例,单个请求中都会使用这一个实例
- session 为每个session生成一个实例,session过期后,bean失效
- application 在servletContext生命周期中复用一个bean实例
- webscoket 在webscoket生命周期中复用一个bean实例
- global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同