1.@Api()用于类;
表示标识这个类是swagger的资源;
@ApiOperation不是spring自带的注解是swagger里的 com.wordnik.swagger. annotations.ApiOperation;
@ApiOperation和@ApiParam为添加的API相关注解,个参数说明如下:
@ApiOperation(value = “接口说明”, httpMethod = “接口请求方式”, response = “接口返回参数类型”, notes = “接口发布说明”);其他参数可参考源码;
@ApiParam(required = “是否必须参数”, name = “参数名称”, value = “参数具体描述”)
2.如果不想每次都写private final Logger logger = LoggerFactory. getLogger(当前类名.class);
可以用注解@Slf4j;
3.@RestController=@Controller+@ResponseBody
1.@Controller 是一种特殊化的@Component 类。
@Component:标注Spring管理的Bean,使用@Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean。
bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的
bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象
bean 是由用容器提供的配置元数据创建
控制反转:IOC——Inversion of Control,指的是将对象的创建权交给 Spring 去创建。使用 Spring 之前,对象的创建都是由我们自己在代码中new创建。而使用 Spring 之后。对象的创建都是给了 Spring 框架。
MVC模式(Model-view-controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
@Controller习惯于和@RequestMapping绑定来使用,后者是用来指定路由映射的。
@RequestMapping可以说是SpringMVC以及OpenFeign中最常用的注解,其主要用于映射Web请求。想要让RequestMapping请求返回text/html或者其他非application/json数据,用produces属性配置可以调整数据响应格式。有produces属性可以配置数据的响应格式。当然也有对应的consumes配置用来限定请求映射的数据格式
2.@ResponseBody 是用来把返回对象自动序列化成HttpResponse,
@ResponseBody告诉控制器返回对象会被自动序列化成JSON,并且传回HttpResponse这个对象。
@ResponseBody的作用其实是将java对象转为json格式的数据
常用属性:
(1. content:返回的内容。
(2. status_code:返回的HTTP响应状态码。
(3. content_type:返回的数据的MIME类型,默认为 text/html 。浏览器会根据这个属性,来显示数据。如果是 text/html ,那么就会解析这个字符串,如果 text/plain ,那么就会显示一个纯文本。常用的 Content-Type 如下:
text/html(默认的,html文件)
text/plain(纯文本)
text/css(css文件)
text/javascript(js文件)
multipart/form-data(文件提交)
application/json(json传输)
application/xml(xml文件)
(4. 设置请求头: response['X-Access-Token'] = 'xxxx' 。
常用方法:
(1. set_cookie:用来设置 cookie 信息。
(2. delete_cookie:用来删除 cookie 信息。
(3. write: HttpResponse 是一个类似于文件的对象,可以用来写入数据到数据体(content)中。
依赖注入(DI):Spring 最认同的技术是控制反转的依赖注入(DI)模式。这里将依赖关系部分转化为/两个类之间的关联。例如,类 A 依赖于类 B。现在,让我们看一看第二部分,注入。所有这一切都意味着类 B 将通过 IoC 被注入到类 A 中。
依赖注入主要作用: 依赖注入能够让相互协作的软件组件保持松散耦合。
Spring中依赖注入
依赖注入(DI,DependencyInjection),也叫控制反转(IoC,inversion of control)是Spring框架的核心机制,相当于心脏对于人的重要性,只有真正理解这些核心的功能,才有能力使用spring框架。
Spring中的依赖注入就是上面说的外部,实例不在由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类。 我们不用关心Car的变化,实例之间的依赖关系由IOC容器负责了,等待Spring依赖注入
依赖注入可以以向构造函数传递参数的方式发生,或者通过使用 setter 方法 post-construction。
Spring 框架的一个关键组件是面向切面的程序设计(AOP)框架。一个程序中跨越多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。
3.@RequestBody把HttpRequest body映射成一个 transfer or domain object(DTO或者DO),把一个入境(inbound)的HttpRequest的body反序列化成一个Java对象。
DTO:前端给后端传递的数据
VO:后端给前端传递的数据
DO:数据库表结构
PO:数据库表结构到JAVA的映射类
一般我们使用Mybatis建的类为PO,控制器接受到前端发来的参数为DTO,给前端发送的安全的数据为VO。如果数据类不做映射处理关系时PO=DO
DO与PO的区别
DO为数据库表结构完全一致的对象
PO是数据库表映射后的对象
DTO(Data Transfer Object):数据传输对象,原先是为分布式提供粗粒度的数据实体,减少调用次数来提升性能和降低网络压力。
VO(view object):可视层对象,用于给前端显示的对象。(只传递有需要的参数以保障数据安全)
DO(Domain Object):领域对象,一般和数据中的表结构对应。
PO(Persistent Object):持久化对象,是一种 o/r 映射关系,可以看成是数据库表到java对象的映射。
BO(Business Object)业务对象
BO就是PO的组合
简单的例子比如说PO是一条交易记录,BO是一个人全部的交易记录集合对象
复杂点儿的例子PO1是交易记录,PO2是登录记录,PO3是商品浏览记录,PO4是添加购物车记录,PO5是搜索记录,BO是个人网站行为对象
BO是一个业务对象,一类业务就会对应一个BO,数量上没有限制,而且BO会有很多业务操作,也就是说除了get,set方法以外,BO会有很多针对自身数据进行计算的方法
为什么BO也画成横跨 两层呢?原因是现在很多持久层框架自身就提供了数据组合的功能,因此BO有可能是在业务层由业务来拼装PO而成,也有可能是在数据库访问层由框架直接生成
很多情况下为了追求查询的效率,框架跳过PO直接生成BO的情况非常普遍,PO只是用来增删改使用
BO和DTO的区别
这两个的区别主要是就是字段的删减
BO对内,为了进行业务计算需要辅助数据,或者是一个业务有多个对外的接口,BO可能会含有很多接口对外所不需要的数据,因此DTO需要在BO的基础上,只要自己需要的数据,然后对外提供
在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成
@Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
@Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
@Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错
byName就是拿变量名userService去匹配IOC容器的iduserService,匹配成功;而byType就是拿变量类型UserService去匹配IOC容器的idcom.test.UserService.UserServiceImpl,因为UserServiceImpl是UserService实现,所以也匹配成功
(1)既没指定name属性,也没指定type属性:默认通过byName方式注入,如果byName匹配失败,则使用byType方式注入(也就是上面的那个例子)
(2)指定name属性:通过byName方式注入,把变量名和IOC容器中的id去匹配,匹配失败则报错
(3)指定type属性:通过byType方式注入,在IOC容器中匹配对应的类型,如果匹配不到或者匹配到多个则报错
(4)同时指定name属性和type属性:在IOC容器中匹配,名字和类型同时匹配则成功,否则失败
@RequestMapping 默认method是get,post方式都支持
@RequestMapping(value = “createPickOrder.do”, produces = “application/json;charset=utf-8”, method = RequestMethod.POST)
produces = “application/json;charset=utf-8″:表示返回数据格式 method = RequestMethod.POST表示请求格式
post请求,如果是接收json格式(要求传输参数是json(application/json;charset=utf-8),接收参数要是一个参数或者是一个对象并且参数前加上@RequestBody注解);如果是表单提交(application/x-www-form-urlencoded),接收参数没有要求即可以是对象也可以是多个参数的接收方式
get请求,参数不能是json(application/json;charset=utf-8)格式,只能是表单(application/x-www-form-urlencoded)格式
@PreAuthorize 注解,顾名思义是进入方法前的权限验证,@PreAuthorize 声明这个方法所需要的权限表达式,例如:@PreAuthorize("hasAuthority('sys:dept:delete')"),
根据这个注解所需要的权限,再和当前登录的用户角色所拥有的权限对比,如果用户的角色权限集Set中有这个权限,则放行;没有,拒绝
4.@Data注解在类上时,简化java代码编写,为该类提供读写属性,还提供了equals(),hashCode(),toString()方法
@Getter/@Setter : 注解在类上, 为类提供读写属性
@ToString : 注解在类上, 为类提供 toString() 方法
@Slf4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象
@Log4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象
子类里面这么使用@EqualsAndHashCode(callSuper = false) ,不调用父类的属性,那么子类属性里面的相同的话,那hashcode的值就相同啦,所以代码里面的2个tv的equals方法的返回值是true
@EqualsAndHashCode(callSuper = true),那就是用自己的属性和从父类继承的属性 来生成hashcode,比较的结果就好猜;equals方法的返回值是true,原来他默认就是不管父类继承的属性的。
自动生成hashcode和equals方法,但是没call super,虽然这个class不是直接extends Object类,如果这是故意的,那么请加上@EqualsAndHashCode(callSuper = false) 这句话到你的model上。
@EqualsAndHashCode注解会生成equals(Object other)和hashCode()方法。它默认使用非静态,非瞬态的属性。可以通过参数exclude排除一些属性,也可以通过参数of指定仅使用哪些属性。它默认仅使用该类中定义的属性且不调用父类的方法,可通过callSuper=true让其在生成的方法中调用父类的方法。
@Data注解相当于@Getter、@Setter、@RequiredArgsConstructor、@ToString和@EqualsAndHashCode这5个注解的集合。
@Accessors 注解用来配置lombok如何产生和显示getters和setters的方法。
@Accessors有三个属性,分别是fluent,chain,prefix,@Accessors注解既可以注解在类上也可以注解在属性上
1.fluent
fluent为一个布尔值,如果为true生成的get/set方法则没有set/get前缀,默认为false
例如:
@Accessors(flunet = true)
public class MyClass {
@Getter
private int num;
}
生成的get方法为num(),而不是getNum()
2.chain
chain为一个布尔值,如果为true生成的set方法返回this,为false生成的set方法是void类型。默认为false,除非当fluent为true时,chain默认则为true
3.prefix
prefix为一系列string类型,可以指定前缀,生成get/set方法时会去掉指定的前缀
例如:
@Accessors(prefix = “m”)
public class MyClass {
@Getter
private int mNum;
}
生成的get方法为getNum(),而不是getMNum()
@Accessors 注解用来配置lombok如何产生和显示getters和setters的方法。
@Accessors有三个属性,分别是fluent,chain,prefix,@Accessors注解既可以注解在类上也可以注解在属性上
1.fluent
fluent为一个布尔值,如果为true生成的get/set方法则没有set/get前缀,默认为false
例如:
@Accessors(flunet = true)
public class MyClass {
@Getter
private int num;
}
生成的get方法为num(),而不是getNum()
2.chain
chain为一个布尔值,如果为true生成的set方法返回this,为false生成的set方法是void类型。默认为false,除非当fluent为true时,chain默认则为true
3.prefix
prefix为一系列string类型,可以指定前缀,生成get/set方法时会去掉指定的前缀
例如:
@Accessors(prefix = “m”)
public class MyClass {
@Getter
private int mNum;
}
生成的get方法为getNum(),而不是getMNum()
总结:
1.如果@Accessors(prefix = “xxx”)作用在类上,会对类的所有属性起作用。
2.如果@Accessors(prefix = “xxx”)作用在属性上,只会对当前属性起作用。
3.prefix 的值"xxx"全部小写,比如getTeamNo(),想要的效果是getNo(),那么prefix="team"才行。“Team”、“teaM”都会匹配不上。
@Accessors(chain = true)开启链式编程,这个注解是来至于lombok里面的 只需要在实体类加上就可以开启链式编程了
@ApiModel这个注解
这个注解的是作用在类上面的,是用来描述类的一些基本信息的。下面,我们会逐个的进行讲解。
value属性
这个属性,提供的是类的一个备用名。如果我们不设置的的话,那么默认情况下,将使用的是class类的名字。
description属性
对于类,提供一个详细的描述信息
parent属性
这个属性,描述的是类的一些父类的信息。
discriminator属性
这个属性解释起来有些麻烦,因为这个类主要是体现出了断言当中。
@ApiModelProperty()用于方法,字段; 表示对model属性的说明或者数据操作更改
value–字段说明
name–重写属性名字
dataType–重写属性类型
required–是否必填
example–举例说明
hidden–隐藏
Swagger注解-@ApiModel 和 @ApiModelProperty:
@ApiModel使用场景:在实体类上边使用,标记类时swagger的解析类
@ApiModelProperty使用场景:使用在被@ApiModel注解的模型类的属性上
@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
1、@controller 控制器(注入服务)
2、@service 服务(注入dao)
3、@repository dao(实现dao访问)
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)
@Mapper:
添加了@Mapper注解之后这个接口在编译时会生成相应的实现类
需要注意的是:这个接口中不可以定义同名的方法,因为会生成相同的id
也就是说这个接口是不支持重载的
@Repository
@Repository注解是Spring的注解,使用该注解和@Autowired注解,就不会出现爆红的情况了,原因很简单,因为@Repository注解是Spring的注解,把当前类注册成一个bean了。
@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中。@Param("参数名"),表示给参数命名,名称就是括号中的内容
5.如果传入的参数是基本类型参数和实体类对象。
public List<student> selectuser(@Param(value = "page")int pn ,@Param(value = "st")student student);
<select id="selectuser" resultType="com.user.entity.student">
SELECT * FROM student
where sname like concat(concat("%",#{st.sname}),"%")
LIMIT #{page} ,5
</select>
通用 CRUD 接口(增删改查),就是后台通过前端的URL,动态获取到里面的需要的参数,将参数处理成我们的DB模型接口,就可以使用了。
spring @Table注解 作用是:声明此对象映射到数据库的数据表,通过它可以为实体指定表 (talbe) 常用的两个属性:
1、name 用来命名 当前实体类 对应的数据库 表的名字 @Table (name = "tab_user")
2、uniqueConstraints 用来批量命名唯一键 其作用等同于多个:@Column (unique = true) @Table... 文章目录前言 @TableName 参数说明 @TableName 源码 @TableName 使用 前言 @TableName 是mybatis-plus中的注解,主要是实现实体类型和数据库中的表实现映射。
@TableId 主键专属
比如数据中的表中的字段是id
但是实体类是userId
那么就需要在userId上打上这个注解
用法:设置主键映射 value映射主键字段的名字
type 设置主键类型 主键的生成策略 (圈起来的重要)
@Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能。
xml中
1)#{}是预编译处理,${}是字符串替换。
2)MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStatement的set方法来赋值;MyBatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。
3)使用 #{} 可以有效的防止SQL注入,提高系统安全性。
(1)$ 符号一般用来当作占位符,常使用Linux脚本的同学应该对此有更深的体会吧。既然是占位符,当然就是被用来替换的。知道了这点就能很容易区分$和#,从而不容易记错了。
(2)预编译的机制。预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。
我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。
而预编译机制则可以很好的防止SQL注入。在某些特殊场合下只能用${},不能用#{}。
例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item :表示集合中每一个元素进行迭代时的别名
index :指定一个名字,用于表示在迭代过程中,每次迭代到的位置
open :表示该语句以什么开始
separator :表示在每次进行迭代之间以什么符号作为分隔符
close :表示以什么结束
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map
item代表的是list里面的各个成员,就是一个别名,而index则表示迭代的次数,简单说就是找#{item}这个值找了几次。
就是#{index}的值,是从零开始递增的“迭代次数”。
非主键列是否完全依赖于主键,还是依赖于主键的一部分;非主键列是直接依赖于主键,还是直接依赖于非主键列。
@WebService
1、serviceName: 对外发布的服务名,指定 Web Service 的服务名称:wsdl:service。缺省值为 Java 类的简单名称 + Service。(字符串)
2、endpointInterface: 服务接口全路径, 指定做SEI(Service EndPoint Interface)服务端点接口
3、name:此属性的值包含XML Web Service的名称。在默认情况下,该值是实现XML Web Service的类的名称,wsdl:portType 的名称。缺省值为 Java 类或接口的非限定名称。(字符串
4、portName: wsdl:portName。缺省值为 WebService.name+Port。
5、targetNamespace:指定你想要的名称空间,认是使用接口实现类的包名的反缀
6、wsdlLocation:指定用于定义 Web Service 的 WSDL 文档的 Web 地址。Web 地址可以是相对路径或绝对路径。(字符串)
注意:实现类上可以不添加Webservice注解
@WebMethod
注释表示作为一项 Web Service 操作的方法,将此注释应用于客户机或服务器服务端点接口(SEI)上的方法,或者应用于 JavaBeans 端点的服务器端点实现类。
要点:仅支持在使用 @WebService 注释来注释的类上使用 @WebMethod 注释
1、operationName:指定与此方法相匹配的wsdl:operation 的名称。缺省值为 Java 方法的名称。(字符串)
2、action:定义此操作的行为。对于 SOAP 绑定,此值将确定 SOAPAction 头的值。缺省值为 Java 方法的名称。(字符串)
3、exclude:指定是否从 Web Service 中排除某一方法。缺省值为 false。(布尔值)
@WebResult
注释用于定制从返回值至 WSDL 部件或 XML 元素的映射。将此注释应用于客户机或服务器服务端点接口(SEI)上的方法,或者应用于 JavaBeans 端点的服务器端点实现类。
1、name:当返回值列示在 WSDL 文件中并且在连接上的消息中找到该返回值时,指定该返回值的名称。对于 RPC 绑定,这是用于表示返回值的 wsdl:part属性的名称。对于文档绑定,-name参数是用于表示返回值的XML 元素的局部名。对于 RPC 和 DOCUMENT/WRAPPED 绑定,缺省值为 return。对于 DOCUMENT/BARE 绑定,缺省值为方法名 + Response。(字符串)
2、targetNamespace:指定返回值的 XML 名称空间。仅当操作类型为 RPC 或者操作是文档类型并且参数类型为 BARE 时才使用此参数。(字符串)
3、header:指定头中是否附带结果。缺省值为false。(布尔值)
4、partName:指定 RPC 或 DOCUMENT/BARE 操作的结果的部件名称。缺省值为@WebResult.name。(字符串)
@WebParam
注释用于定制从单个参数至 Web Service 消息部件和 XML 元素的映射。
将此注释应用于客户机或服务器服务端点接口(SEI)上的方法,或者应用于 JavaBeans 端点的服务器端点实现类。
1、name :参数的名称。如果操作是远程过程调用(RPC)类型并且未指定partName 属性,那么这是用于表示参数的 wsdl:part 属性的名称。
如果操作是文档类型或者参数映射至某个头,那么 -name 是用于表示该参数的 XML 元素的局部名称。如果操作是文档类型、
参数类型为 BARE 并且方式为 OUT 或 INOUT,那么必须指定此属性。(字符串)
2、partName:定义用于表示此参数的 wsdl:part属性的名称。仅当操作类型为 RPC 或者操作是文档类型并且参数类型为BARE 时才使用此参数。(字符串)
3、targetNamespace:指定参数的 XML 元素的 XML 名称空间。当属性映射至 XML 元素时,仅应用于文档绑定。缺省值为 Web Service 的 targetNamespace。(字符串)
4、mode:此值表示此方法的参数流的方向。有效值为 IN、INOUT 和 OUT。(字符串)
5、header:指定参数是在消息头还是消息体中。缺省值为 false。(布尔值)
@Repository的作用:
这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。
为什么有时候我们不用@Repository来注解接口,我们照样可以注入到这个接口的实现类呢?
1、spring配置文件中配置了MapperScannerConfigurer这个bean,它会扫描持久层接口创建实现类并交给spring管理。
2、接口上使用了@Mapper注解或者springboot中主类上使用了@MapperScan注解,和MapperScannerConfigurer作用一样。
注:不使用@Repository注解,idea会报警告,提示找不到这个bean,直接忽略即可。
SpringBoot定时任务@EnableScheduling
一、定时任务作用?
定时任务相当于闹钟
在什么时间做什么事情(执行什么命令/脚本)
@EnableScheduling 注解开启功能,自动扫描
@Scheduled(cron = "0 */2 * * * ?") 每隔两分钟
要在任务的类上写@Component
要在任务方法上写@Scheduled
fixedDelay和fixedRate,单位是毫秒,这里这里就是5秒和3秒,它们的区别就是:fixedRate就是每多次分钟一次,不论你业务执行花费了多少时间。我都是1分钟执行1次,而fixedDelay是当任务执行完毕后1分钟在执行。所以根据实际业务不同,我们会选择不同的方式。
cron表达式:比如你要设置每天什么时候执行,就可以用它
cron表达式,有专门的语法,而且感觉有点绕人,不过简单来说,大家记住一些常用的用法即可,特殊的语法可以单独去查。
cron一共有7位,但是最后一位是年,可以留空,所以我们可以写6位
* 第一位,表示秒,取值0-59
* 第二位,表示分,取值0-59
* 第三位,表示小时,取值0-23
* 第四位,日期天/日,取值1-31
* 第五位,日期月份,取值1-12
* 第六位,星期,取值1-7,星期一,星期二...,注:不是第1周,第二周的意思
另外:1表示星期天,2表示星期一。
* 第7为,年份,可以留空,取值1970-2099
cron中,还有一些特殊的符号,含义如下:
(*)星号:可以理解为每的意思,每秒,每分,每天,每月,每年...
(?)问号:问号只能出现在日期和星期这两个位置。
(-)减号:表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12
(,)逗号:表达一个列表值,如在星期字段中使用“1,2,4”,则表示星期一,星期二,星期四
(/)斜杠:如:x/y,x是开始值,y是步长,比如在第一位(秒) 0/15就是,从0秒开始,每15秒,最后就是0,15,30,45,60 另:*/y,等同于0/y
0 0 3 * * ? 每天3点执行
0 5 3 * * ? 每天3点5分执行
0 5 3 ? * * 每天3点5分执行,与上面作用相同
0 5/10 3 * * ? 每天3点的 5分,15分,25分,35分,45分,55分这几个时间点执行
0 10 3 ? * 1 每周星期天,3点10分 执行,注:1表示星期天
0 10 3 ? * 1#3 每个月的第三个星期,星期天 执行,#号只能出现在星期的位置
@Configuration注解
@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationCo ntext 类进行扫描,并用于构建bean定义,初始化Spring容器。
注意:@Configuration注解的配置类有如下要求:@Configuration不可以是final类型; @Configuration不可以是匿名类;嵌套的configuration必须是静态类。
一、用@Configuration加载Spring
@Configuration配置spring并启动spring容器
@Configuration启动容器+@Bean注册Bean
@Configuration启动容器+@Component注册Bean
使用 AnnotationConfigApplicationContext 注册 AppContext 类的两种方法
配置Web应用程序(web.xml中配置AnnotationConfigApplicationContext)
二、组合多个配置类
在@configuration中引入spring的xml配置文件
在@configuration中引入其它注解配置
@configuration嵌套(嵌套的Configuration必须是静态类)
三、@EnableXXX注解
四、@Profile逻辑组配置
五、使用外部变量
@Component @Bean注解
@Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
@Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。
两者的目的是一样的,都是注册bean到Spring容器中。
@Component(@Controller、@Service、@Repository)通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。
而@Bean注解通常是我们在标有该注解的方法中定义产生这个bean的逻辑。
@ConfigurationProperties 和 @value 有着相同的功能,但是 @ConfigurationProperties的写法更为方便
@ConfigurationProperties 的 POJO类的命名比较严格,因为它必须和prefix的后缀名要一致, 不然值会绑定不上, 特殊的后缀名是“driver-class-name”这种带横杠的情况,在POJO里面的命名规则是 下划线转驼峰 就可以绑定成功,所以就是 “driverClassName”
@Data : 注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor : 注在类上,提供类的全参构造
@NoArgsConstructor : 注在类上,提供类的无参构造
@Setter : 注在属性上,提供 set 方法
@Getter : 注在属性上,提供 get 方法
@EqualsAndHashCode : 注在类上,提供对应的 equals 和 hashCode 方法
@Log4j/@Slf4j : 注在类上,提供对应的 Logger 对象,变量名为 log
Spring缓存注解@CachePut , @CacheEvict,@CacheConfig使用
@Cacheable是用来声明方法是可缓存的。将结果存储到缓存中以便后续使用相同参数调用时不需执行实际的方法。直接从缓存中取值。最简单的格式需要制定缓存名称。
@CachePut如果缓存需要更新,且不干扰方法的执行,可以使用注解@CachePut。@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
注意:应该避免@CachePut 和 @Cacheable同时使用的情况。
@CacheEvict:
spring cache不仅支持将数据缓存,还支持将缓存数据删除。此过程经常用于从缓存中清除过期或未使用的数据。
@CacheEvict要求指定一个或多个缓存,使之都受影响。此外,还提供了一个额外的参数allEntries。表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素。
@CacheConfig:有时候一个类中可能会有多个缓存操作,而这些缓存操作可能是重复的。这个时候可以使用@CacheConfig
@CacheConfig是一个类级别的注解,允许共享缓存的名称、KeyGenerator、CacheManager 和CacheResolver。该操作会被覆盖。
spring的@ControllerAdvice注解
@ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理。
对于@ControllerAdvice,我们比较熟知的用法是结合@ExceptionHandler用于全局异常的处理,但其作用不止于此。ControllerAdvice拆开来就是Controller Advice,关于Advice,在Spring的AOP中,是用来封装一个切面所有属性的,包括切入点和需要织入的切面逻辑。这里ControllerAdvice也可以这么理解,其抽象级别应该是用于对Controller进行切面环绕的,而具体的业务织入方式则是通过结合其他的注解来实现的。@ControllerAdvice是在类上声明的注解,其用法主要有三点:
1.结合方法型注解@ExceptionHandler,用于捕获Controller中抛出的指定类型的异常,从而达到不同类型的异常区别处理的目的。
2.结合方法型注解@InitBinder,用于request中自定义参数解析方式进行注册,从而达到自定义指定格式参数的目的。
3.结合方法型注解@ModelAttribute,表示其注解的方法将会在目标Controller方法执行之前执行。
从上面的讲解可以看出,@ControllerAdvice的用法基本是将其声明在某个bean上,然后在该bean的方法上使用其他的注解来指定不同的织入逻辑。不过这里@ControllerAdvice并不是使用AOP的方式来织入业务逻辑的,而是Spring内置对其各个逻辑的织入方式进行了内置支持。
@ExceptionHandler拦截异常并统一处理
@ExceptionHandler的作用主要在于声明一个或多个类型的异常,当符合条件的Controller抛出这些异常之后将会对这些异常进行捕获,然后按照其标注的方法的逻辑进行处理,从而改变返回的视图信息。
@ResponseStatus注解有两种用法,一种是加载自定义异常类上,一种是加在目标方法中,当修饰一个类的时候,通常修饰的是一个异常类。
这里我们说一下加在目标方法上的这种情况,注解中有两个参数,value属性设置异常的状态码,reaseon是对于异常的描述,其实@ResponseStatus大部分情况下更适合于在自定义异常类或者目标方法上使用。
@ResponseStatus用在自定义异常类上
使用时,先声明一个自定义异常类,在自定义异常类上面加上@ResponseStatus注释表示系统运行期间,当抛出自定义异常的时候,使用@ResponseStatus注解中声明的属性和reason属性将异常信息返回给客户端,提高可读性。
@ResponseStatus注解配合@ExceptionHandler注解使用会更好
@ImportResource 注解
@ImportResource 注解用于导入 Spring 的配置文件,如:spring-mvc.xml、application-Context.xml。遗憾的是 Spring Boot 里面没有Spring 配置文件,都是通过 Java 代码进行配置。如果我们自己编写了配置文件,Spring Boot 是不能自动识别,此时需要使用 @ImportResource 注解将自己的配置文件加载进来。
与 @Import 注解一样,此注解提供的功能类似于 Spring XML 中的 <import /> 元素。当设计的 @Configuration 类由AnnotationConfigApplicationContext 引导时,通常会使用它,但是一些XML功能(如名称空间)仍然是必要的。
默认情况下,如果以“ .groovy”结尾,则将使用 GroovyBeanDefinitionReader 处理 value() 属性的参数。否则,将使用 XmlBeanDefinitionReader 解析 Spring <beans /> XML文件。 可以选择声明 reader() 属性,允许用户选择自定义 BeanDefinitionReader 实现。
@ImportResource 注解的可选属性,如下:
String[] locations:要导入的资源路径,如:classpath:spring-mvc.xml 从类路径加载 spring-mvc.xml 配置文件。
Class<? extends BeanDefinitionReader> reader:在处理通过 value() 属性指定的资源时使用的 BeanDefinitionReader 实现。默认情况下,读取器将适应指定的资源路径:“.groovy” 文件将使用 GroovyBeanDefinitionReader 处理;然而,所有其他资源都将使用 XmlBeanDefinitionReader 进行处理。
String[] value:locations() 的别名
spring boot注解 --@EnableAsync 异步调用。
EnableAsync注解的意思是可以异步执行,就是开启多线程的意思。可以标注在方法、类上。
注: @Async所修饰的函数不要定义为static类型,这样异步调用不会生效
为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsync。
XStream是个很强大的工具,能将java对象和xml之间相互转化。xstream不在意java类中成员变量是私有还是公有,也不在乎是否有默认构造函数。它调用方式也非常简单:从xml对象转化为java对象,使用fromXML()方法;从java对象序列化为xml,toXML()即可,很方便。xstream也支持注解方式,这些都是为了简化输出而设计,
@XStreamAlias("cat") 等同于 xstream.alias("cat", Cat.class);
@XmlAccessorType
类级别的注解。定义这个类中的何种类型需要映射到XML。解释起来有点拗口,可以通过它的属性值更好理解这个参数的意义。
参数 value
参数 value 可以接受4个指定值,这几个值是枚举类型,方便调用:
XmlAccessType.FIELD:映射这个类中的所有字段到XML
XmlAccessType.PROPERTY:映射这个类中的属性(get/set方法)到XML
XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field或property同时映射到XML(默认)
XmlAccessType.NONE:不映射
@XmlType
类级别的注解,常与@XMLRootElement,@XmlAccessorType一起使用。
参数 name,定义XML Schema中type的名称
参数 namespace,指定Schema中的命名空间
参数 propOrder,指定映射XML时的节点顺序,使用该属性时,必须列出JavaBean对象中的所有字段,否则会报错。
参数 factoryClass,指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身
参数 factoryMethod,指定工厂类的工厂方法。
@XmlRootElement
类级别的注解。将类映射为xml全局元素,也就是根元素。如果要使用 JAXB ,则该注解必不可少。
参数 name,name属性用于指定生成元素的名字,若不指定,默认使用类名小写作为元素名。
参数 namespace,namespace属性用于指定生成的元素所属的命名空间。
java中注解用法详解——@SuppressWarnings
注释类型:当你的编码可能存在警告时,比如安全警告,可以用它来消除。
api中是这样描述的:指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。
注意,在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集。
例如,如果注释一个类来取消显示某个警告,同时注释一个方法来取消显示另一个警告,那么将在此方法中同时取消显示这两个警告。
根据风格不同,程序员应该始终在最里层的嵌套元素上使用此注释,在那里使用才有效。
如果要在特定的方法中取消显示某个警告,则应该注释该方法而不是注释它的类。
XML解析方式 XML解析工具 OXMapping工具
Dom4j 与XStream
XML 技术是随着 Java 的发展而发展起来的。在 XML 出现之前对于简单的数据格式通常是存储在 ini 配置文件等文本文件中,复杂的格式则采用自定义的文件格式,因此对于每种文件格式都要有专门的解析程序。 XML 出现以后解决了这个问题,程序面对的是有固定格式的 XML 文件,只要通过标准 API 就可以进行 XML 文件的处理。
XML 文件在案例系统中应用是很广泛的,比如 ClientConfig.xml 、 ServerConfig.xml 文件就是使用 XML 文件来做配置文件的,元数据文件以及元数据加载器更是离不开 XML 。因此总结一下处理技术。
XML处理技术比较
在 Java 领域 XML 文件的技术大致分为两类: XML API 和 OXMapping 。 XML API 是 XML 处理的基础,可选技术包括 JDOM 、 Dom4j 等; OXMapping 是 Object-XML Mapping 的简称,这种技术隐藏了 XML 底层操作的细节,可以将 XML 文件映射成一个 JavaBean 对象,也可以把一个 JavaBean 对象保存成一个 XML 文件,可选技术 XStream 、 Digester 、 Castor 等。 XML API 和 OXMapping 的关系类似于 JDBC 和 ORMaping 的关系, OXMapping 内部实现使用 XML API 来完成,两种实现技术从不同的层面实现了 XML 的处理。
XML API
此类 XML 处理技术中最流行的莫过于 JDOM 和 Dom4j 了,二者的使用方式非常相似。不过 Dom4j 的优势比 JDOM 更明显一些:
DOM4J是dom4j.org出品的一个开源XML解析包,它的网站中这样定义:
Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。
dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。从2001年7月发布第一版以来,已陆续推出多个版本。
dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j正迅速普及。
可以到http://sourceforge.net/projects/dom4j下载其最新版。
dom4j1.5 的完整版大约13M,是一个名为dom4j-1.5.zip的压缩包,解压后有一个dom4j-1.5.jar文件,这就是应用时需要引入的类包,另外还 有一个jaxen-1.1-beta-4.jar文件,一般也需要引入,否则执行时可能抛 java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。
Dom4j 支持 XPath 等高级特性;
正是由于这些优点,很多开源项目都开始使用 Dom4j 做 XML 解析技术,本书也将使用 Dom4j 做为 XML 处理的首选。
OXMapping
使 用 XML API 解析是略显烦琐的,受 ORMapping 技术的启发,人们发明了 OXMapping 技术,使用 OXMapping 技术,我们可以将 XML 文件映射成一个 JavaBean 对象,也可以把一个 JavaBean 对象保存成一个 XML 文件,这大大简化了我们的开发工作量,使得开发人员能更多的关注应用层面的东西。
开源世界中涌现出很多 OXMapping 框架,包括 XStream 、 Digester 、 Castor 等。 XStream 和 Digester 把映射的过程在代码中完成,而 Castor 则需要写一个和 Hibernate 中 cfg.xml 类似的映射配置文件。
与 Digester 比起来, XStream 的主要优点就是更加小巧,使用也更加方便,不过目前使用 Digester 是“开源名牌” Apache 下的子项目,网上可以参考的资料也比 XStream 多,好在 XStream 比较简洁,所以并不会对 XStream 造成太大影响。
ormapping框架和jdbc的比较
报文(message)是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。
报文也是网络传输的单位,传输过程中会不断的封装成分组、包、帧来传输,封装的方式就是添加一些信息段,那些就是报文头以一定格式组织起来的数据。
UUID.randomUUID()生成唯一识别码
UUID(Universally Unique Identifier):通用唯一识别码,是一种软件建构的标准。
UUID 目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
UUID由以下几部分组合:
(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
(2)时钟序列。
(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
UUID的唯一缺陷在于生成的结果串会比较长。
标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)。
.idea文件夹
当使用IDEA或PyCharm或WebStorm作为IDE时,会自动生成.idea/文件夹来存放项目的配置信息。其中包括版本控制信息、历史记录等等。
idea 对module 配置信息之意, infomation of module
iml是 intellij idea的工程配置文件,里面是当前project的一些配置信息。
.iml文件
iml文件是IntelliJ IDEA自动创建的模块文件,用于Java应用开发,存储一些模块开发相关的信息,比如一个Java组件,插件组件, Maven组件等等,还可能会存储一些模块路径信息, 依赖信息以及别的一写设置。
POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml。作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。事实上,在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。