【SpringUtil】1、基础内容

一、废话

对于没有详细学习过Spring的小白(我),看到SpringUtil的内容基本是一脸懵逼;先不说SpringUtil干什么用,至少得先看懂写了什么,于是乎,按照小白的能力,整理了这一篇专门了解SpringUtil中涉及的基础内容。
本文主要都是个人理解,有错请大家指正。

二、SpringUtil

这里给出SpringUtil基本该有的方法。

@Component
public class SpringUtil implements ApplicationContextAware {
    
    
    /** 静态成员*/
    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    
    
        context = applicationContext;
    }

    public static <T> T getBean(Class<T> beanClass) {
    
    
        return context.getBean(beanClass);
    }

三、SpringUtil中涉及的基础内容

如果懂的可以跳过,没时间的瞟一眼标记的内容,简单理解即可。(单纯的笔记)

1、静态成员static 及扩展(静态与非静态)

静态成员就是加上static的变量,静态方法就是加上static的方法;
非静态成员/方法就是没加上static的变量/方法。

  1. 静态变量

静态变量是属于 整个类的变量 而不是属于某个对象的。
静态成员变量在类装载的时候就进行了创建,在整个程序结束时按序销毁。
Java类中的 静态变量 在程序运行期间,其内存空间对所有该类的对象实例言是共享的,有些时候可以认为是全局变量。因此在某些时候为了节省系统内存开销、共享资源,可以将类中的一些变量声明为静态变量

  1. Java中静态成员和非静态成员使用起来主要有以下几个区别:

1.静态成员可以直接通过类名来访问,而非静态成员必须通过对象来访问。
2.静态成员可以在类的任何地方使用,而非静态成员需要在类的实例化对象中使用。
3.在静态方法中不能访问非静态变量和方法;非静态方法可以访问静态和非静态变量和方法

  1. 类加载过程中,执行的顺序【扩展】

执行的顺序
1、静态变量或静态语句块(按声明顺序)
2、非静态变量或构造代码块(按声明顺序)
3、构造方法
4、@Value/@Autowired等
且非静态变量等后三种都是在创建bean注入的时候才会进行

  1. 静态代码块(主动)【扩展】

静态代码块 是自动执行的,项目启动的时候就执行的时候,这种代码是主动执行的。
当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。

  1. 静态方法(被动) 以及 什么时候使用【扩展】

一个不需要创建对象的方法,只需要在类中定义的方法前加上static关键字。
1、在静态方法里只能直接调用 同类中其他的静态成员(包括变量和方法),而不能直接访问类中的 非静态成员。
这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象
2、静态方法不能以任何方式引用this和super关键字,
因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。

当你这个类中的这个方法不需要对象就能运行时,使用静态方法,通常都是在工具类中定义静态方法!这样使用工具类不必创建对象,可以直接类名.方法名来使用!

2、ApplicationContextAware

总结:ApplicationContextAware实现类在应用启动的时候就会初始化,意味着SpringUtil在项目启动后,就会被初始化(加载该类)

ps:这个部分我并没有详细看过,只是知道这个的最终目的。
Spring之ApplicationContextAware使用详解

3、ApplicationContext

ApplicationContext就是Spring上下文(Spring容器、也可以说是IOC容器)
Spring上下文包含了Bean对象、Bean的定义、Bean的配置、Bean之间的依赖关系、Bean的生命周期等信息。
【使用@Component就是把该类加入到Spring容器中,由Spring容器管理】

Spring上下文即是Spring容器的一种抽象化表述【时间充足可以仔细了解】
Spring基础篇——Spring容器和应用上下文理解

4、setApplicationContext

背景是,SpringUtil实现了ApplicationContextAware,ApplicationContextAware又继承了Aware。

实现了ApplicationContextAware接口的类会被调用setApplicationContext方法,从而获取到spring容器的上下文,因此需要@Override重写setApplicationContext方法。
ps:这里重写set方法是必要的!!!

当正在实例化的类是Aware类型时,且是ApplicationContextAware类型时就会调用到setApplicationContext(this.applicationContext)方法把spring上下文设置进去。
ps:这个部分我并没有详细看过,只是知道这个的最终目的。
ApplicationContextAware接口的setApplicationContext方法调用过程

5、 public < T > T泛型方法

1、public 与 返回值T 中间< T >非常重要,可以理解为声明此方法为泛型方法。
2、只有声明了< T >的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
3、< T >表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
4、与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等 形式的参数 常用于表示泛型。
java 泛型详解

ps:"?"是属于实际参数,与String,Integer等同,只是表达不确定,可以代表任何类型(String,Integer…)

6、Class< T >

· 单独的 T 代表一个类型(表现形式的参数是一个类名而已)
· Class< T > 代表这个类型T所对应的类(又可以称做类实例、类类型、字节码文件)
Class< T > 相当于Class< T > c = T.class 或者 Class< T > c = (对象t).getClass()
类常量 X.class 被定义为具有类型 Class,所 以 String.class 是 Class 类型的。

7、context.getBean()

没有对这里进行深入研究,这个地方主要是BeanFactory接口的方法。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42516475/article/details/130166448
今日推荐