官网 添加链接描述
这么老多呢
我只有四五个月的时间,钻牛角尖要不得
老师说应该单例,为什么?我记得一阶段的时候老师跟我说这些应该不是单例的
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:请求头添加数据。