- 博客(73)
- 资源 (3)
- 收藏
- 关注
原创 在Java类中使用自定义注解
在Person类的源代码中,在类的前面使用了@Programmer注解,在构造方法前使用了@ConstructorNote注解,在成员变量、成员方法和参数前使用了@Common注解。在编译Person类时,由于它所引用的三个自定义注解的有效范围都是RetentionPolicy.RUNTIME,因此编译器会把这些注解编译到Person类的类文件中。接下来就可以在其他类中使用这三个注解。因此用JDK的javadoc命令为Person类生成的JavaDoc文档中,会包含@Programmer注解信息。
2023-10-14 09:28:49 201
原创 用Java内置注解来限定自定义注解的技巧
Inherited注解是标识性注解,指定@MyAnnotation注解可以被继承。假定在声明@MyAnnotation注解时使用了@Inherited注解,在声明Sample类时使用了@MyAnnotation注解,那么Sample类的子类也会继承@MyAnnotation注解,即相当于Sample类的子类在声明时也使用了@MyAnnotation注解。@Target注解用来指定@MyAnnotation注解所适用的目标,即@MyAnnotation注解可以为源代码中的哪些内容做注解。
2023-10-14 09:25:00 139
原创 一文看懂什么是Java自定义注解类型
为了把注解类型和其他Java类型区分开发,在引用注解时以@开头,例如以上代码定义了@MyAnnotation注解。当@MyAnnotation注解的类体为空“{}”,不包含任何成员,这样的注解称为标识型注解。以上default关键字用于为成员设定默认值。在以上代码中,value成员的默认值为“默认构造方法”,type成员的默认值为“void.class”。注解也属于一种Java类型,用@interface标记声明。如果注解中只有一个成员,通常把它命名为value。
2023-10-14 09:19:18 107
原创 《Java面向对象编程》导读-趣味讲解Java注解的作用
Java软件应用之间进行协作,最常见的方式是调用接口的方法。而注解为Java软件应用之间的协作提供了另外一种便利途径。如果把宠物狗和主人比作两个软件系统,那么安装在狗身上的定位器就类似于注解。主人无法直接让狗汇报自己所处的位置,但是主人可以通过读取定位器的信息来了解狗的行踪。同样,如果软件应用A希望从软件应用B中获取与程序代码相关的元数据,软件应用B就可以用注解来指定这些元数据。Java应用程序中插入由Spring框架定义的注解。安装在宠物狗身上的定位器就像源程序中的注解。
2023-10-14 08:30:06 67
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记:JPA的事件处理API的用法
JPA API也提供了处理事件的办法,它主要包括两个步骤:(1)创建监听器类。(2)在持久化类中通过@EntityListeners注解来注册监听器。1.创建监听器类监听器类不需要实现特定的接口,可以是任意的Java类,例如以下MyLastUpdateListener类就是一个监听器类。/* MyLastUpdateListener.java */package mypack;import javax.persistence.*;import java.util.*;public clas
2022-08-31 09:04:19 184
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记: 用JPQL批量处理数据
JPA的JPQL(JPA Query Language,JPA查询语言)不仅可以检索数据,还可以用于进行批量更新、删除和插入数据。批量操作实际上直接在数据库中完成,所处理的数据不会被保存在Session的持久化缓存中,因此不会占用内存空间。Query.executeUpdate()方法和JDBC API中的PreparedStatement.executeUpdate()很相似,前者执行用于更新、删除和插入的JPQL语句,而后者执行用于更新、删除和插入的SQL语句。1.批量更新数据以下程序代码演示通过
2022-08-31 09:03:57 260
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记:通过JPA处理Blob和Clob类型的数据
在持久化类中,二进制大对象可以声明为byte[]或java.sql.Blob类型;字符串大对象可以声明为java.lang.String或java.sql.Clob类型。java.sql.Blob和java.sql.Clob是JDBC API中的接口。在默认情况下,Blob和Clob接口的实现会使用SQL定位器,这意味着当程序从数据库加载Blob类型或Clob类型的数据时,实际上加载的仅是Blob类型或Clob类型的数据的逻辑指针。接下来程序需要通过Blob.getBinaryStream()或Clob.
2022-08-31 09:03:30 994
原创 孙卫琴的《精通Vue.js》读书笔记-组件的递归
在一个组件的模板中,还可以嵌套自身组件,这样就构成了组件的递归。为了避免无限递归,需要设置递归的结束条件。在例程1的recursive.html中,组件的模板会插入自身组件,从而递归遍历访问list数组中的所有嵌套的元素。模板中“”的v-if指令用来设置递归结束条件,当list数组为空,就结束递归。通过浏览器访问recursive.html,会得到如图1所示的网页,list数组中的嵌套内容会以缩进对齐的方式一层层展示出来。图1 recursive.html的网页。本文参考孙卫琴,杜聚宾所创作的。.....
2022-08-31 09:02:29 101
原创 孙卫琴的《精通Vue.js》读书笔记-在Vue项目中使用Axios
本文参考孙卫琴,杜聚宾所创作的一书为了在Vue项目中使用Axios,首先要安装Axios插件,还有可选的Vue-Axios插件。Vue-Axios插件能够把Axios与Vue更方便地整合在一起,允许组件通过this.axios的形式来访问Axios。在src/main.js中引入Axios和Vue-Axios插件,参见例程1。例程1 main.js接下来在Vue组件的代码中就可以通过this.axios的形式来访问Axios了。...
2022-08-31 09:01:53 243
原创 孙卫琴的《精通Vue.js》读书笔记-Vuex中异步操作
本文参考孙卫琴,杜聚宾所创作的一书此外,还可以通过async/await来执行异步操作,例如。
2022-08-31 09:01:16 222
原创 孙卫琴的《精通Vue.js》读书笔记-自定义指令范例:v-drag指令
本文介绍一个比较复杂的自定义指令v-drag,它支持用鼠标来拖曳网页上的特定DOM元素,参见例程1的v-drag.html。用鼠标选中任意一个方框,在整个网页的区域内移动鼠标,方框就会随之移动,松开鼠标,方框就停止移动。在v-drag.html页面上有两个不同颜色的方框,分别对应两个。通过浏览器访问v-drag,html,会出现图1所示的网页。图1 v-drag.html的网页。本文参考孙卫琴,杜聚宾所创作的。例程1 v-drag.html。...
2022-08-31 09:00:44 155 1
原创 孙卫琴的《精通Vue.js》读书笔记-插槽slot的基本用法
答案是肯定的,可以使用Vue的插槽组件来实现。(2)父组件的模板为子组件模板中的组件提供内容,子组件模板的组件读取父组件提供的内容,并把它插入到子组件模板中。在basic.html中,根组件就是组件的父组件。由此可见,组件模板中的组件就像占位标记,它能够把父组件提供的内容插入到子组件模板中组件所在的位置。Vue组件可以像DOM元素一样插入到父组件的模板中。组件模板中的组件能够读取以上内容“Hello”,并把它插入到组件的模板中。(1)在子组件的模板的特定位置插入组件,表示此处存在一个插槽。...
2022-08-30 15:17:25 156
原创 孙卫琴的《精通Vue.js》读书笔记-分割setup()函数
本文参考孙卫琴,杜聚宾所创作的一书Vue框架的组合API的主要用途是更加灵活地对项目进行模块化的分割。当setup()函数本身非常庞大,也必须对它进行分割,这样才能发挥组合API的特长。对setup()函数的分割包括两个步骤:(1)把setup()函数分割成多个函数。把处理相关业务逻辑的代码分割到同一个函数中。(2)把从setup()函数中分割出来的每个函数放到单独的.js文件中。...
2022-08-30 15:15:01 319
原创 孙卫琴的《精通Vue.js》读书笔记-CSS中DOM元素的过渡模式
通过浏览器访问mode.html,网页一开始显示红色的div1,点击网页上的“切换”按钮,div1进入隐藏过渡阶段,与此同时,div1下方的蓝色的div2进入显示过渡阶段。通过浏览器访问mode.html,网页一开始显示红色的div1,点击网页上的“切换”按钮,div1下方的蓝色的div2进入显示过渡阶段。(2)in-out: B先进入显示过渡阶段, B过渡结束后, A再进入隐藏过渡阶段,A过渡结束后, B取代A的位置。(1)默认:A和B同时过渡,过渡结束后, B取代A的位置。...
2022-08-30 15:11:37 215
原创 孙卫琴的《精通Vue.js》读书笔记-命名路由
本文参考孙卫琴,杜聚宾所创作的一书路由可以通过name属性来设置名字,这样便于在其他场合引用路由。由于上述组件的to属性是一个对象表达式,所以需要通过v-bind指令来为to属性赋值。以上组件的to属性的取值为{name: ‘item’, params: {id: item.id}},params属性用来为路径中的id路径参数赋值。做了上述修改后,再次运行helloworld项目,会发现通过路由的名字,也能在网页上正确地导航到Items组件和Item组件。...
2022-08-30 15:09:15 236
原创 孙卫琴的《精通Vue.js》读书笔记-路由管理器的基本用法
根组件模板中的组件会根据当前的路由显示相应的组件。组件可以放置在模板的任意位置,相当于一个占位标记,实际要显示的组件会被插入到组件所在的位置。在myroute.html网页上选择“主页”或“关于我们”的链接,路由管理器就会根据它的routes属性所设定的路由,显示相应的HomeComponent组件或AboutComponent组件。路由管理器的routes属性指定路由,即网页中待显示的各个组件和链接的对应关系。在myroute.html中,根组件模板中的组件和组件都来自于Router路由管理器。...
2022-08-30 15:06:08 206
原创 孙卫琴的《精通Vue.js》读书笔记-路由导航中抓取数据
本文参考孙卫琴,杜聚宾所创作的一书当用户在浏览器端进行路由导航时,有些目标路由的组件需要从服务器端抓取数据,再把这些数据显示到网页上。抓取数据有两种方式:(1)导航后抓取:在导航完成后,在目标路由的组件的生命周期函数中抓取数据。在抓取的过程中,可以在网页上显示“正在加载中…”的提示信息。(2)导航前抓取:先在导航守卫函数beforeRouteEnter()和beforeRouteUpdate()中抓取数据,接下来再进行导航。...
2022-08-30 15:03:39 166
原创 孙卫琴的《精通Vue.js》读书笔记-Vue组件的单向数据流
如果在oneflow.html的网页的输入框输入新的数字,根组件的data1和data2变量会发生更新,组件的v1和v2属性也会被同步更新。由此可见,当父组件的变量与子组件的属性绑定后,如果父组件的变量发生更新,那么子组件的属性会同步更新。子组件获得了父组件传入的属性值后,如果仅仅把它作为初始值,以后还需要做独立于父组件的特定的更新,或者需要依据子组件的属性推算出其他数据,该怎么办呢?在例程1的oneflow.html中,根组件在自己的模板中会把变量data1和data2传给子组件的属性v1和v2。...
2022-08-30 15:00:29 325
原创 孙卫琴的《精通Vue.js》读书笔记-注册全局组件和局部组件
本文参考孙卫琴,杜聚宾所创作的一书普通Vue组件按照使用范围,可以分为两种:(1)全局组件:通过Vue应用实例的component()方法注册,可以直接被其他Vue组件访问。(2)局部组件:只有父组件通过components选项注册了一个局部组件,父组件才能访问该局部组件。无论是全局组件还是局部组件,都具有data、methods、computed和watch等选项,而且和根组件一样,也具有类似的生命周期以及生命钩子函数。......
2022-08-30 14:56:37 252
原创 孙卫琴的《精通Vue.js》读书笔记-Vue组件的命名规则
对于组件的属性和事件,它们的名字可以遵守lower-kebab-case或者lower-camel-case命名规则。例如“nameOfStudent”就是符合lower-camel-case命名规则的属性名,“name-of-student”是符合lower-kebab-case命名规则的属性名。从表1可以看出,无论组件的名字采用lower-kebab-case或者upper-camel-case命名规则,在外置模板中总是使用lower-kebab-case命名规则。(1)名字中的所有字符采用小写。...
2022-08-30 14:52:17 225
原创 孙卫琴的《精通Vue.js》读书笔记-Vue组件的数据监听
如果Vue组件的一个变量num会被频繁更新,并且当变量num每次被更新时,需要进行一系列耗时的操作,比如访问远程服务器的资源,或者通过复杂耗时的运算更新那些依赖变量num的其他变量(比如result变量)。在这种情况下,可以通过Vue框架的数据监听器Watcher来实现对变量num的监听。Vue的watch选项会通过Watcher来监听数据。例程1的mywatch.html演示了watch选项的基本用法。例程1 mywatch.html。......
2022-08-30 11:59:42 282
原创 孙卫琴的《精通Spring》的学习笔记:在SpringCloud中创建并注册微服务
本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版技术支持网址为:www.javathinker.net/spring.jsp本书对应的直播和录播课:www.javathinker.net/zhibo.jsp孙卫琴的QQ学习答疑群:915851077本文将创建一个包含微服务的servicemodule模块,并且把当前模块注册到Eureka服务器中。如图1所示,servicemodule模块包含以下内...
2021-10-07 21:14:24 260
原创 孙卫琴的《精通Spring》的学习笔记:用WebFlux框架上传和下载文件
本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版技术支持网址为:www.javathinker.net/spring.jsp本书对应的直播和录播课:www.javathinker.net/zhibo.jsp孙卫琴的QQ学习答疑群:915851077本文介绍在WebFlux框架中采用异步非阻塞的方式上传或下载文件。以下例程1的FileController类的upload()方法和download()方法分别...
2021-10-07 21:10:51 868 3
原创 孙卫琴的《精通Spring》的学习笔记:WebFlux框架的函数式开发模式
本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版技术支持网址为:www.javathinker.net/spring.jsp本书对应的直播和录播课:www.javathinker.net/zhibo.jsp孙卫琴的QQ学习答疑群:915851077所谓函数式开发模式,是和面向对象开发模式相对的一个概念。在面向对象的开发模式中,对象是程序中的主角,程序在运行时会创建各种对象,这些对象产生各种行为,彼此之间互相协...
2021-10-07 21:06:45 738
原创 孙卫琴的《精通Spring》的学习笔记:支持分页和排序的Repository 接口
本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版技术支持网址为:www.javathinker.net/spring.jsp本书对应的直播和录播课:www.javathinker.net/zhibo.jsp孙卫琴的QQ学习答疑群:915851077PagingAndSortingRepository接口能够对查询结果进行分页或排序。该接口声明了以下两个查询方法:Page<T> findAll(Pa...
2021-10-07 21:02:38 225
原创 孙卫琴的《精通Spring》的学习笔记:用AOP和SLF4J输出日志的范例
本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版技术支持网址为:www.javathinker.net/spring.jsp本书对应的直播和录播课:www.javathinker.net/zhibo.jsp孙卫琴的QQ学习答疑群:915851077Spring AOP依赖AspectJ软件包来实现。AspectJ软件包由Eclipse公司提供,它的下载网址为:https://www.eclipse.org/aspec...
2021-10-07 20:58:12 252
原创 孙卫琴的《精通Spring》的学习笔记:服务器端推送
本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版技术支持网址为:www.javathinker.net/spring.jsp本书对应的直播和录播课:www.javathinker.net/zhibo.jsp孙卫琴的QQ学习答疑群:915851077在浏览器与Web服务器之间的传统的通信过程中,都是由用户首先主动在浏览器端的网页上选择一个链接或者提交一个表单,浏览器就会生成一个相应的HTTP请求,把它发送到服务器端,服...
2021-10-07 20:54:28 321
原创 孙卫琴的《精通Spring》的学习笔记:用Spring框架进行文件下载
本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版技术支持网址为:www.javathinker.net/spring.jsp本书对应的直播和录播课:www.javathinker.net/zhibo.jsp孙卫琴的QQ学习答疑群:915851077把服务器端的文件发送到客户端,这个过程称为文件下载。在Spring MVC框架中,org.springframework.http.ResponseEntity.BodyBui...
2021-10-07 20:50:10 404
原创 孙卫琴的《精通Spring》的学习笔记:把Model中的数据存放在session范围内
本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版技术支持网址为:www.javathinker.net/spring.jsp本书对应的直播和录播课:www.javathinker.net/zhibo.jsp孙卫琴的QQ学习答疑群:915851077默认情况下,添加到Model中的数据存放在request范围内。如果要把数据存放到session范围内,可以使用@SessionAttributes注解。以下例程1的TestSes...
2021-10-07 20:41:25 481
原创 孙卫琴的《精通Spring》的学习笔记:控制器对象的生命周期
本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版技术支持网址为:www.javathinker.net/spring.jsp本书对应的直播和录播课:www.javathinker.net/zhibo.jsp孙卫琴的QQ学习答疑群:915851077一旦Controller控制器类向SpringMVC 框架进行了注册,SpringMVC 框架就会管理Controller对象的生命周期。默认情况下,Controller对象.
2021-10-07 20:34:15 213
原创 孙卫琴的《精通Spring》的学习笔记:@ControllerAdvice注解的用法
本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版技术支持网址为:www.javathinker.net/spring.jsp本书对应的直播和录播课:www.javathinker.net/zhibo.jsp孙卫琴的QQ学习答疑群:915851077当一个Web应用中的多个控制器类要完成一些共同的操作,传统的做法是定义一个控制器父类(例如BaseController),它包含了执行共同操作的方法,其他的控制器类(例如Controll.
2021-10-07 20:28:18 263
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记:每个具体类对应一张表的继承映射
表的结构如下:在域模型中,Company类和Employee类之间为一对多的双向关联关系(假定不允许雇员同时在多个公司兼职),Employee类为抽象类,因此它不能被实例化,它有两个具体的子类:HourlyEmployee类和SalariedEmployee类。由于Java只允许一个类最多有一个直接的父类,因此Employee类、HourlyEmployee类和SalariedEmployee类构成了一棵继承关系树。1.映射Company类Company类与Employee类是一对多的关联关系,C
2021-05-07 10:23:36 224
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记:映射继承关系之一(根类对应一张表)
表的结构如下:在域模型中,Company类和Employee类之间为一对多的双向关联关系(假定不允许雇员同时在多个公司兼职),Employee类为抽象类,因此它不能被实例化,它有两个具体的子类:HourlyEmployee类和SalariedEmployee类。由于Java只允许一个类最多有一个直接的父类,因此Employee类、HourlyEmployee类和SalariedEmployee类构成了一棵继承关系树。1.映射Company类Company类与Employee类是一对多的关联关系,C
2021-05-07 10:22:38 282
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记:映射Set集(值类型的集合)
假定Customer对象的images集合中不允许存放重复的照片文件名,因此可以把images属性定义为Set类型:private Set<String> images=new HashSet<String>();在数据库中定义了一张IMAGES表,它的CUSTOMER_ID字段为参照CUSTOMERS表的外键,由于Customer对象不允许有重复的照片文件名,因此应该把IMAGES表的CUSTOMER_ID和FILENAME字段作为联合主键。以下是IMAGES表的DDL定
2021-05-06 22:47:08 180
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记:Spring与Hibernate与JPA的整合(详细配置和源码)
1. 设置Spring的配置文件在Spring的配置文件applicationContext.xml中,配置C3P0数据源、EntityManagerFactory、JpaTransactionManager等Bean组件。applicationContext.xml文件位于范例程序的classpath根路径下,以下是它的源程序。/* applicationContext.xml */<?xml version="1.0" encoding="UTF-8"?><beans xml
2021-05-06 22:46:48 426 1
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记:映射Bag包(值类型的集合)
Bag集合中的对象不按特定方式排序,但是允许有重复对象。在Java集合API中并没有提供Bag接口,Hibernate允许在持久化类中用List来模拟Bag的行为。假定Customer对象的images集合中允许存放重复的照片文件名,可以把images属性定义为List类型:private List<String> images=new ArrayList<String>();在数据库中定义了一张IMAGES表,它的CUSTOMER_ID字段为参照CUSTOMERS表的外键,由
2021-05-06 22:46:32 199
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记:用@ManyToMany注解映射双向关联
假定建立了从Category(商品类别)类和Item(商品)类的双向多对多关联。在Category类中需要定义集合类型的items属性,并且在Item类也需要定义集合类型的categories属性。下图显示了Category类和Item类的关联关系。下图显示了CATEGORIES表、ITEMS表和CATEGORY_ITEM表的结构。在Category类中,映射items属性的代码如下所示:@ManyToMany(cascade=CascadeType.PERSIST)@JoinTable( .
2021-05-06 22:45:53 204
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记:FetchType.LAZY延迟检索策略
对于一对多关联和多对多关联,应该优先考虑使用默认的延迟检索策略。在Customer类中,以下代码对orders集合属性采用延迟检索策略://采用默认的延迟检索策略@OneToMany(mappedBy="customer")private Set<Order> orders = new HashSet<Order>();或者://显式设置延迟检索策略@OneToMany(mappedBy="customer", fetch=FetchType.
2021-05-06 22:45:08 232
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记:用@OneToOne注解映射一对一关联
在以下图中,ADDRESSES表的ID字段既是主键,同时作为外键参照CUSTOMERS表的主键,也就是说,ADDRESSES表与CUSTOMERS表共享主键。 在Customer类中,也是用@OneToOne注解来映射homeAddress属性: @OneToOne( cascade=CascadeType.ALL, mappedBy="customer" ) private Address homeAddress;在Customer类与Address类的双向一对一关联关
2021-05-06 22:44:40 287
原创 孙卫琴的《精通JPA与Hibernate》的读书笔记: 通过JPA API中的StoredProcedureQuery接口调用存储过程
以下SQL代码定义了一个名为findCustomers的存储过程,p_age为输入参数,p_count为输出参数:delimiter //create procedure findCustomers(in p_age integer,out p_count integer)beginselect count(*) into p_count from CUSTOMERS where AGE>p_age;select name from CUSTOMERS;end //JPA API中
2021-05-06 22:44:17 985
孙卫琴的Java对象持久化技术之旅视频精讲
2021-06-19
文本编辑器(EmEditor Pro) V16.1.4 绿色便携版.rar
2020-05-18
孙卫琴的Java分布式架构视频精讲
2020-05-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人