响应式
Vue2的响应式依赖ES5的Object.defineProperty,主要使用这个API改写对象的Getter与Setter,用来依赖收集与触发更新
依赖收集原理
1 |
|
Vue2的响应式依赖ES5的Object.defineProperty,主要使用这个API改写对象的Getter与Setter,用来依赖收集与触发更新
1 |
|
Maven拥有三套相互独立的生命周期,它们分别为clean、default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点
每个生命周期下面有不同的阶段
clean生命周期的目的是清理项目,它包含三个阶段:
site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。该生命周期包含如下阶段:
插件的远程仓库使用pluginRepositories和pluginRepository配置,
在POM中配置插件的时候,如果该插件是Maven的官方插件(即如果其groupId为org.apache.maven.plugins),就可以省略groupId配置
Maven在超级POM中为所有核心插件设定了版本,超级POM是所有Maven项目的父POM,所有项目都继承这个超级POM的配置,因此,即使用户不加任何配置,Maven使用核心插件的时候,它们的版本就已经确定了
通过配置settings.xml让Maven检查其他groupId上的插件仓库元数据
1 | <settings> |
用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务
用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上
有很多插件的目标在编写时已经定义了默认绑定阶段
当多个插件目标绑定到同一个阶段的时候,这些插件声明的先后顺序决定了目标的执行顺序
1 | <build> |
1 | # 使用maven-help-plugin查看插件详细信息,了解插件目标的默认绑定阶段 |
1.《Maven实战》
1 | # 显示配置信息 |
1 | # 显示依赖 |
$M2_HOME/conf/settings.xml是全局配置~/.m2/settings.xml是用户配置1 | <project> |
1 | <settings> |
settings.xml中server元素的id必须与POM中需要认证的repository元素的id完全一致,正是这个id将认证信息与仓库配置联系在了一起
1 | <project> |
distributionManagement:
repository和snapshotRepository子元素,前者表示发布版本构件的仓库,后者表示快照版本的仓库。关于发布版本和快照版本
1 | <settings> |
compile: 默认,对于编译,运行,测试三种classpath都有效
例如:spring-core,在程序编译,运行,测试都有效果
test: 编译测试代码和运行测试代码才需要
例如: junit
provided: 以提供依赖,对于编译,测试有效,运行无效
例如: sevelet-api
runtime: 运行时依赖,运行测试有效,编译无效
例如: jdbc驱动程序runtime不会造成依赖继承,
Setting dependency to runtime ensure that there isn’t an accidental dependency on the code, and also keeps the dependency from being transitive. So that, for example, if module A has a runtime dependency on library X, and module B depends on module A, it does not inherit the dependency on library X. Using “provided” or “compile” would cause B to depend on X.
system: 与provided一致,但需使用systemPath指定引用包路径
import: 导入依赖范围
假设A依赖于B,B依赖于C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖
当一个项目同时经过不同的路径依赖于同一个组件时,会选择其深度最短的对应组件进行依赖。当深度一样的时候Maven会根据申明的依赖顺序来进行选择,先申明的会被作为依赖包
1.《Maven实战》
MyBatis的主配置信息
Mapper中的SQL配置信息
面向用户操作的api
SqlSession是Executor组件的外观,目的是为用户提供更友好的数据库操作接口,这是设计模式中外观(门面)模式的典型应用
执行器
封装了JDBC Statement的操作
当MyBatis框架使用的Statement类型为CallableStatement和PreparedStatement时,ParameterHandler用于为Statement对象参数占位符设置值
封装了对JDBC中的ResultSet对象操作
Mybatis类型处理器
执行SQL脚本
执行SQL
获取和设置对象的属性值
可以使用SystemMetaObject.forObject(Object object)创建
获取类相关的信息
用于创建对象
List、Map、Set接口对应的实现分别为ArrayList、HashMap、HashSet
应用:MyBatis提供的一种扩展机制,在得到映射结果之前我们需要处理一些逻辑,或者在执行该类的有参构造方法时,在传入参数之前,要对参数进行一些处理,这时我们可以通过自定义ObjectFactory来实现
代理工厂,主要用于创建动态代理对象
两种实现:CglibProxyFactory和JavassistProxyFactory
应用:ProxyFactory主要用于实现MyBatis的懒加载功能。当开启懒加载后,MyBatis创建Mapper映射结果对象后,会通过ProxyFactory创建映射结果对象的代理对象。当我们调用代理对象的Getter方法获取数据时,会执行CglibProxyFactory或JavassistProxyFactory中定义的拦截逻辑,然后执行一次额外的查询
启用自动提交后,会在每个SQL语句执行完毕后自动提交事务
一旦设置保存点,事务就可以回滚到保存点,而不影响保存点之前的操作
DatabaseMetaData接口提供了supportsSavepoints()方法,用于判断JDBC驱动是否支持保存点
Connection接口中提供了setSavepoint()方法用于在当前事务中设置保存点,如果setSavepoint()方法在事务外调用,则调用该方法后会在setSavepoint()方法调用处开启一个新的事务。setSavepoint()方法的返回值是一个Savepoint对象,该对象可作为Connection对象rollback()方法的参数,用于回滚到对应的保存点
Connection对象中提供了一个releaseSavepoint()方法,接收一个Savepoint对象作为参数,用于释放当前事务中的保存点
事务中创建的所有保存点在事务提交或完成回滚之后会自动释放,事务回滚到某一保存点后,该保存点之后创建的保存点会自动释放
1 | DatabaseMetaData metaData = connection.getMetaData(); |
主要体现:
类型:
TYPE_FORWARD_ONLY
ResultSet不可滚动,游标只能向前移动,从第一行到最后一行,不允许向后移动
TYPE_SCROLL_INSENSITIVE
ResultSet是可滚动的,它的游标可以相对于当前位置向前或向后移动,也可以移动到绝对位置
ResultSet没有关闭时,ResultSet对象的修改不会影响对应的数据库中的记录
TYPE_SCROLL_SENSITIVE
ResultSet是可滚动的,它的游标可以相对于当前位置向前或向后移动,也可以移动到绝对位置
ResultSet没有关闭时,对ResultSet对象的修改会直接影响数据库中的记录
判断
类型
CONCUR_READ_ONLY
为ResultSet对象设置这种属性后,只能从ResulSet对象中读取数据,但是不能更新ResultSet对象中的数据
CONCUR_UPDATABLE
该属性表明,既可以从ResulSet对象中读取数据,又能更新ResultSet中的数据
判断
ResultSet对象的holdability属性使得应用程序能够在Connection对象的commit()方法调用后控制ResultSet对象是否关闭
类型:
HOLD_CURSORS_OVER_COMMIT
当调用Connection对象的commit()方法时,不关闭当前事务创建的ResultSet对象。
CLOSE_CURSORS_AT_COMMIT
当前事务创建的ResultSet对象在事务提交后会被关闭,对一些应用程序来说,这样能够提升系统性能。
判断
ResultSet的类型、并行性和可保持性等属性可以在调用Connection对象的createStatement()、prepareStatement()或prepareCall()方法创建Statement对象时设置
ResultSet对象中维护了一个游标,游标指向当前数据行
当ResultSet对象第一次创建时,游标指向数据的第一行
ResultSet对象在下面两种情况下会显式地关闭:
在下面两种情况下ResultSet对象会被隐式地关闭:
一个Connection对象表示通过JDBC驱动与数据源建立的连接,这里的数据源可以是关系型数据库管理系统(DBMS)、文件系统(所以也可以通过Connection访问文件)或者其他通过JDBC驱动访问的数据
所有的JDBC驱动都必须实现Driver接口,而且实现类必须包含一个静态初始化代码块(调用DriverManager的registerDriver方法)注册驱动
在使用Class.forName方法加载驱动时,驱动需要提供一个无参构造方法
注册方式:
1 | java -Djdbc.drivers=xxx ExampleApplication |
当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services目录中创建一个以服务接口命名的文件,这个文件中的内容就是这个接口具体的实现类。当其他的程序需要这个服务的时候,就可以查找这个JAR包中META-INF/services目录的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名加载服务实现类,然后就可以使用该服务了
1 | ServiceLoader<Driver> drivers = ServiceLoader.load(java.sql.Driver.class); |
JDBC驱动可以通过实现DriverAction接口来监听DriverManager类的deregisterDriver()方法的调用
DriverManager类通过Driver接口为JDBC客户端管理一组可用的驱动实现
DataSource接口的实现必须包含一个无参构造方法
为应用程序提供了一种通过网络访问远程服务的方式,例如数据库配置放在tomcat的配置中,通过JNDI获取数据库连接