java

1、安装Element搬运自官方文档https://element.eleme.cn/#/zh-CN/component/quickstartnpm安装推荐使用npm的方式安装,它能更好地和webpack打包工具配合使用。npmielement-ui-S引入Element你可以引入整个Element,或是根据需要仅引入部分组件。按需引入可以参考官方文档,组件列表包括以components.json为准¶完整引入在main.js中写入以下内容:importVuefrom'vue';importElementUIfrom'element-ui';import'element-ui/lib/theme-chalk/index.css';importAppfrom'./App.vue';Vue.use(ElementUI);newVue({el:'#app',render:h=>h(App)});二、优化登录页面1.使用form组件修改Login.vue的<template>内部代码添加form组件:<el-formclass="login-container"label-position="left"label-width="0px"><h3class="login_title">系统登录</h3><el-form-item><el-inputtype="text"v-model="loginForm.username"auto-complete="off"placeholder="账号"></el-input></el-form-item><el-form-item><el-inputtype="password"v-model="loginForm.password"auto-complete="off"placeholder="密码"></el-input></el-form-item><el-form-itemstyle="width:100%"><el-buttontype="primary"style="width:100%;background:#505458;border:none"v-on:click="login">登录</el-button></el-form-item></el-form><el-form>里面可以放置<el-form-item>,<el-form-item>里面再放置其它的内容,比如<el-input>,关于<el-input>的属性,可以查阅Input的文档,<el-button>亦然。2.添加样式还是在login.vue中添加代码,放在最后就可以:<style>.login-container{border-radius:15px;background-clip:padding-box;margin:90pxauto;width:350px;padding:35px35px15px35px;background:#fff;border:1pxsolid#eaeaea;box-shadow:0025px#cac6c6;}.login_title{margin:0pxauto40pxauto;text-align:center;color:#505458;}</style>访问http://127.0.0.1:8080/#/login发现上端有一块空白在浏览器按F12进行debug,可以看到上端有一块60px浮动,查找代码发现app.vue中有一处<style>注释掉即可解决问题。下一章(拦截器)。

java

