当前位置: 首页 > news >正文

哈尔滨网站托管网站制作教程百度云

哈尔滨网站托管,网站制作教程百度云,手机商城app开发公司,ppt模板免费整套下载导读: 什么是Spring Data JPA? 要解释这个问题,我们先将Spring Data JPA拆成两个部分#xff0c;即Sping Data和JPA。 从这两个部分来解释。 Spring Data是什么? 摘自: https://spring.io/projects/spring-data Spring Data’s mission is to provide a familiar and cons…导读: 什么是Spring Data JPA? 要解释这个问题,我们先将Spring Data JPA拆成两个部分即Sping Data和JPA。 从这两个部分来解释。 Spring Data是什么? 摘自: https://spring.io/projects/spring-data Spring Data’s mission is to provide a familiar and consistent, Spring-based programming model for data access while still retaining the special traits of the underlying data store.It makes it easy to use data access technologies, relational and non-relational databases, map-reduce frameworks, and cloud-based data services. This is an umbrella project which contains many subprojects that are specific to a given database. The projects are developed by working together with many of the companies and developers that are behind these exciting technologies.翻译: Spring Data的使命/任务就是提供一个通用的/熟悉的和一致的基于Spring的数据访问编程模型,同时仍然保留了底层数据存储的特性. 它使使用数据访问技术、关系和非关系数据库、map-reduce框架和基于云的数据服务变得容易。这是一个总的项目包含许多特定于给定数据库的子项目。这些项目是通过与这些令人兴奋的技术背后的许多公司和开发人员合作开发的。JPA是什么? JPA全称Java Persistence API 是一个基于ORM(对象关系映射)的标准规范,既然是规范,那自然不是具体的实现. Hibernate就是其中的一个实现JPA与JDBC的关系 JPA是Java持久化的API, JDBC是Java数据库连接. JPA是JDBC上层的抽象,提供一种ORM即对象关系映射的方式来操作数据库。 JPA是基于JDBC的,就是说JPA的各种实现包括Hibernate,JPA是基于JDBC的更高级的数据库访问技术。 JDBC是java语言中用于连接和操作数据库的API,提供了一套标准接口和方法。然后基于各个数据库的的驱动来与数据库进行交互。源码 以一个简单的方法作为切入口了解一下Spring Data Jpa的源码 这里是基于SpringBoot 2.3.12.RELEASE版本来研究源码的。dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId /dependency所以在maven的pom.xml中引用jpa. 根据spring-boot-autoconfigure的jar包中会有spring-autoconfigure-metadata.properties文件 这里面配置了匹配jpa自动配置的条件。如下org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration.AutoConfigureAfterorg.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration.ConditionalOnBeanjavax.sql.DataSource org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration.ConditionalOnClassorg.springframework.data.jpa.repository.JpaRepository通过上述配置可知要有数据源要有JpaRepository以及HibernateJpaAutoConfiguration等 因为JPA是基于Hibernate来的,所以需要先有Hibernate所以也就必须先进行 HibernateJpaAutoConfiguration自动配置整体流程 整体分析源码的流程是围绕三个问题展开的问题如下 1.为什么我自己定义的AccountRepository接口的类型为SimpleJpaRepository,这是从哪里来的? 2.代理SimpleJpaRepositiry是在什么时候创建的执行的? 3.为什么根据accountRepository获取对象获取到的是JpaRepositoryFactoryBean这个类型的对象? 整体流程如下 具体源码分析如下 关于Spring Data Jpa的源码, 我们可以通过一个简单的例子来作为切入口例子如下// 写一个单元测试的类 RunWith(SpringRunner.class) SpringBootTest public class AccountRepositoryTest {Autowiredprivate AccountRepository accountRepository;Testpublic void test() {OptionalAccount accountOptional accountRepository.findById(1L);if (accountOptional.isPresent()) {Account account accountOptional.get();System.out.println(account);}} }1. 运行单元测试方法发现accountRepository是一个SimpleJapRepository类型的代理对象 至此我们需要搞明白两个事情1、为什么是SimpleJpaRepository,这是从哪里来的。2、代理对象是什么时候创建的 带着这两个问题我们去看源码。 熟悉Spring生命周期的应该知道AccountRepository接口上的Repository注解会Spring扫描处理并实例化。定位到具体代码 2. 进入Spring生命周期代码中查看对象的创建过程 // AbstractApplicationContext类的refresh() -- finishBeanFactoryInitialization(beanFactory) // Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSingletons();可以看到在这一步accountRepository已经是一个FactoryBean所以if的这个分支会进入在这里会对FactoryBean的对象调用getBean(String name)方法从而进入Spring创建对象的生命周期中。 再看这个循环里面的beanNames来自于beanDefinitionNames即是存放beanDefinition对象集合的名称集合。进入isFactoryBean(String name)方法内容如下 发现获取到的单例对象类型为JpaRepositoryFactoryBean这里又增加了一个新的问题即3、为什么根据accountRepository获取对象获取到的是JpaRepositoryFactoryBean这个类型的对象。 由于当代码执行到这一步的时候说明BeanDifinition集合已经存在了即Spring已经将类构造成BeanDifinition对象放入集合中后续会根据BeanDifinition集合来创建对象。所以我们需要找到初始化BeanDifinition对象的地方。 根据beanDefinitionNames找到调用的添加操作的地方 找到了registerBeanDefinition方法但是这个时候BeanDefinition已经是JapRepositoryFactoryBean了还得往前找。 3.根据调用链找到了RepositoryConfigurationDelegate类的registerRepositoriesIn方法中调用了上面的registerBeanDefinition方法该方法将AccountRepository在BeanDefinition中注册为JpaRepositoryFactoryBean 先看builder.build(configuration)方法,在build方法中会获取到JapRepositoryFactoryBean类型并注册 build方法执行结束后,会使用返回的definitionBuilder获取beanDefinition对象并将beanDefinition传入registerBeanDefinition方法 到这里就解释了为什么accountRepository对应的BeanDefinition对象类型为JapRepositoryFactoryBean类型。在Spring中FactoryBean的作用就是生产某一种类型的对象核心方法为T getObject() throws Exception;至此解释了一个问题为什么根据accountRepository获取对象获取到的是JpaRepositoryFactoryBean这个类型的对象。 4. 查看JpaRepositoryFactoryBean的getObject()方法 接下来重点看下JpaRepositoryFactoryBean的getObject()方法 这里方法很简单直接从this.respository中获取对象即可但是this.repository是何时初始化的呢查看JpaRepositoryFactoryBean的类图发现实现了InitializingBean接口 5. getObject()方法中的this.repository的初始化 找到InitializingBean接口的实现方法发现在afterPropertiesSet()方法中对this.respository进行初始化了。 6. SimpleJpaRepository的由来 进入getRepository(ClassT repositoryInterface, RepositoryFragments fragments)方法进一步查看代码 再看这个方法getRepositoryInformation(metadata, composition) -- getRepositoryBaseClass(metadata) 在初始化this.repository的时候就固定将repository固定设置为SimpleJpaRepository类型了。 到这里就解释了为什么是SimpleJpaRepository类型了回答了最开始提出的第一个问题。 7. AccountRepository代理对象的创建 此时回到RepositoryFactorySupport.getRepository(ClassT repositoryInterface, RepositoryFragments fragments)方法 可以从中看到当设置了repositoryBaseClass为SimpleJpaRepository类型之后开始通过动态代理的方式来创建对象了。 在Object target getTargetRepository(information);中通过反射来创建SimpleJpaRepository对象SimpleJpaRepository是实现了JpaRepository接口的与我们自己定义的AccountRepository接口一样都实现了JpaRepository即可这满足了JDK动态代理的条件即需要代理的对象与代理对象都实现了相同的接口。 接下来使用ProxyFactory来创建代理对象的从最开始的结果可以知道使用的是JDK的动态代理所以需要传递需要代理的接口 设置需要代理的接口和实现类。通过最后的T repository (T) result.getProxy(classLoader);来创建并获取代理对象。 /*** Create a new proxy according to the settings in this factory.* pCan be called repeatedly. Effect will vary if weve added* or removed interfaces. Can add and remove interceptors.* pUses the given class loader (if necessary for proxy creation).* param classLoader the class loader to create the proxy with* (or {code null} for the low-level proxy facilitys default)* return the proxy object*/public Object getProxy(Nullable ClassLoader classLoader) {return createAopProxy().getProxy(classLoader);}最终得到了accountRepository的代理对象然后调用findById(ID id) Overridepublic OptionalT findById(ID id) {Assert.notNull(id, ID_MUST_NOT_BE_NULL);ClassT domainType getDomainClass();if (metadata null) {return Optional.ofNullable(em.find(domainType, id));}LockModeType type metadata.getLockModeType();MapString, Object hints getQueryHints().withFetchGraphs(em).asMap();// 最终调用SessionImpl.find()方法查询返回结果return Optional.ofNullable(type null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));}
http://www.w-s-a.com/news/34124/

