当前位置:网站首页 > Java基础 > 正文

java spring菜鸟教程(javascrip菜鸟教程)



学习视频链接:https://www.bilibili.com/video/BV1zd4y1L7YD


例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


本章节,我们会深入了解【容器和上下文】,并从源码的角度做出深度的解析。目前,我们所接触的容器主要有servlet容器和spring的容器,容器在应用程序用中十分重要,大致有以下好处:

1、统一管理,使用容器通常需要按照统一的规范,比如我们的Jakarta Servlet™ 6.0规范,spring6.0规范等等。按照特定规范,编写规范的容器内容(servlet,bean),可以更好的管理容器内容的生命周期。

2、隔离应用,屏蔽外界的复杂性,更专注于业务开发。理论上,我们可以不明白容器是如何启动的,如何建立了连接等等,可以将更多的精力放在业务上。

3、分层管理,每个层边界清晰,各司其职,如mvc的容器就和spring的容器不一样,又互相关联。

bean工厂是我们spring容器的载体,是spring上下文的主要内容。下图展示了我们整个bean工厂的常见的接口和类以及功能,其中我们需要注意几点:

  1. 不同的接口展现了不同的能力,是对子类能力的抽象
  2. 抽象类构建通用方法的实现,是通用核心方法的具体实现
  3. 具体类完成特定功能的实现,是特定功能的具体实现

有了这样的思想,我们才能更好的去阅读源码:

在这里插入图片描述

1、基础能力

从接口的定义中,我们可以完全了解bean的基础功能,主要是获取bean以及获取bean的一些基本特征:

 

ObjectProvider是为了解决隐式注入时产生的问题而提出的概念。

spring4.3之前,我们的bean如果需要使用特定构造器进行构造时必须使用@Autowired注解:

 

spring4.3之后,就可以不写,容器会隐式为你注入

在当容器的bean可用且唯一时当然没有问题,但是容器如果没有这个bean就会出问题:

 

此时ObjectProvider就发挥作用了:

 

这样注入的好处很明显,如果容器中不存在UserDao或者存在多个UserDao时,可以从容处理。

ObjectProvider接口如下,他继承自ObjectFactory,这个接口后边也会常用:

 

ObjectFactory作为一个对象工厂函数式接口更是简单:

 

修改UserService,新增login方法:

 

编写测试用例:

 

2、更强的枚举能力

ListableBeanFactory为后续的实现类提供了更强的枚举能力,这些能力可能不对外公开,但是对于子类操作容器的操作bean十分重要,我们不妨看看他提供的接口:

 

3、灵活的分层能力

分层的能力十分重要,这在web工程里有典型应用,spring和springmvc会建立两个独立的上下文,后续涉及web工程时我们再深入讲解,分层之后各司其职,更易管理:

 

可以写如下测试用例测试:

 

4、构建和自动装配的能力

这个接口的实现及其复杂,主要是赋予子类自动装配的能力,是容器最核心的接口,这个接口定义了bean的创建以及装配能力,同时细粒度的控制了bean的生命周期:

 

接口中我们遇到如下的类,这里简单看看:

NamedBeanHolder简单的包装了beanName和beanInstance,我们通过【别名或者类型】查找bean时可以返回这个结果:

 

DependencyDescriptor是一个依赖描述符,这个类可以包装构造函数参数、方法参数或字段,允许统一访问它们的元数据,这在注入的时候很有用,比如给定一个【构造参数的描述】或【字段的描述】或【setter方法】,找到与之匹配的bean。

 

5、更强的配置能力

这个bean工厂接口并不用于正常的应用程序代码中。这个扩展接口只是为了允许框架内部的即插即用和对bean工厂配置方法的特殊访问,具体如下:

 

6、更多配置项

AbstractAutowireCapableBeanFactory为子类提供了更多的配置项如下:

 

如下的测试用例中我们使用spring的简单实例化策略和BeanWrapper工具,实现了bean的实例化和属性填充:

 

这个小例子一定要好好看一看,对后续的内容很有帮助。

我们可以阅读一下简单的实例化策略:

 

现在,我们来看一下以下两个配置项(不常用,知道就行了)也是来解释hasMethodOverrides的含义:

1、lookup-method注入

lookup-method注入是spring动态改变bean里方法的实现。指定方法的返回值为某个已经存在的bean。

下面的例子,告诉我们这个方法怎么使用:

 

配置如下:

 

2、replaced-method注入

replaced-method注入是spring动态改变bean方法的一种实现。他可以改变的方法执行逻辑,将方法进行替换,定义替换方法的类(需要继承接口org.springframework.beans.factory.support.MethodReplacer)接口。

 