一、安装数据库1、我的MySQL版本是5.7,官方下载页面是https://dev.mysql.com/downloads/mysql/5.7.html#downloads2、安装教程可以参考https://blog.csdn.net/ma524654165/article/details/778554313、安装完成之后需要在pom文件中添加对mysql的jar包的依赖,当然你也可以在上一篇中新建springboot时和我一样直接选中相关的mysql依赖。同时,上节也说了了如何在application.yml中配置数据库连接了。4、执行sql语句新建一个我们项目中需要的数据库和数据表--------------------------------Tablestructureforuser------------------------------DROPTABLEIFEXISTS`user`;CREATETABLE`user`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`username`varchar(255)DEFAULTNULL,`password`varchar(255)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8;--------------------------------Recordsofuser------------------------------INSERTINTO`user`VALUES('1','admin','123');这里用户密码设置了123哦,后面测试别再输入123456了二、使用数据库验证登录在上一篇中,我们是直接在代码中默认了登录账号和密码为admin和123456,使用了数据库之后,我们则需要从数据库中取出相应登录名以及它所对应的密码并做出相应验证,其余思路和上节类似。User类:packagecom.example.library.pojo;importlombok.Data;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;@Entity//jpa注解,表示这是一个实体类@DatapublicclassUser{@Id//标识主键@GeneratedValue(strategy=GenerationType.IDENTITY)//表示主键自增intid;Stringusername;Stringpassword;}Dao层DataAccessObject(数据访问对象,DAO)即用来操作数据库的对象,代码中通过继承JpaRepository类构建Dao。新建一个package,命名为dao,然后创建JavaClass,命名为UserDAO。代码如下:packagecom.example.library.dao;importcom.example.library.pojo.User;importorg.springframework.data.jpa.repository.JpaRepository;publicinterfaceUserDaoextendsJpaRepository<User,Integer>{UserfindByUsername(Stringusername);UserfindByUsernameAndPassword(Stringusername,Stringpassword);}Jpa有自己的代码规范,这里看似一句SQL语句没写,但实际上函数的命名就为这个函数提供了相应的SQL语句。比如findByUsername,就是通过username字段查询到对应的行,并返回给User类。UserService新建package,命名为service,新建JavaClass,命名为UserService,代码如下:packagecom.example.library.service;importcom.example.library.dao.UserDao;importcom.example.library.pojo.User;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;@ServicepublicclassUserService{@AutowiredprivateUserDaouserDao;publicUsergetByName(Stringusername){returnuserDao.findByUsername(username);}publicbooleanisExist(Stringusername){Useruser=getByName(username);returnnull!=user;}publicUserget(Stringusername,Stringpassword){returnuserDao.findByUsernameAndPassword(username,password);}publicvoidsave(Useruser){userDao.save(user);}}在Dao中定义了增删改查,service这里是对Dao定义的增删改查做进一步处理。LoginController和之前的基本逻辑一样但是,用户密码验证的if语句改成了从数据库读取并判断。就是通过UserService提供的get方法查询数据库,如果返回的对象为空,则验证失败,否则就验证成功。代码如下:packagecom.example.library.controller;importcom.example.library.result.Result;importcom.example.library.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.util.HtmlUtils;importcom.example.library.pojo.User;@ControllerpublicclassLoginController{@AutowiredUserServiceuserService;@CrossOrigin@PostMapping(value="api/login")@ResponseBodypublicResultlogin(@RequestBodyUserrequestUser){//对html标签进行转义,防止XSS攻击Stringusername=requestUser.getUsername();username=HtmlUtils.htmlEscape(username);Useruser=userService.get(username,requestUser.getPassword());if(user==null){Stringmessage="账号密码错误";returnnewResult(400);}else{returnnewResult(200);}}}总结DAO用于与数据库的直接交互,定义增删改查等操作Service负责业务逻辑,跟功能相关的代码一般写在这里,编写、调用各种方法对DAO取得的数据进行操作Controller负责数据交互,即接收前端发送的数据,通过调用Service获得处理后的数据并返回

java