相关文章:

  • iis新建网站seo是做什么工作的
  • 临沂网站建设厂家做外贸的女生现状
  • 电子商务网站建设实践临沂做网站的
  • 网站职能建设论文做外贸都有哪些网站
  • 网站建设项目需求分析房地产网站源码
  • 网站充值提现公司账务怎么做中国能建设计公司网站
  • 网站信息资源建设包括哪些网站网站做维护
  • 网站性能优化的方法有哪些建设施工合同网站
  • 郑州建设企业网站山西省住房和城乡建设厅网站
  • 做网站的去哪找客户正规制作网站公司
  • 网站代理访问是什么意思外国优秀设计网站
  • 合肥个人建站模板网络技术服务有限公司
  • 做网站什么公司好dw企业网站开发教程
  • 怎么做自己的个人网站宝安网站设计哪家最好
  • 浩博建设集团网站站长网站统计
  • 电商网站开发视频seo排名优化方式方法
  • 宿迁市住房城乡建设局网站wordpress纯图片主题
  • 广州建设网站 公司湖北省建设信息网官网
  • 网站建立时间查询做百度移动网站优化排
  • 网站建设和运行费用qq恢复官方网站
  • 可以免费建立网站吗免费的网络营销方式
  • 天津企业设计网站建设wordpress标题字体大小
  • 上高县城乡规划建设局网站创业项目
  • 钓鱼网站在线下载广州网站设计哪里好
  • 做阿里国际网站会有成效吗wordpress微博同步
  • 西安网站建设云速网络网站运营情况怎么写
  • 免费建网站的网站微信商城分销系统方案
  • 烟台网站seo服务友情链接有哪些展现形式
  • 什么是移动网站开发免费网站开发框架
  • 做网站 创业wordpress子菜单