# java_end_course **Repository Path**: fangzhiyuedev/java_end_course ## Basic Information - **Project Name**: java_end_course - **Description**: java技术分享 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-04-29 - **Last Updated**: 2022-04-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## java技术分享 ### 1.基础部分 #### 1.java语言 ##### 1.java8新特性-lambda表达式 对于基本的语法结构,这里不在讲解,前端的同学可以按照前端的语法编写,=改为-就行,下面主要通过对集合操作相关的labbda熟悉这种语法结构 ,以及集合的stream的使用技巧。 ##### 2.java8新特性-异步编排 CompletableFuture 异步编排, CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步[回调](https://so.csdn.net/so/search?q=回调&spm=1001.2101.3001.7020)、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利。 这里举个例子,对于前端开发来说,接口的链式调用非常常见,假如请求省市区三级数据,不考虑方法递归的问题,那么接口调用如下 ```javascript getDataList(param,url,(resp)=>{ // //获得省的详情 let item=resp.data.list[0]; getDataList(item,url,(resp1)=>{ //获得市的详情 let item=resp1.data.list[0]; getDataList(item,url,(resp1)=>{ //获得区的详情 }) }) }) ``` 我们发现上面的这种链式调用非常的恶心,代码可读性很差,(不考虑promise)调用,仅仅作为一个例子, 那么对于后端来说,CompletableFuture对异步编排提供了更加简化的代码调用,同时,使用多线程方案,极大的提升了系统的并发量 #### 2.spring基础 - 1.概述 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架, 核心:依赖注入+控制翻转 ioc di 控制翻转?:将原来对bean的管理直接交给spring容器进行管理 依赖注入?:bean与bean之间的依赖不在用过new的形式,通过spring管理bean直接操作@autowired进行植入依赖 - 2.ioc(控制反转) 将之前我们自己对bean的管理权交给了spring容器管理 - 3.di (依赖注入) 使用spring管理之后,我们对bean与bean之间的依赖使用spring提供的注入的形式,不在使用new的形式, 实现了实体与实体的解耦。 两种方式:setter注入,构造函数注入 - 4.bean的类型 1.普通bean 2.FactoryBean 工厂bean SqlsessionFacotoryBean ProxyBeanFcotry 3.beanFacory bean car() engine(); - 5.bean的作用域 ![image-20220427085410432](./java技术分享.assets/image-20220427085410432.png) 默认spring注入的都是singleton(单例的),所以@ controller注解的类,实际并不是一个线程安全的类,如果添加的全局field,就会存在锁竞争导致线程安全问题. AutoMticIN - 6.bean的生命周期 ![image-20220427085434282](./java技术分享.assets/image-20220427085434282.png) 下面是在断点调试过程中看到的实际代码实现过程,我们可以发现 后置处理器的before和after方法中间调用了init-method或则@PostConstruct ![image-20220429141533114](./java技术分享.assets/image-20220429141533114.png) - 10.常见注解 | 注解 | 作用 | | | ------------------------- | ------------------------------------------------------------ | ---- | | @RequestMapping("/aaa") | 加在类上面,用于映射controller,加在方法上面用于映射HandMethod,这种注解可以映射不同的请求,不区分请求方式 | | | @Resource("user") | *@resource*注解由J2EE提供,默认按照byName自动注入 | | | @Qualifier | *@Autowired*注解由Spring提供,只按照byType注入 | | | @Scope | 指定bean被注入的作用域,不指定都是单例的 | | | @Primary | 默认进行byType注入,如果出现相同类型,需要指定首先启用哪一个 | | | @Component | 组件注解,(核心) spring底层组件,被标记的都会被当做系统的组件 | | | @Controller | @Component的衍伸注解,标记web的入口,相同的还有@Service和@Repository,用来标记业务逻辑层和存储层 | | | @ResponseBody | 表示当前类或方法的返回值直接返回responseBody中,处理期间会通过查找系统内部定制的转换器尝试进行数据的转换,如果是json类型,会通过一个 AbstractJackonToHttpMessage转换为json,直接写入respone流中,不在走视图解析流程 | | | @RequestBody | 从请求体中获取数据,一般是post请求,这种一般对应前端的 application/json请求, | | | @RequestParam | 请求参数的映射,key,val的形式,这种前端一般提交为 form表单提交,get请求 | | | @GetMapping,PutMaping ... | @RequestMapping的衍伸注解,用来标记各种请求,如get,post,put,delete等 | | | @Configuration | 用来标记当前类作用为一个配置类,作用相当于applicationContext.xml,内部可以在方法上面加上@Bean 代表的就是 bean的id为方法的名称 | | | @PostConstruct | 同bean的xml配置的init-method的注解配置,配置在方法中,bean初始话的时候自动的调用 | | | @PreDestroy | bean销毁的时候调用的方法,主要作用例如关闭线程,关闭连接,释放锁资源,清除文件的引用 | | #### 3.mybatis基础 下面是mybatis的执行过程 #### ![image-20220426192205978](./java技术分享.assets/image-20220426192205978.png) - 3 .支持的别名,也就是说在mybatis里面使用这些别名会自动的被mybatis映射成对应的java类型 ![image-20220426211449566](./java技术分享.assets/image-20220426211449566.png) ```xml //等价 ``` - 4.加载mapper的几种方式 ```xml ``` - 5.事项 ``` @Mapper 和@MapperScaner @MapperScan(value = "com.atguigu.springboot.mapper") 用来替代@Mapper的实现 所以使用了@MapperScaner指定包的话,不用在接口上面加上@Mapper注解 MapeerProxy ``` #### 4.springmvc基础 - 1.目录结构 打包之后的目录结构 ![image-20220426225940153](./java技术分享.assets/image-20220426225940153.png) 代码工程 ![image-20220426230229970](./java技术分享.assets/image-20220426230229970.png) webapp下面文件可以直接访问 javaweb WEB-INF 下面的目录的是私有的,不能直接访问,可以放置需要认证等访问的页面,通过contrller 调整 java 下面的代码会被打包到 WEB-INF 下面的classes目录下面 - 2.springmvc框架执行流程 ![image-20220426231429845](./java技术分享.assets/image-20220426231429845.png) 这个就是Springmvc框架的执行流程.核心是DispatcherServlet HandlerMapping SimpleUrlHandlerMapping类通过配置文件把URL映射到Controller类。 HandlerAdapter RequestMappingHandlerAdapter类处理@RequestMapping注解的方法 我们通过上面两个实现类发现,mapping和adaper能够找到对应的handler(处理器),进行业务逻辑的处理 对于目前使用json进行接口开发,之后的运行过程不是重点,大家关注前面两个类即可。 上面的图片只是带大家了解一下springmvc的指定过程,在实际的开发过程中,我们核心是开发Handler 也就是我们常说的controller。 #### 5.springboot基础 springboot是为了简化spring整合,降低开发的整合第三方系统的门槛,通过大量的自动配置类,我们可以通过添加指定的场景启动器的pom 坐标,来实现启动指定的功能 ##### 1.创建前端工程 ###### 1.创建前端工程 ```shell #npm设置阿里的镜像源 npm config set registry https://registry.npm.taobao.org --global # npm安装vue-cli脚手架 npm install --global vue-cli #vue命令初始话脚手架的工程 vue init webpack vuedesktop #安装工程依赖 npm install #运行开发环境 npm run dev ``` ###### 2.配置Elemetui框架 ```shell npm i element-ui -S ``` ###### 3.配置,在main.js中配置如下的内容 ```vue import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI); ``` ###### 4.配置基本后台菜单页面 在HelloWorld里面配置主页面菜单的代码 ```vue
用户管理 用户优惠信息管理 用户详情管理
``` ###### 5.配置路由。 在router.js中配置二级子路由 ```js routes: [ { path: '/', name: 'HelloWorld', component: HelloWorld, redirect: '/person', children: [ { path: '/person', name: 'person', component: user, }, { path: '/userdetail', name: 'userdetail', component: userdetail, }, { path: '/coupon', name: 'coupon', component: coupon, }, ] } ] ``` ###### 6.删除代码生成工程的认证代码 ```js isAuth('generator:coupon:save')" ``` ###### 7.安装axios ```shell npm install --save axios vue-axios ``` ###### 8.配置axios 在main.js中配置如下 ```js import axios from 'axios' import VueAxios from 'vue-axios' Vue.use(VueAxios, axios) ``` ###### 9.配置代码生成器api请求兼容代码 1.创建NetUrl类 在util文件下面 ```js export var rootUrl="http://localhost:8084/crud"; ``` 在main.js里面配置如下 ```js //配置网络请求相关的环境 import {rootUrl} from './util/NetUrl'; Vue.$http.adornUrl = (url) => { return rootUrl + url; } Vue.$http.adornParams = (adornParams) => { return adornParams; } ``` ##### 2.创建后端工程 ###### 1.创建后端工程 ###### 2.配置端口,数据源,mybatis包扫描 ###### 3.搭建基本包路径 ###### 4.创建数据库,表 ###### 5.copy生成代码的实体 ###### 6.基本代码开发 ###### 7.cros处理 ### 2.进阶部分 ### 1.数据库相关 1.springboot事物执行过程 - 1.测试事物运行 代码 见springboot - 2.事物执行核心逻辑 ![image-20220429143427821](./java技术分享.assets/image-20220429143427821.png) 2.当事物遇上异步 #### 2.springmvc部分 1.spring全局异常处理过程,jump异常处理 2.如下异常出现原因 ``` No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request 大致意思:在请求线程之外的线程中使用了request attr, 或则处理一个请求在 request---携带--> attr属性 async--->里面使用的request并未是原有的request,获取attr导致错误 ``` 3.缓存+异步重建 ``` ``` 4.常见注解,以及对应的aop切面类 ``` Transactional ``` 5.攻击防御 xss防御 系统内置的bean的后置处理器 ![image-20220429141325496](./java技术分享.assets/image-20220429141325496.png)