VUE前端编写前面提到过前后端分离的意思是前后端之间通过RESTfulAPI传递JSON数据进行交流。不同于JSP之类,后端是不涉及页面本身的内容的。在开发的时候,前端用前端的服务器(Nginx),后端用后端的服务器(Tomcat),当我开发前端内容的时候,可以把前端的请求通过前端服务器转发给后端(称为反向代理),这样就能实时观察结果,并且不需要知道后端怎么实现,而只需要知道接口提供的功能,两边的开发人员就可以各司其职啦。正向代理:常见的就是梯子。比如我要访问A,但我访问不了,B可以访问,我就先访问B,踩着B去访问A。这是一个主动的过程。反向代理:比如我访问A,A无法处理我的请求,A将我的请求转发到B处理,B处理完成之后又发回给A,这个过程我只知道我访问了A,并不知道A还有一个访问B的过程。这是一个被动的过程。通常可以用于保护B服务器IP。前端页面开发Login.vue首先我们开发登录页面组件,右键src\components文件夹,New->VueComponent,命名为Login,如果没有VueComponent这个选项,可以选择新建一个File,命名为Login.vue即可。代码如下:<template><div>用户名:<inputtype="text"v-model="loginForm.username"placeholder="请输入用户名"/><br><br>密码:<inputtype="password"v-model="loginForm.password"placeholder="请输入密码"/><br><br><buttonv-on:click="login">登录</button></div></template><script>exportdefault{name:'Login',data(){return{loginForm:{username:'',password:''},responseResult:[]}},methods:{login(){this.$axios.post('/login',{username:this.loginForm.username,password:this.loginForm.password}).then(successResponse=>{if(successResponse.data.code===200){this.$router.replace({path:'/index'})}}).catch(failResponse=>{})}}}</script><template>标签中随便写了一个登录的界面,methods中定义了登录按钮的点击方法,即向后端/login接口发送数据,获得成功的响应后,页面跳转到/index。因为之前我们设置了默认的URL,所以请求实际上发到了http://localhost:8443/api/login。AppIndex.vue右键src\components文件夹,新建一个directory,命名为home,再在home下新建一个Appindex.vue,即首页组件,先随便写个HelloWorld。<template><div>HelloWorld!</div></template><script>exportdefault{name:'AppIndex'}</script><stylescoped></style>3.前端相关配置设置反向代理修改src\main.js代码如下:importVuefrom'vue'importAppfrom'./App'importrouterfrom'./router'//设置反向代理,前端请求默认发送到http://localhost:8443/apivaraxios=require('axios')axios.defaults.baseURL='http://localhost:8443/api'//全局注册,之后可在其他组件中通过this.$axios发送数据Vue.prototype.$axios=axiosVue.config.productionTip=false/*eslint-disableno-new*/newVue({el:'#app',router,components:{App},template:'<App/>'})因为使用了新的模块axios,所以需要进入到项目文件夹中,执行npminstall--saveaxios,以安装这个模块。配置页面路由修改src\router\index.js代码如下:importVuefrom'vue'importRouterfrom'vue-router'//导入刚才编写的组件importAppIndexfrom'@/components/home/AppIndex'importLoginfrom'@/components/Login'Vue.use(Router)exportdefaultnewRouter({routes:[//下面都是固定的写法{path:'/login',name:'Login',component:Login},{path:'/index',name:'AppIndex',component:AppIndex}]})跨域支持为了让后端能够访问到前端的资源,需要配置跨域支持。在config\index.js中,找到proxyTable位置,修改为以下内容:proxyTable:{'/api':{target:'http://localhost:8443',changeOrigin:true,pathRewrite:{'^/api':''}}}运行项目执行npmrundev,查看登录页面效果。注意地址是localhost:8080/#/login,中间有这个#是因为Vue的路由使用了Hash模式,是单页面应用的经典用法,但连开发者本人都觉得不太好看,所以可以在路由配置中选择使用History模式,但会引发一些问题,需要在后端作出处理。后端开发User类在Login.vue中,前端发送数据的代码段为:.post('/login',{username:this.loginForm.username,password:this.loginForm.password})后端如何接收这个JS对象呢?我们很自然地想到在需要创建一个形式上一致的Java类。打开我们的后端项目library,首先在src\main\java\com\example\library文件夹(就是你自己的web项目的包)下,新建一个pojo包(package),然后新建User类,代码如下:packagecom.example.library.pojo;importlombok.Data;@DatapublicclassUser{intid;Stringusername;Stringpassword;//publicintgetId(){//returnid;//}////publicvoidsetId(intid){//this.id=id;//}////publicStringgetUsername(){//returnusername;//}////publicvoidsetUsername(Stringusername){//this.username=username;//}////publicStringgetPassword(){//returnpassword;//}////publicvoidsetPassword(Stringpassword){//this.password=password;//}}Result类Result类是为了构造response,主要是响应码。新建result包,创建Result类,代码如下:packagecom.example.library.result;publicclassResult{//响应码privateintcode;publicResult(intcode){this.code=code;}publicintgetCode(){returncode;}publicvoidsetCode(intcode){this.code=code;}}LoginControllerController是对响应进行处理的部分。这里我们设定账号是admin,密码是123456,分别与接收到的User类的username和password进行比较,根据结果返回不同的Result,即不同的响应码。前端如果接收到成功的响应码(200),则跳转到/index页面。在library下新建controller包,新建LoginController类,代码如下:packagecom.example.library.controller;importcom.example.library.result.Result;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.util.HtmlUtils;importcom.example.library.pojo.User;importjava.util.Objects;@ControllerpublicclassLoginController{@CrossOrigin@PostMapping(value="api/login")@ResponseBodypublicResultlogin(@RequestBodyUserrequestUser){//对html标签进行转义,防止XSS攻击Stringusername=requestUser.getUsername();username=HtmlUtils.htmlEscape(username);if(!Objects.equals("admin",username)||!Objects.equals("123456",requestUser.getPassword())){Stringmessage="账号密码错误";System.out.println("test");returnnewResult(400);}else{returnnewResult(200);}}}这里只是为了演示前后端的交互过程,真正的登录验证要考虑更多因素,后面文章会持续更新。另外,实际上在controller里写这么多逻辑是不合理的,要尽量封装到service里面去。最后,在src\main\resources文件夹下找到application.yml文件配置端口,即加上server.port=8443。测试项目同时运行前端和后端项目,访问localhost:8080/#/login,输入用户名admin,密码123456点击确定,成功进入跳转到http://127.0.0.1:8080/#/index!最简陋的项目已经完成,后面继续更新数据库!部分转载自:https://learner.blog.csdn.net/article/details/88955387