配置:

 

注意:从源码中得知,基于以上两种方式注入后,bean需要使用cglib生成子类完成目标,由于采用cglib生成之类的方式,所以需要用来动态注入的类,不能是final修饰的;需要动态注入的方法,也不能是final修饰的。

7、工厂的生命周期

bean工厂的生命周期比较简单:start->onRefresh->Running->onClose->stop

每一个生命周期节点都会完成大量的工作,我们后边的内容会详细介绍:

 

一个典型的功能强大的bean工厂实现,就是DefaultListableBeanFactory,事实上我们的容器中维护的beanFactory都是这个类的实例;

我们看一下该类的类图:

在这里插入图片描述

这里简单的总结一下,一个完整的bean工厂应该具备哪些能力?

  1. bean工厂的基础能力,枚举bean,分层,自动装配、独立配置等。
  2. 注册单例bean(包括Factorybean)的能力。
  3. 注册别名的能力。

spring给我们提供了很多的扩展点,这些扩展点可以允许我们在spring上下文启动的任意环节进行干预,实现自己的逻辑。我们大致将spring的启动环节画一个图,当然他可能不准确,我们只是想将大致的环节勾勒出来,然后看看其中的可以扩展的地方。

在这里插入图片描述

spring给我们提供的常用的扩展点称为POSTProcessor,也叫后置器。而我们最常使用的BeanFactoryPostProcessor和BeanPostProcessor,我们可以写如下的用例做测试:

BeanFactoryPostProcessor,我们在beanFactory创建后打印了一句话:

 

BeanPostProcessor,我们在bean的初始化前后分别打印了一句话:

 

启动工程,查看结果。

ApplicationContext是应用程序的中央接口,提供一些便利的功能,引导Spring的程序进行启动,他是我们学习spring中的重中之重,理解了ApplicationContext我们就学会了spring。

spring上下文提供了丰富的功能,拥有强大的能力,一切的spring的知识内其实都是为了服务一个ApplicationContext,下图展示了SpringApplication中的一些核心接口和类:

在这里插入图片描述

一个ApplicationContext继承了五个接口,共同为一个上下文赋能,这些接口我们都已经接触过了:

  1. EnvironmentCapable:提供一个上下文环境的能力
  2. ListableBeanFactory:枚举bean工厂的bean的能力
  3. HierarchicalBeanFactory:分层的能力
  4. MessageSource:国际化的能力
  5. ApplicationEventPublisher:发布事件的能力
 

其子接口ConfigurableApplicationContext对ApplicationContext进行了扩展:

 

我们可体会一下registerShutdownHook的用法,我们自己写一个容器类继承GenericApplicationContext:

 

我们编写如下测试类,然后分析一下,我们注册的线程会在何时调用:

 

结果:
before
after
容器关闭了,该干啥干啥吧!

我们在之前的学习中常常使用如下的ApplicationContext实现:FileSystemXmlApplicationContext,ClassPathXmlApplicationContext这里就不演示了。

spring3.0之后我们更推荐如下的实现类,GenericApplicationContext作为一个通用的上下文类,给我们提供了丰富的实现,如下:

 

我们观察一下这个实现类的构造器如下,整个构造的过程如下,在之前的课程中,我们已经学习了加载beanDefintion的过程,下个章节我们就进入【刷新容器的部分】:

 

当然实现类内容和过程基本一致,如下:

 

refresh()方法被定义在AbstractApplicationContext中,该方法会引导spring上下文的启动,所以十分重要,下边我们会单独出一个大章节进行讲解。



到此这篇java spring菜鸟教程(javascrip菜鸟教程)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • python爬虫和java爬虫性能比较(java爬虫和java后端相比)2025-01-27 09:18:05
  • 单向链表反转java实现(单向链表逆序 java)2025-01-27 09:18:05
  • java面试题(华为java面试题)2025-01-27 09:18:05
  • java教学网站(java教学视频网站)2025-01-27 09:18:05
  • 合并数组java(合并数组arr1和数组arr2,结果返回新的数组)2025-01-27 09:18:05
  • java dateutils工具类(java中dateformat类)2025-01-27 09:18:05
  • java爬虫入门教程(java爬虫教学)2025-01-27 09:18:05
  • list转string用逗号隔开java(list<string>转list<integer>)2025-01-27 09:18:05
  • javajvm内存模型(jvm内存模型 知乎)2025-01-27 09:18:05
  • java面试八股文都是什么(java中的八股文)2025-01-27 09:18:05
  • 全屏图片