Spring框架——从零开始的码字生活

 

降低依赖、耦合(高内聚低耦合

  1. 采用接口实现
  2. 采用容器实现
  3. 使用服务定位器 
    1.   优点
      1. 应用服务器定位将查找逻辑分离
      2. 降低组件在查找方面的复杂性
      3. 增加组建的重用性
    2.   JDNI(java命名和目录接口
      • 已配置好的datasource连接数据库
      • 通过服务定位器找到datasource,访问数据库
      • 局限性:必须知道怎么找
  4. 不需要服务器定位
    1. 组件(Service)集增加接受资源的方法(setter)
    2. 由容器将组件注入到另一个组件
    3. 优点:完全面向接口

概念

  1. Ioc控制反转
    1.   目的:设计原则,解耦组件之间的依赖关系。降低耦合度
    2. 好处:
      1. 从主动获取资源变成 被动接收
      2. 查找的被动形式
  2. DI   依赖注入
    1.   具体的设计模式,体现Ioc设计原则
    2. DI是Ioc的最典型的实现,不能混用

依赖注入DI

  1. 接口注入
  2. setter注入   
    1. 流行最广(可读性好
    2. 未注入,存在空指针。代码存在安全问题,依赖被修改  
  3. 构造器注入
    1.   可避免setter注入的些许缺点
    2. 没有明确的方法名,对参数位置和数量有要求

Bean   由Spring Ioc容器进行实例化、装配和管理的对象

元数据  通过容器使用配置来反应Beans和他们之间的依赖关系

  1. 基于Xml的配置
  2. 基于注解的配置
  3. 基于java的配置

 

Spring Ioc容器

  • Spring容器体现了IoC原理
  • Spring容器通过读取配置元数据负责对Beans实例化、配置、装配
  • 配置元数据:XML、Java注解、java代码

BeanFactory

  •  提供一个先进配置机制,能够管理任何类型的对象
  • 负责对Bean对象实例化、装配、生命周期的管理
  • 实现:
    • XmlBeanFactory
    • 需传入一个Resource实例
        • ClassPathResource
        • FileSystemResource
      • BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
    •  从BeanFactory获取Bean实例
      • MyBean bean = (MyBean)factory.getBean("myBean");      

ApplicationContext

  • BeanFactory的一个子接口⭐
  • 添加了更多的企业特定的功能
    • 更方便的集成Spring的AOP功能
    • 消息资源处理
    • 事件的发布
  • ApplicationContext实现
    • ClassPathXmlApplication
    • FileSystemXmlApplication
    • XmlWebApplicationContext
    • AnnotationConfigApplicationContext

 BeanFactory和ApplicationContext区别:

  • BeanFactory提供了配置框架和基本功能,ApplicationContext添加了更多的企业特定功能
  • ApplicationContext是BeanFactory的一个子接口,也是一个完整的超集
  • 两者实例化Bean的载入方式不同
    • BeanFactory延迟载入所有Bean,直到getBean()方法调用时才被创建
    • ApplicationContext启动后载入所有单例Bean,通过预载入单实例Bean,确保当需要时使用

Bean

  1. Bean的实例化
    1. 通过构造方法实例化
    2. 使用静态工厂方法实例化
      1. factory-method=“静态方法名”
      2. class=“类名目录”
    3. 使用实例工厂实例化
      1. factory-bean=“包含工厂方法的bean名称”
      2. factory-method=“”(bean工厂方法
      3. class属性为空

 Bean的生命周期

  1. 实例化
  2. 设置属性
  3. 设置Bean名称、Bean工厂、应用上下文
  4. 初始化前预处理
  5. 初始化Bean
  6. 初始化后预处理
  7. Bean准备好
  8. 销毁Bean

Bean的初始化和销毁方法

  1. 实现InitializingBean接口、DisposableBean接口
    1. 简单、Bean实现和Spring框架耦合
  2. 在bean配置文件配置init-method、destroy-method方法
  3. 注解@PostConstruct、@PreDestory

(singleton)单例作用域是针对一个Spring容器一个实例、是Spring中Bean的默认作用域

Spring不管理原型作用域的完整生命周期,只负责初始化、配置、组装。不调用Bean的销毁方法。

 

依赖注入

 

  • 对象之间的依赖关系
  • 创建Bean并注入他所依赖的Bean对象
  • Spring中的注入方式:
    • 构造器注入
      • 有参的构造方法
      • 在配置文件内,<constructor-arg name=" " value=" "></constructor>
      • type="String"
      • index="0"
      • name="num1" 
      • 引用注入  <constructor-arg  ref=" "></constructor>
    • Setter方法注入
      • 需要有set方法
      • 配置文件中 name与类中命名一直
        • 基本数据类型注入
          • <property name=" " value=" ">
          • 字符串、数值型数据、布尔类型
        • NULL注入
          • <property name=" "> <null /> </property>
        • 引用数据类型注入
          • 引用
            • <property name=" " ref=" "/>
            • <property name=" "><ref bean=" "/></property>
          • 内部Bean
            • <property name=" "> <bean class=" "> </property>
            • 内部Bean不能重复使用,只能被注入
        • List类型和数组类型
          • <property name=" ">
            • <list>
              • <ref bean=" "/>
              • <value>A</value>
            • </list>
          • </property>
        • Set类型(保证每一个元素都是唯一的)  
        • Map类型 
          • <property name=“xxx”>

            • <map>

              • <entry key=“a” value-ref=“aa” />

              • <entry key=“b” value-ref=“bb” />

            • </map>
          • </property>
        • Properties 
          • 键值都是字符串类型<props> <prop key="">abc</prop> 

 

 高级Bean注入

  • Spring容器可以自动装配互相协作Bean的关联关系
  • 在配置文件的beans中 default-autowire="byType"
  • 自动装备优点:
    • 自动装配可以显著的减少指定属性或者构造器参数的需求
    • 当对象发生变化时自动装配可以更新配置而不需要修改配置
  • 自动装配局限性:
    • Property和constructor-arg显示的依赖设置会覆盖自动装配
    • 自动装配没有显示编写明确
    • 在容器中可能存在多个bean的定义与自动装配的setter方法或者构造方法参数匹配。若bean定义不唯一,装配时会抛异常

  

  • 模板装配(声明父类Bean和子类Bean)
  • 指定<bean> 中abstract=“true”
    • bean时抽象的,不能实例化
    • 可做模板,抽象共同属性  
  • 指定parent,parent=“?Bean”
    • 可继承父Bean属性,和类
    • 覆盖继承的属性

 

  • 外部属性文件
    • location属性处理单个文件
    • 多个属性文件用location属性指定list
    • 使用${xx.xx}来获值
    • <context:property-placeholder   location="XXX.XXX"/>

 

 数据验证和EL。

数据验证不应该被限定在Web层处理

Validator接口:Spring提供Validator接口来进行对对象的验证

  1. supports(Class)   判断validator是否能校验提供的class实例
  2. validate(Obeject,org.springframework.validation.Errors) 晓燕给定的对象,有校验失败信息放入Errors对象

SpringEL:Spring表达式语言

  • 支持查询和操作运行时对象导航图功能的强大的表达式语言
  • 提供额外功能,函数调用、简单字符串的模板函数
  • 不直接依赖于Spring,可独立使用

ExpressionParser接口,解析表达字符串

ExpressionParser parser = new SpelExpressionparser();

Expression e = parser.parserExpression("  '字符串'  ");

String message = (String)e.getValue();

 

EL使用:  #{<表达式字符串>}⭐

各种框架

JSF-web框架

EJB--分布式企业级框架⭐(消息驱动bean、会话bean、持久化bean)

SSH

Struts

Spring

webwork----Struts2

 

Hibernate

Spring、SpringMVC、SpringDataJpa

Mybatis

 基于XML的配置元数据

value="#{id.name}"

基于注解的配置元数据

@Value("#{memory}")

EL可以使用的场景

  1. 方法
    1. EL可以调用一个对象的属性、方法,并将返回值注入给另一个对象的属性
    2. @Value("#{'tea'.toUpperCase()}")
  2. 构造
    1. EL可以调用new关键字,实现构造方法调用,实例化出对象
    2. @Value("#{new int[]{1,2,3}}")
  3. 操作符
    1. EL支持大多数的算数运算符,@Value("#{3+4}")
    2. 关系运算符 @Value("#{1^1}")
    3. 逻辑运算符 @Value("#{5>3}")
    4. 三元运算符  @Value("#{1> 2? 0:1}")
  4. 集合
    1. 支持List  @Value("#{A.list}")
    2. Properties  
    3. Map    @Value("#{A.map['1']}")
    4. 集合的选择
      1. .?[]    设置筛选条件
        1. @Value("#{A.list.?[li>1]}")
        2. @Value("#{A.map.?[key=='1']}")
      2.  .^[]    获取第一个匹配项
      3.  .$[] 获取最后一个匹配项 
    5. 集合的投影
      1. .![] 选择特定属性
        1. @Value("#{A.students.![name]}") 
    6. 选择和投影可以结合使用

代理模式

 

  • 代理模式创建代理对象,让代理对象控制目标对象的访问,并且可以在不改变目标对象的情况下添加一些额外的功能
  • 静态代理:
    • 代理对象与被代理对象必须实现同一接口,在代理对象中实现日志
  • 动态代理:
    • InvocationHandler接口,
    • 操作代理对象时会执行invoke()方法,
    • 使用Proxy.newProxyInstance()静态方法建立一个代理类对象(必须告知要代理的接口

AOP(Aspect-Oriented Programming 面向切面编程)

 

  1. 提供一种新的组织程序结构的思路
  2. 对OOP补充,可OOP一起使用
  3. OOP核心单位为类、AOP核心单位为切面
  4. 典型:日志、验证、事务管理
  5. 优点:
    1. 便于开发人员集中关注系统的核心业务逻辑
    2. 利于创建松散的、可复用的、可扩展的软件系统
  • 关注点:特定的问题、概念、或成需要达到的目标。
  • 横切关注点:一个关注点被多个类或者方法引用
  • 切面:一个切面是对一个横切关注点的模块化
  • 连接点:程序执行过程中的某个点,方法调用或者抛出异常

 

  • 通知:在特定连接点应执行动作
  • 切入点:什么地方植入通知
  • 目标对象:被切面所通知的对象
  • 织入:将切面应用到目标对象,从而创建新的代理对象

 

通知类型

  • 前置通知(Before advice): 在某连接点之前执行的通知
  • 后置通知(After returning advice): 在某连接点正常完成后执行的通知
  • 异常通知(After throwing advice): 在方法抛出异常退出时执行的通知
  • 最终通知(After finally advice): 当某连接点退出的时候执行的通知
  • 环绕通知(Around advice): 包围一个连接点的通知,这是最强大的一种通知类型

AOP实现

  1. SpringAPI传统方式
  2. 纯POJO类(Advice不用实现任何接口)
    1. 基于Schema的XML配置 <aop>
    2. 基于注解驱动的切面  
    3. (* 包名 .* .*(..))    过滤器  包  类  方法  方法参数
  3. 使用AspectJ切面

 

SpringMVC

SpringMVC是基于请求驱动,围绕一个核心Servlet 转发请求到对应的Controller而设计的

 

  1. 客户端发出请求,交给DispatcherServlet处理
  2. DispatcherServlet根据请求信息及HandlerMapping的配置找到处理请求的处理器(Handler)
  3. DispatcherServlet通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler
  4. 处理器完成业务逻辑,返回一个ModelAndVIew给DispatcherServlet,ModelAndView包含视图逻辑名和模型数据信息
  5. DispatcherServlet借由ViewResolver完成逻辑视图名到真实视图的解析工作
  6. 得到View真实视图后,DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行渲染
  7. 最终客户得到响应

 

DispatcherServlet前端控制器,负责流程控制。继承自httpServlet

使用专门的Bean处理请求和渲染视图,在WebApplicationContext配置

  • HandlerMapping:传入请求映射到处理器⭐
  • HanderAdapter:将处理器包装成适配器,支持多种处理器
  • ViewResolver:视图解析器,将逻辑视图名解析为具体的View⭐
  • LocaleResolver&LocaleContextResolver:本地化和国际化
  • ThemeResolver:Web主提
  • MultipartResolver:文件上传

⭐客户请求经由前端控制器DispatcherServlet后,分发给后续子控制器Controller

注解:

@Controller 表明被注解的类为控制器,

{@ResponseBody 在方法上,表示返回数据。}

@RestController return "x" 返回的是数据

 

@RequestMapping("/xx") 用于映射URL,写在类、方法级别上

在类上表该控制器中所有方法都是相对于该路径的,两级、多级路径,

@RequestMapping("/a");

@RequestMapping("b");

若类级别无该注解,则每个方法直接映射方法注解上的路径

@RequestMapping("/b");

 限制请求类型

@RequestMapping(value="/b",method=Request.GET);

URI模板模式,获取请求参数的值

@RequestMapping(value="method/{id}")

method(@PathVariable int id){}

路径模式

@RequestMapping

/a/b  精确

/a/*/c  一个模糊

/a/**/d  多个模糊

/a/b?   精确模糊

URI模板+Ant风格

/a/*/{b}

 

矩阵变量

开启:<mvc:annotation-driven enable-matrix-variables="true"/>

a/b/32;c=1;d=2

@RequestMapping(value="/a/b/{id}",method=RequestMethod.GET)

(@PathVariable String id,@MatrixVariable int c,@MatrixVariable int d)

 

/a/40,m=1/b/20,m=2

@RequestMapping(value="/a/{id}/b/{pd}",method=RequestMethod.GET)

@MatrixVariable(value="m",pathVar="id") int id1,

@MatrixVariable(value="m",pathVar="pd") int id2

 

 

@RequestParam将请求参数绑定到方法参数

method(@RequestParam("id") int id)  

1.文本、超链接的字

2.拿到的变量

@RequestParam(value="",required=true defaultValue="1")

required请求参数必须传

defaultValue 默认值

@CookieValue

在方法参数里写 @CookieValue("JSESSIONID")String id

@RequestHead("Accept-Encoding") String ad  头信息

@ResponseBody 用在方法上,表示直接将返回数据写在Http响应体里

@GetMapping  处理Get请求

@PostMapping 处理Post请求

 

拦截器

Spring的Handler映射机制包含了Handler拦截器

使用handler拦截器,可以在某些请求应用特殊的功能,检查权限、防止表单重复提交

必须实现HandlerInterceptor接口

preHandler 在handler执行前调用

postHandler  在handler执行后调用

afterCompletion(..) 在整个请求完成后调用

 

文件上传


<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">

 

 视图解析ViewResolver、视图View是Spring处理视图的两个重要接口

ViewResolver提供视图名称和真实视图之间的映射

View真正进行视图渲染,把结果返回给浏览器

InternalResourceViewResolver

是URLBasedViewResolver子类

定义了前缀、后缀、和控制器返回的视图名称拼接,解析为视图对象

将模型数据存放到对应的HttpServletRequest中,转发到相应的页面视图

<bean class="#">

<property name="prefix" value="/WEB-INF/"/>

<property name="suffix" value=".jsp"/>

</bean>

 

ResourceBundleViewResolver

是AbstractCachingViewResolver子类

需要配置文件定义逻辑视图名称和真正View对象的对应关系

<bean class="#">

<property name="basename" value="views"/>

<property name="order" value="1"/>

</bean>

 

test.(class)=org.springframework.web.servlet.view.InternalResourceView

test.url=/test.jsp

BeanNameViewResolver

 

posted @ 2020-06-05 22:38  不爱学习的小策  阅读(115)  评论(0)    收藏  举报