java

MVC框架:Model——即模型。模型一般都有很好的可复用性,统一管理一些我们需要使用的数据。(处理需求,一般就是对数据库处理,springboot中的DAO层代码)View——用于存放试图。(负责展示给用户和从用户接受需求)Controller——控制器它负责处理View和Model的事件。(负责转发)MVVM框架:随着应用的Controller的负担越来越大因此在MVC的基础上繁衍出了MVVM框架。VUE:1.安装并新建一个项目vue是MVVM框架类型的。先安装nodejs,去官网下载安装即可。安装cnpm,国内源。npminstall-gcnpm--registry=http://registry.npm.taobao.org之后的所有npm命令都可以用cnpm代替了。安装vue脚手架。npminstall-gvue-cli执行npminitvue@latest创建一个新项目。也可以通过webpack创建一个项目:vueinitwebpackdemo(一路回车就行)cd到项目目录下cnpminstall下载依赖包(尤其是在git中克隆了别人的项目,这一步是必须的)运行项目npmrundev2.vue目录结构和代码分析(1)index.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><linkrel="icon"href="/favicon.ico"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>ViteApp</title></head><body><divid="app"></div><scripttype="module"src="/src/main.js"></script></body></html>首页代码<!--builtfileswillbeautoinjected-->,我们所构建的整个app会被注入到app这个div中(2)App.vue.vue文件是一种自定义文件类型,在结构上类似html,一个.vue文件即是一个vue组件。<template><divid="app"><imgsrc="./assets/logo.png"><router-view/></div></template><script>exportdefault{name:'App'}</script><style>#app{font-family:'Avenir',Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;margin-top:60px;}</style><router-view/>标签是一个容器,名字叫“路由视图”。表示当前路由(URL)指向的内容将显示在这个容器中。也就是说,其它的组件即使拥有自己的路由(URL,需要在router文件夹的index.js文件里定义),也只不过表面上是一个单独的页面,实际上只是在根组件App.vue中。比如我们打开一个点餐的页面,然后进入了一个商家,在这商家的菜品里,我们每一个都点开了一遍,但是却都只用了商家的容器,都在商家这个页面上。(3)main.jsimportVuefrom'vue'importAppfrom'./App'importrouterfrom'./router'Vue.config.productionTip=false/*eslint-disableno-new*/newVue({el:'#app',router,components:{App},template:'<App/>'})在这个js文件中,创建了一个Vue对象(实例),el属性提供一个在页面上已存在的DOM元素作为Vue对象的挂载目标,router代表该对象包含VueRouter,并使用项目中定义的路由。components表示该对象包含的Vue组件,template是用一个字符串模板作为Vue实例的标识使用,类似于定义一个html标签。3、vue+springboot登录模块开发我用的IDE是IntelliJIDEA新建project暂时选择了这些依赖当然这样是前后端分离的,毕竟我们要用vue了,之前在学springboot的时候还推荐了thymeleaf这个模板,用这个的话,你可以自己在resource写前端页面,自行百度吧,我是想快速接入开发组,所以不看了。(另外,如果是新手的话最好百度一下maven本地仓库配置等内容进行学习)点击create进行创建,创建完毕run起来,并访问127.0.0.1:8080run了一下发现需要配置mysql数据库,毕竟自己选择了mysql组件了,傻了。打开resource下的application.yml,我不习惯用properties文件,喜欢yml配置。配置完成,run起来:不要慌!我们做的是前后端分离的项目,现在只是后端,没有绑定前端,接下来开始前端编写!部分转发自https://learner.blog.csdn.net/article/details/88955387

