• Spring框架学习(一)


    Spring框架包含很多内容,需要了解spinrg cloud就要看spring boot,而spring boot又要看Spring Core(Spring Framework)的基本介绍。

    花了两天左右,断断续续看了spring core相关的教程,包括

    • java2blog:看的一个回答推荐的,不过内容可能略有陈旧,倒不是体现在版本,而是页面之间跳转有问题,层次有点不清,感觉是疏于维护的样子
    • tutorialspoing,没有细看,因为想找一个稍微系统一点的,而在这里,似乎是只有spring的
    • 官方文档,以详细程度来说的确无出其右,但是有官方文档的通病,涉及各种细节,初学很容易陷进去,我初步浏览了一下bean和resource部分。里面会涉及不少我不了解的东西,因为本身对java也不太熟,所以不知道是java还是spring的内容。而有些内容的确是前后颠倒了,比如java annotation相关的一些,在开始的时候看到会感觉一头雾水。
    • howtodoinjava,这个看的比较多,是个人作者写的,比较通俗易懂,也没有涉及太多细节。

    Spring学习内容

    初步了解Spring以后,个人理解Spring的功能就是做依赖注入(从我目前了解的Spring Core的角度来说,Spring Boot等还没学习)。Spring Framework的各种功能,围绕如何配置依赖注入展开。

    关于Bean

    Bean是Spring操作的基本单位,Bean可以被注入依赖,也可以作为依赖被注入到其他的Bean中。

    那么什么是Bean,任何Class可以通过XMl配置,或者注解annotation的方式被识别为Bean。

    一个类/对象,从Bean的角度,他还有类的类型,Bean的名字、别名等相关信息,通过这些信息,可以以各式各样的手段,设置需要被注入的Bean。

    框架基础

    Bean的信息被加载到ApplicationContext中,或者说ApplicationContext维护一系列Bean的关系,在需要的时候生成Bean,在需要的地方使用适当的Bean注入,并且对Bean的生命周期可以进行一系列定制化操作。

    怎么维护bean的信息

    1. 通过xml文件定义bean,以及bean中的属性依赖的bean/或者字面值
    2. 通过@Autowired等注解,标注一个类的某个字段、或者构造函数需要自动注入依赖。
    3. 通过@Component等标识标明一个类为Spring的组件,通过ApplicationContext的组件扫描方法,将所有扫描到的组件加入到框架维护的bean中。

    如何生成需要的bean

    默认spring的容器在初始化时就会创建所有的bean,bean是单例模式的,除非特别的指明其他的scope(如prototype)。

    所以当其他地方需要某个bean时,初始化时创建的bean 就会被提供出来。

    什么是需要的地方?

    首先spring的依赖注入,都是基于bean的基础上进行的。

    需要的地方可以是一个bean的:

    • 构造函数
    • 类成员(可以是Private)
    • getter/setter

    通过XML配置,或者@Autowired/@Inject等注解方式,标识这个地方的参数需要依赖注入

    需要的地方所谓的合适的bean是什么?

    一般是通过名字注入。

    比如一个bean注册时,名字叫CapitalA的Capital类,另一个bean需要一个名称为CapitalA的bean,就可以通过

    @Autowired
    @Qualifier("CapitalA")
    private Capital capital;
    

    来配置注入。

    当然可以有更简单的方式,比如整个程序里,只有一个Capital类型的bean,那么省略bean的名字,Spring也可以按类型定位到所需要的bean。

    另外还可以通过字段的名字来寻找,是第三优先级的查找。

    维护生命周期

    bean的生命周期,有初始化前,初始化中,初始化后,销毁等。

    bean的初始化中和销毁前的这两个情况,可以通过如下方式定义

    • XML配置init-method, destroy-method
    • 注解@PostConstructPreDestroy
    • 实现特定相应接口,并实现对应的回调方法,spring框架会进行调用

    bean的初始化前和初始化后可以通过BeanPostProcessor接口的各个实现类来注册,spring会识别接口的实现,自动在每个(或者指定的)bean的两个阶段调用接口方法。

    各种-Aware接口

    这个其实类似生命周期的概念,bean可能需要引用spring这个容器类(ApplicationContext本身,或者他实现的一些其他接口),获取一些特定的不是配置生成的bean,或者获取资源文件等。

    这时候通过实现各种-Aware接口的方法,spring会在创建bean的初始化过程中,注入这个bean需要的容器相关的类。

    关于注解

    除了spring自带的,还有JSR-250JSR-330等规范定义的注解。

    首先注解也都是为了实现依赖注入相关功能的,不过比较一开始令我疑惑的是@Component/@Service/@Repository/@Controller。

    这里说的我觉得比较清楚,这些注解其实都是扩展的Bean类,都能被组件扫描到,使用不同的注解,Spring在处理过程中会稍有不同,比如Repository会特殊处理其中抛出的异常以匹配数据库异常。

    另外这些注解多用于语义表述,清楚的标明每个类的层次,相比而言@Component没有确切业务层次含义。

  • 相关阅读:
    JS身份证验证 根据身份证计算生日 年龄
    手机号码归属地TXT文档数据写入DB
    页面返回 上一页 下一页
    ASP.NET 出错页面处理
    添加外鍵
    WinForm Read Excel
    Winform 中实现省市联动效果
    微信支付之二维码支付(native)
    C#多线程同步(转)
    HTTP超文本传输协议HTTP/1.1中文版(收藏)
  • 原文地址:https://www.cnblogs.com/mosakashaka/p/12609077.html
Copyright © 2020-2023  润新知