新闻| 文章| 资讯| 行情| 企业| wap手机版| article文章| 首页|会员中心|保存桌面|手机浏览
普通会员

易达信息科技

企业列表
新闻列表
推荐企业新闻
联系方式
  • 联系人:依依
友情链接
  • 暂无链接
首页 > 新闻中心 > 【自用】终于爪巴完底层了,Spring了,乱杀
新闻中心
【自用】终于爪巴完底层了,Spring了,乱杀
发布时间:2024-11-17        浏览次数:0        返回列表

官网 添加链接描述

【自用】终于爪巴完底层了,Spring了,乱杀

在这里插入图片描述

这么老多呢

在这里插入图片描述

我只有四五个月的时间,钻牛角尖要不得

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

老师说应该单例,为什么?我记得一阶段的时候老师跟我说这些应该不是单例的

1、这东西不适合随用随new

2、他只是一个实体类,不需要承载数据

3、里面有各种各样的方法,用来执行方法逻辑的

4、随用随new的话,对象就重复了

多例这么写

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

随着业务的变更,我的服务类 他的构造器改变了(比如需要实参了,那其他有这个实现类的地方到处都要改,要改的地方可能非常多,维护起来特别麻烦

就算是多例
改这一个地方就可以了

在这里插入图片描述

本来应该单例的对象在内存中重复了多次,还有可能在for循环里面new,我超,笑死

上层只依赖于下层的抽象接口,不依赖他具体的实现类

就算我不用接口多态的形式,一点区别也没有

在这里插入图片描述

如果是依赖实现类的方式,当我升级的时候,就要去一个一个的去改

在这里插入图片描述

这样controller就依赖,就是上层依赖于下层的具体实现类了,就没有达到==通过 接口,把controller 和 服务类 隔离开的目的 ==

在这里插入图片描述

我想让他真正的隔离其实是这样的

只有这样的代码,才是让控制层依赖了真正的抽象服务层

在这里插入图片描述

耦合,手拉着手,她动我也动,他往左,我也往左

解耦,就是卡了一个板,我和她各牵一个绳,她想走,把绳子松开就是了

虽然还有依赖关系,但是依赖关系很松了就是

中间隔个板,他两牵着绳,下层松手了,换了个人。因为隔着个板子,所以上层是不知道下层变了的

就是为了service变动,控制层不用动

也就是一个个独立的jar包的方式

如果还是耦合很严重的话,我的天啊,下层的service变动,我上层的controller还要重新打包,懂了,原来是这个原因
spring还能管理sqlSessionFatory druidDataSource (连接池对象),所谓的交由它来管理是指spring来进行对象的new ,来进行对象依赖关系的维护(就是依赖注入啦

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。

Context可以理解为对BeanFactory的封装.包含BeanFactory选择/配置/Bean来源加载/定义容器启动流程,为其提供上下文以及丰富的拓展,这是直面使用者的接口.

在这里插入图片描述

添加链接描述

Spring expression Language(简称 SpEL)是一个支持查询和操作运行时对象的强大的表达式语言。贯穿着整个 Spring 产品组的语言。

Jakarta Commons-logging(JCL)是apache最早提供的日志的门面接口。提供简单的日志实现以及日志解耦功能。

在这里插入图片描述

在这里插入图片描述

NB啊,读取配置文件的那一瞬间,所有东西都弄好了,很难不不想象这里面到底有多少步骤,多么深的核心逻辑

在这里插入图片描述

在这里插入图片描述

之前咱们的getBean 要根据不同的参数名去获得

在这里插入图片描述

他这里面直接就一个方法,传参进去就行

你信不信这个getbean 如果他能做的话,他能给你做出来一个下拉列表来

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

犯的错,tama的,null,null,null,笑死了

在这里插入图片描述

今天开始除了实体类,其他类就不要再new了!从今天,我的心是冷的,刀是冷的

居然可以不指定名字

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

不指定名字,可以直接用.class去调

在这里插入图片描述

原型?photoType 这是什么?有点像vue里面给对象挂载对象的东西

在这里插入图片描述

设计模式里面有一个模式,叫做原型模式

容器里面存的只是一个代码的模板,我们每一次从容器里面get的对象,都是从原型的对象里面拷贝了一份出来了,是深拷贝
深拷贝

深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突。

拷贝出来,就是一个新对象了就是

spring指定为原型模式之后

打印日志

在这里插入图片描述

就像是懒加载一样 啊,这就是多例模式啊,行吧。我想多了

在这里插入图片描述 在这里插入图片描述

要求控制层的框架必须是多例的,如果是单例会有线程安全问题

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

init 方法可以复制 销毁方法,可以释放资源,释放容器bean里面的资源‘’在这里插入图片描述

这东西的用处

?都是实例化了,磨磨唧唧半天里面居然没有连接

在这里插入图片描述

?居然还能这么配置spring xml 对象(震惊

其实和上面的代码差不多,看来我还是只是不熟悉xml这种语言罢了

在这里插入图片描述

还是空的

在这里插入图片描述

这个连接池需要调用 init方法,才有值的吗

在这里插入图片描述

在这里插入图片描述

所以,要陪这两个方法

在这里插入图片描述

为什么连接池需要close

添加链接描述

可以看到localhost一直处于响应状态,即使退出想重新进入到主页面也是一直处于响应状态,并没有跳转到主页面。所以,使用完数据库一定要切记,关闭或者释放掉数据库连接

大概是这个意思 添加链接描述

只不过如果客户端不主动关闭,服务器可能花很长时间才能侦测到连接断了—服务器是依靠超时做这个事情的。

比如注册mybatis 的 SqlsessionFactory 对象到容器

这样,肯定不行

在这里插入图片描述

因为它的构造器需要configuration
这是个极为复杂的对象,不是我能用手init的出来的

在这里插入图片描述

给他一个空壳子没有用的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

天啊,日志,二级缓存,懒加载我都快忘了怎么回事了

在这里插入图片描述

,果然简单
他的意思是把这个类里面的方法执行了,返回的结果放回到容器里面
不是吧这个类实例化了放 容器里面

在这里插入图片描述

,NB啊,他是通过 这个类对象 去 容器里面找 对应的东西

在这里插入图片描述

就是这种方式

在这里插入图片描述

非静态的话,就不能通过类名.方法名了

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

看来这些标签,不止是自动补全的作用啊,还有解析的作用

在这里插入图片描述

在这里插入图片描述

@Controller

在这里插入图片描述

@Service

在这里插入图片描述

在这里插入图片描述

他可能仅仅是使用了aop这个包里面的某个东西

在这里插入图片描述

在这里插入图片描述

老师问这个controller 里面的service 里面有值没有

在这里插入图片描述

居然没有值,因为没有依赖注入

在这里插入图片描述

看看容器里面,这四个使我们自己的,其他的是spring内部的一些对象

对注解进行识别,或者监听器对象

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

看里面的那个value值

在这里插入图片描述

不要写,因为他默认的那个首字母小写,就可以了

在这里插入图片描述

瞬间变多例了

在这里插入图片描述

在这里插入图片描述

构造器完成之后执行的方法 @PostConstruct

销毁对象前执行的方法 @PreDestroy

在这里插入图片描述

,后续再来说

在这里插入图片描述

在这里插入图片描述

因为它底层就是在调用setUrl setDriverClassName setUsername

引用其他bean的id 用ref 引用对象

简单数据类型用 value

在这里插入图片描述

老师说不要用这个,排版比较乱,认识就可以了

在这里插入图片描述

引入对象

在这里插入图片描述

引入值

在这里插入图片描述

现在没有无参构造了

在这里插入图片描述

没有无参构造,所以报错

在这里插入图片描述

name 和 index 二选一

index 好方便啊,但是如果后期更改的话,改变了次序的话,有点小麻烦

ref 和 value 二选一

使用name

在这里插入图片描述

使用index

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

array list map

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

像不像匿名内部类

注意内部bean没有注册到容器当中

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

你看那个IUserService.class 是不是和 我手动去获取对象那个,差不多

在这里插入图片描述

这个时候因为去掉了serviceImpl的注解,容器里面没有这个对象,所以会报错

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

spring不会知道去找那个

NoUniqueBeanDefinitionException(实际项目中基本不会出现这个错误,知道一些我有好处)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

不用管它,直接用,能运行为主

在这里插入图片描述

placeholder占位符

在这里插入图片描述

可以把两步省了

在这里插入图片描述

在这里插入图片描述

classPath:表示根路径,项目根路径

注解:本类当中会帮我们加载配置文件来创建容器,同时把

测试类也加载到容器当中

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

包扫描 在这里插入图片描述

引子:添加链接描述

我们经常在编程中见到 context 这个单词,当然每个人有每个人的理解,它被理解为:上下文、容器等等。我想说的是,context 理解为上下文最为合适。为什么呢?我以一个在计算机系统的例子来解释一下。

Context可以理解为对BeanFactory的封装.包含BeanFactory选择/配置/Bean来源加载/定义容器启动流程,为其提供上下文以及丰富的拓展,这是直面使用者的接口.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

添加链接描述

在这里插入图片描述

@ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件

添加链接描述

在这里插入图片描述

在这里插入图片描述

同时把测试类也加载到容器里面了,不要为他是怎么加进去的,我不管

把测试类注进容器里面,我才能在容器里面找到他,然后把依赖注入进去,啊,我死了,他这个设计怎么这么精巧

他应该是测试类专用注解,那他应该就有这个功能

怎么使用什么serivce impl 之类的,直接依赖注入,自动装配

wired (与计算机系统)联网的,连线的; autoWired

老师这个是先匹配名字,匹配不到,再去匹配类型

在这里插入图片描述

笑死我了,老师已经解释了这个,但是我没听懂,果然听课和理解吸收,是两个步骤啊

在这里插入图片描述

bean context core expression

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

添加链接描述

对于SpringBoot项目来说,classpath指的是src.main.java和src.main.resources路径以及第三方jar包的根路径在这里插入图片描述

老师可能也没说错,因为他们编译后最终都会在这个文件夹下

在这里插入图片描述

properties文件解析:new Properteis().load(InputStream in)

  • 添加dom4j.jar
  • SAXReader对象实例化,read方法加载xml输入流,返回document对象,getRootElement方法获取根标签

springmvc是spring中的web支持组件。对servlet技术进行了二次封装,提高代码开发效率。

servlet开发存在的问题:getParameter,非NULL判断,转型,封装对象。一个servlet只能处理一个业务。返回json数据。

  • 添加spring环境;4个核心包,1个日志包,1个spring-aop包
  • 添加spring-web;spring-webmvc;jackson的三个包;
  • 创建了UserController控制器对象,使用RequestMapping注解一个方法。
  • 在springmvc.xml配置文件中,配置springmvc注解的识别。
 
  • 在web.xml配置Springmvc的前端控制器加载springmvc.xml,创建容器,解析Controller层的RequestMapping注解进行url映射。
  • DispatchServlet:在tomcat启动时,init方法中加载指定的xml配置文件,初始化了WebApplicaitonContext容器对象,由于容器中RequestMappingHandlerMapping处理器映射器对象,对Controller层的bean对象进行深度解析,解析此类bean中的RequestMapping注解,进行url映射,把url字符串映射到一个处理器方法上。
  • 当用户发起请求时,请求进入DispacherServlet,该对象去容器中获取RequestMappingHandlerMapping处理器映射器对象,根据url获取到处理器方法。
  • 找到处理器方法后,disaptcherServlet去容器中获取RequestMappingHandlerAdapter处理器适配器对象,该对象负责执行处理器方法。
    • 在执行处理器方法之前,springmvc通过HttpMessageConverter消息转换器对象做了请求参数的获取,转型,封装工作。
    • 当请求参数通过消息转换器处理完成后,才执行处理器方法。
  • 处理器方法有返回值,在同步开发模式下,返回值是一个视图名称。通过ViewResolver视图解析器对象,得到完整的视图路径,最终服务器做视图转发操作。

HttpMessageConverter读取到url,请求体中的参数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

k=v:url?k=v&k=v 或者 请求体k=v&k1=v1

  • 处理器方法添加简单类型形参,形参名与表单参数名保持一致

  • 处理器方法添加复杂对象类型形参,对象成员变量名与表单参数名一致,一定要有set方法。

  • 可以通过@RequestParam为简单类型参数赋默认值

MappingJackson2HttpMessageConverter把请求体中的json字符串转到形参类型的对象。

  • 要接收json数据,形参不能是简单类型(String,Double,Interger;形参不能有多个。只能有一个复杂对象型(实体,集合,map)。

  • 形参使用@RequestBody注解,表示使用MappingJackson2HttpMessageConverter这个json消息转换器把请求体中的json字符串转目标对象。

  • 配置视图解析器对象到容器,指定视图的统一前缀与后缀。
  • 处理器方法返回视图。
 

MappingJackson2HttpMessageConverter把对象转字符串

  • 方法1:在处理器方法或处理器类(控制层bean对象)加@ResponseBody注解。不建议使用

  • 方法2:使用RestController替换Controller注解,该注解是复合注解,Controller+ResponseBody,建议使用

  • 方法3:处理器方法返回值类型改为ResponseEntity对象。该对象可以指定响应头。响应体。

 

添加Request,response,session形参即可。

 

在类上使用RequestMapping注解做第一层url映射

在方法上使用GetMapping,PostMapping做第二层url映射;限定前端请求方式只能是get或post

总结

开启mvc注解识别

@RestController:取到Controller,表示方法返回值转json字符串返回前端

@RequestMapping:做url映射,不限定请求方式

@GetMapping:限定get请求

@PostMapping:限定post请求

@RequestParam:为k=v格式的参数指定默认值

@DateTimeFormat:为k=v格式的日期字符串指定日期格式,便于转为Date对象

@RequestBody:接收请求体的json字符串,转形参对象

@ResponseBody:表示方法返回值转json字符串返回前端

@JsonFormat:为json格式参数的日期字符串转date对象指定日期格式

@JsonInclue:非null序列化

一个对象:ResponseEntity:指定响应头。

postman:

params:在url上拼接?k=v

headers:请求头添加数据。