java

报错见标题,但同时,数据表也会丢失,网上查到的方法都是让把数据表主键改成自增,但是问题并没有解决,运行程序后数据表还是会丢失,检查配置文件发现,配置了如下信息:hibernate.hbm2ddl.auto=create-dropcreate-dropcreate-drop百度搜索发现,这玩意其实这个hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议setvalue="none"。create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。再说点“废话”:当我们把hibernate.hbm2ddl.auto=create时hibernate先用hbm2ddl来生成数据库schema。当我们把hibernate.cfg.xml文件中hbm2ddl属性注释掉,这样我们就取消了在启动时用hbm2ddl来生成数据库schema。通常只有在不断重复进行单元测试的时候才需要打开它,但再次运行hbm2ddl会把你保存的一切都删除掉(drop)----create配置的含义是:“在创建SessionFactory的时候,从scema中drop掉所以的表,再重新创建它们”。注意,很多Hibernate新手在这一步会失败,我们不时看到关于Tablenotfound错误信息的提问。但是,只要你根据上面描述的步骤来执行,就不会有这个问题,因为hbm2ddl会在第一次运行的时候创建数据库schema,后续的应用程序重启后还能继续使用这个schema。假若你修改了映射,或者修改了数据库schema,你必须把hbm2ddl重新打开一次。于是乎,注释掉这玩意就好了。部分转载自https://www.cnblogs.com/feilong3540717/archive/2011/12/19/2293038.html

java

