做互联网小程序 和网站有没有前景,浙江网站建设工作室,宁波网站建设怎么建设,公司工商注册信息1.循环依赖
循环依赖其实就是循环引用#xff0c;也就是两个或者两个以上的 Bean 互相持有对方#xff0c;最终形成闭环。比如A 依赖于B#xff0c;B又依赖于A Spring中循环依赖场景有:
prototype 原型 bean循环依赖
构造器的循环依赖#xff08;构造器注入#xff09;…1.循环依赖
循环依赖其实就是循环引用也就是两个或者两个以上的 Bean 互相持有对方最终形成闭环。比如A 依赖于BB又依赖于A Spring中循环依赖场景有:
prototype 原型 bean循环依赖
构造器的循环依赖构造器注入
Field 属性的循环依赖set注入
其中构造器的循环依赖问题无法解决在解决属性循环依赖时可以使用懒加载spring采用的是提前暴露对象的方法。
2.三级缓存解决循环依赖问题 ①Spring容器初始化ClassA通过构造器初始化对象后提前暴露到Spring容器中的singletonFactorys三级缓存中。
②ClassA调用setClassB方法Spring首先尝试从容器中获取ClassB此时ClassB不存在Spring 容器中。
③Spring容器初始化ClassBClasssB首先将自己暴露在三级缓存中然后从Spring容器一级、二级、三级缓存中一次中获取ClassA 。
④获取到ClassA后将自己实例化放入单例池中实例 ClassA通过Spring容器获取到ClassB完成了自己对象初始化操作。
⑤这样ClassA和ClassB都完成了对象初始化操作从而解决了循环依赖问题。
3.Bean的注解
Component 通⽤的注解可标注任意类为 Spring 组件
Service 在业务逻辑层使用service层
Repository 在数据访问层使用dao层
Controller 在展现层使用控制器的声明controller层 ●注入bean的注解
Autowired默认按照类型来装配注入Qualifier可以改成名称
Resource默认按照名称来装配注入JDK的注解新版本已经弃用 ●Autowired注解原理
Autowired的使用简化了我们的开发实现 AutowiredAnnotationBeanPostProcessor 类该类实现了 Spring 框架的一些扩展接口。 实现 BeanFactoryAware 接口使其内部持有了 BeanFactory可轻松的获取需要依赖的的 Bean。 实现 MergedBeanDefinitionPostProcessor 接口实例化Bean 前获取到 里面的 Autowired 信息并缓存下来 实现 postProcessPropertyValues 接口 实例化Bean 后从缓存取出注解信息通过反射将依赖对象设置到 Bean 属性里面。 ●SpringBootApplication注解等同于下面三个注解 ✮SpringBootConfiguration 底层是Configuration注解说白了就是支持JavaConfig的方式来进行配置
✮EnableAutoConfiguration开启自动配置功能
✮ComponentScan就是扫描注解默认是扫描当前类下的package
4.SpringMVC
Controller 声明该类为SpringMVC中的Controller
RequestMapping 用于映射Web请求
ResponseBody 支持将返回值放在response内而不是一个页面通常用户返回json数据
RequestBody 允许request的参数在request体中而不是在直接连接在地址后面。
PathVariable 用于接收路径参数
RequestMapping(/hello/{name})申明的路径将注解放在参数中前即可获取该值通常作为Restful的接口实现方法。
●SpringMVC原理 ①客户端浏览器发送请求直接请求到 DispatcherServlet 。
②DispatcherServlet 根据请求信息调⽤ HandlerMapping 解析请求对应的 Handler 。
③解析到对应的 Handler 也就是 Controller 控制器后开始由HandlerAdapter 适配器处理。
④HandlerAdapter 会根据 Handler 来调⽤真正的处理器开处理请求并处理相应的业务逻辑。
⑤处理器处理完业务后会返回⼀个 ModelAndView 对象 Model 是返回的数据对象
⑥ViewResolver 会根据逻辑 View 查找实际的 View 。
⑦DispaterServlet 把返回的 Model 传给 View 视图渲染。
⑧把 View 返回给请求者浏览器
5.SpringMybatis
Insert 插入sql ,和xml insert sql语法完全一样
Select 查询sql, 和xml select sql语法完全一样
Update 更新sql, 和xml update sql语法完全一样
Delete 删除sql, 和xml delete sql语法完全一样
Param 入参
Results 设置结果集合Result 结果
ResultMap 引用结果集合
SelectKey 获取最新插入id Qmybatis如何防止sql注入
A简单的说就是#{}是经过预编译的是安全的${}是未经过预编译的仅仅是取变量的值是非安全的存在SQL注入。在编写mybatis的映射语句时尽量采用**“#{xxx}”这样的格式。如果需要实现动态传入表名、列名还需要做如下修改添加属性statementTypeSTATEMENT同时sql里的属有变量取值都改成${xxxx}**
●Mybatis和Hibernate的区别 ✮Hibernate 框架
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据库表的映射。是一个全自动的、完全面向对象的持久层框架。 ✮Mybatis框架
Mybatis是一个开源对象关系映射框架原名ibatis,2010年由谷歌接管以后更名。是一个半自动化的持久层框架。 ●区别
★开发方面
在项目开发过程当中就速度而言
hibernate开发中sql语句已经被封装直接可以使用加快系统开发
Mybatis 属于半自动化sql需要手工完成稍微繁琐
但是凡事都不是绝对的如果对于庞大复杂的系统项目来说复杂语句较多hibernate 就不是好方案。 ★sql优化方面
Hibernate 自动生成sql,有些语句较为繁琐会多消耗一些性能
Mybatis 手动编写sql可以避免不需要的查询提高系统性能 ★对象管理比对
Hibernate 是完整的对象-关系映射的框架开发工程中无需过多关注底层实现只要去管理对象即可
Mybatis 需要自行管理映射关系