在springboot中,摒弃了spring以往项目中大量繁琐的配置,遵循约定大于配置的原则,通过自身默认配置,极大的降低了项目搭建的复杂度。同样在springboot中,大量注解的使用,使得代码看起来更加简洁,提高开发的效率。这些注解不光包括springboot自有,也有一些是继承自spring的。本文中将springboot项目中常用的一些核心注解归类总结,并结合实际使用的角度来解释其作用。•项目配置注解1、@SpringBootApplication注解查看源码可发现,@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解。这三个注解的作用分别为:@SpringBootConfiguration:标注当前类是配置类,这个注解继承自@Configuration。并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。@EnableAutoConfiguration:是自动配置的注解,这个注解会根据我们添加的组件jar来完成一些默认配置,我们做微服时会添加spring-boot-starter-web这个组件jar的pom依赖,这样配置会默认配置springmvc和tomcat。@ComponentScan:扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。等价于<context:component-scan>的xml配置文件中的配置项。大多数情况下,这3个注解会被同时使用,基于最佳实践,这三个注解就被做了包装,成为了@SpringBootApplication注解。2、@ServletComponentScan:Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,这样通过注解servlet,拦截器,监听器的功能而无需其他配置,所以这次相中使用到了filter的实现,用到了这个注解。3、@MapperScan:spring-boot支持mybatis组件的一个注解,通过此注解指定mybatis接口类的路径,即可完成对mybatis接口的扫描。它和@mapper注解是一样的作用,不同的地方是扫描入口不一样。@mapper需要加在每一个mapper接口类上面。所以大多数情况下,都是在规划好工程目录之后,通过@MapperScan注解配置路径完成mapper接口的注入。添加mybatis相应组建依赖之后。就可以使用该注解。进一步查看mybatis-spring-boot-starter包,可以找到这里已经将mybatis做了包装。这也是spring的一个理念,不重复造轮子,整合优秀的资源进入spring的体系中。4、资源导入注解:@ImportResource@Import@PropertySource这三个注解都是用来导入自定义的一些配置文件。@ImportResource(locations={})导入其他xml配置文件,需要标准在主配置类上。导入property的配置文件@PropertySource指定文件路径,这个相当于使用spring的<importresource/>标签来完成配置项的引入。@import注解是一个可以将普通类导入到spring容器中做管理•controller层1、@Controller表明这个类是一个控制器类,和@RequestMapping来配合使用拦截请求,如果不在method中注明请求的方式,默认是拦截get和post请求。这样请求会完成后转向一个视图解析器。但是在大多微服务搭建的时候,前后端会做分离。所以请求后端只关注数据处理,后端返回json数据的话,需要配合@ResponseBody注解来完成。这样一个只需要返回数据的接口就需要3个注解来完成,大多情况我们都是需要返回数据。也是基于最佳实践,所以将这三个注解进一步整合。@RestController是@Controller和@ResponseBody的结合,一个类被加上@RestController注解,数据接口中就不再需要添加@ResponseBody。更加简洁。同样的情况,@RequestMapping(value="",method=RequestMethod.GET),我们都需要明确请求方式。这样的写法又会显得比较繁琐,于是乎就有了如下的几个注解。普通风格Rest风格@RequestMapping(value=“”,method=RequestMethod.GET)@GetMapping(value=“”)@RequestMapping(value=“”,method=RequestMethod.POST)@PostMapping(value=“”)@RequestMapping(value=“”,method=RequestMethod.PUT)@PutMapping(value=“”)@RequestMapping(value=“”,method=RequestMethod.DELETE)@DeleteMapping(value=“”)这几个注解是@RequestMapping(value="",method=RequestMethod.xxx)的最佳实践。为了代码的更加简洁。2、@CrossOrigin:@CrossOrigin(origins="",maxAge=1000)这个注解主要是为了解决跨域访问的问题。这个注解可以为整个controller配置启用跨域,也可以在方法级别启用。我们在项目中使用这个注解是为了解决微服在做定时任务调度编排的时候,会访问不同的spider节点而出现跨域问题。3、@Autowired:这是个最熟悉的注解,是spring的自动装配,这个个注解可以用到构造器,变量域,方法,注解类型上。当我们需要从bean工厂中获取一个bean时,Spring会自动为我们装配该bean中标记为@Autowired的元素。4、@EnablCaching@EnableCaching:这个注解是springframework中的注解驱动的缓存管理功能。自spring版本3.1起加入了该注解。其作用相当于spring配置文件中的cachemanager标签。5、@PathVariable:路径变量注解,@RequestMapping中用{}来定义url部分的变量名,如:同样可以支持变量名加正则表达式的方式,变量名:[正则表达式]。•servcie层注解1、@Service:这个注解用来标记业务层的组件,我们会将业务逻辑处理的类都会加上这个注解交给spring容器。事务的切面也会配置在这一层。当让这个注解不是一定要用。有个泛指组件的注解,当我们不能确定具体作用的时候可以用泛指组件的注解托付给spring容器。2、@Resource:@Resource和@Autowired一样都可以用来装配bean,都可以标注字段上,或者方法上。@resource注解不是spring提供的,是属于J2EE规范的注解。两个之前的区别就是匹配方式上有点不同,@Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配。•持久层注解1、@Repository:@Repository注解类作为DAO对象,管理操作数据库的对象。总得来看,@Component,@Service,@Controller,@Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理@Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能。通过这些注解的分层管理,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。所以我们在正常开发中,如果能用@Service,@Controller,@Repository其中一个标注这个类的定位的时候,就不要用@Component来标注。2、@Transactional:通过这个注解可以声明事务,可以添加在类上或者方法上。在springboot中不用再单独配置事务管理,一般情况是我们会在servcie层添加了事务注解,即可开启事务。要注意的是,事务的开启只能在public方法上。并且主要事务切面的回滚条件。正常我们配置rollbackforexception时,如果在方法里捕获了异常就会导致事务切面配置的失效。•其他相关注解@ControllerAdvice和@RestControllerAdvice:通常和@ExceptionHandler、@InitBinder、@ModelAttribute一起配合使用。@ControllerAdvice和@ExceptionHandler配合完成统一异常拦截处理。@RestControllerAdvice是@ControllerAdvice和@ResponseBody的合集,可以将异常以json的格式返回数据。如下面对数据异常返回的统一处理。这里是对平时用到的一些注解做了归纳,及应用说明。还有其他更深的知识还需要在后续的用中继续学习。转载:https://mp.weixin.qq.com/s/eE9bLX5invvMjGePprO2Ew