范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Spring认证中国教育管理中心ApacheCassandra的Spring数据教程十

  13.1.基本
  Spring Data 提供了复杂的支持,以透明地跟踪谁创建或更改了实体以及更改发生的时间。要从该功能中受益,您必须为实体类配备审计元数据,这些元数据可以使用注释或通过实现接口来定义。此外,必须通过 Annotation 配置或 XML 配置启用审计以注册所需的基础架构组件。有关配置示例,请参阅特定于商店的部分。
  仅跟踪创建和修改日期的应用程序不需要指定AuditorAware.13.1.1.基于注解的审计元数据
  我们提供@CreatedBy并@LastModifiedBy捕获创建或修改实体的用户,@CreatedDate并@LastModifiedDate捕获更改发生的时间。
  示例 94. 一个被审计的实体 class Customer {    @CreatedBy   private User user;    @CreatedDate   private Instant createdDate;    // … further properties omitted }
  如您所见,可以有选择地应用注释,具体取决于您要捕获的信息。进行更改时捕获的注释可用于 Joda-Time DateTime、旧版 JavaDate和Calendar、JDK8 日期和时间类型以及long或类型的属性Long。
  审计元数据不一定需要存在于根级实体中,但可以添加到嵌入式实体中(取决于实际使用的存储),如下面的截图所示。
  示例 95. 审计嵌入实体中的元数据 class Customer {    private AuditMetadata auditingMetadata;    // … further properties omitted }  class AuditMetadata {    @CreatedBy   private User user;    @CreatedDate   private Instant createdDate;  }13.1.2.基于接口的审计元数据
  如果您不想使用注释来定义审计元数据,您可以让您的域类实现该Auditable接口。它公开了所有审计属性的 setter 方法。13.1.3.AuditorAware
  如果您使用@CreatedBy或@LastModifiedBy,审计基础结构需要以某种方式了解当前主体。为此,我们提供了一个AuditorAwareSPI 接口,您必须实现该接口以告知基础设施当前与应用程序交互的用户或系统是谁。泛型类型T定义了用什么类型注释的属性@CreatedBy或@LastModifiedBy必须是什么类型。
  以下示例显示了使用 Spring SecurityAuthentication对象的接口的实现:
  Example 96.AuditorAware基于 Spring Security 的实现 class SpringSecurityAuditorAware implements AuditorAware {    @Override   public Optional getCurrentAuditor() {      return Optional.ofNullable(SecurityContextHolder.getContext())             .map(SecurityContext::getAuthentication)             .filter(Authentication::isAuthenticated)             .map(Authentication::getPrincipal)             .map(User.class::cast);   } }
  该实现访问AuthenticationSpring Security 提供的对象并查找UserDetails您在UserDetailsService实现中创建的自定义实例。我们在这里假设您通过UserDetails实现公开域用户,但根据Authentication发现,您也可以从任何地方查找它。13.1.4.ReactiveAuditorAware
  使用反应式基础架构时,您可能希望使用上下文信息来提供@CreatedBy或提供@LastModifiedBy信息。我们提供了一个ReactiveAuditorAwareSPI 接口,您必须实现该接口才能告诉基础设施当前与应用程序交互的用户或系统是谁。泛型类型T定义了用什么类型注释的属性@CreatedBy或@LastModifiedBy必须是什么类型。
  以下示例显示了使用响应式 Spring SecurityAuthentication对象的接口的实现:
  例 97.ReactiveAuditorAware基于 Spring Security 的实现 class SpringSecurityAuditorAware implements ReactiveAuditorAware {    @Override   public Mono getCurrentAuditor() {      return ReactiveSecurityContextHolder.getContext()                 .map(SecurityContext::getAuthentication)                 .filter(Authentication::isAuthenticated)                 .map(Authentication::getPrincipal)                 .map(User.class::cast);   } }
  该实现访问AuthenticationSpring Security 提供的对象并查找UserDetails您在UserDetailsService实现中创建的自定义实例。我们在这里假设您通过UserDetails实现公开域用户,但根据Authentication发现,您也可以从任何地方查找它。13.2.Cassandra 的一般审计配置
  要激活审计功能,请将 Spring Data for Apache Cassandraauditing命名空间元素添加到您的配置中,如以下示例所示:
  示例 98. 使用 XML 配置激活审计 
  或者,可以通过使用注释对配置类进行@EnableCassandraAuditing注释来启用审计,如以下示例所示:
  示例 99. 使用 JavaConfig 激活审计 @Configuration @EnableCassandraAuditing class Config {    @Bean   public AuditorAware myAuditorProvider() {       return new AuditorAwareImpl();   } }
  如果你暴露类型的豆AuditorAware到ApplicationContext,审计基础设施自动捡起来,并用它来确定当前用户要在域类型设置。如果您在 中注册了多个实现,则ApplicationContext可以通过显式设置 的auditorAwareRef属性来选择要使用的一个@EnableCassandraAuditing。
  要启用审计,利用反应式编程模型,请使用@EnableReactiveCassandraAuditing注释。
  如果你暴露类型的豆ReactiveAuditorAware到ApplicationContext,审计基础设施自动捡起来,并用它来确定当前用户要在域类型设置。如果您在 中注册了多个实现,则ApplicationContext可以通过显式设置 的auditorAwareRef属性来选择要使用的一个@EnableReactiveCassandraAuditing。
  示例 100. 使用 JavaConfig 激活反应式审计 @Configuration @EnableReactiveCassandraAuditing class Config {    @Bean   public ReactiveAuditorAware myAuditorProvider() {       return new AuditorAwareImpl();   } }14. 映射
  丰富的对象映射支持由MappingCassandraConverter. MappingCassandraConverter拥有丰富的元数据模型,提供完整的功能特性集以将域对象映射到 CQL 表。
  映射元数据模型是通过使用域对象上的注释来填充的。然而,基础设施不限于使用注释作为元数据的唯一来源。该MappingCassandraConverter还允许你映射域对象到表,而不用提供任何额外的元数据,通过以下一组约定。
  在本章中,我们描述了 的特性MappingCassandraConverter,如何使用约定将域对象映射到表,以及如何使用基于注释的映射元数据覆盖这些约定。14.1.对象映射基础
  本节涵盖 Spring Data 对象映射、对象创建、字段和属性访问、可变性和不变性的基础知识。请注意,本节仅适用于不使用底层数据存储(如 JPA)的对象映射的 Spring Data 模块。此外,请务必查阅特定于存储的部分以获取特定于存储的对象映射,例如索引、自定义列或字段名称等。
  Spring Data 对象映射的核心职责是创建域对象的实例并将存储本机数据结构映射到这些实例上。这意味着我们需要两个基本步骤:使用公开的构造函数之一创建实例。实例填充以实现所有公开的属性。14.1.1.对象创建
  Spring Data 会自动尝试检测要用于具体化该类型对象的持久实体的构造函数。解析算法的工作原理如下: 如果只有一个构造函数,则使用它。 如果有多个构造函数并且只有一个用 注释@PersistenceConstructor,则使用它。 如果存在无参数构造函数,则使用它。其他构造函数将被忽略。
  值解析假定构造函数参数名称与实体的属性名称匹配,即解析将被执行,就像要填充属性一样,包括映射中的所有自定义(不同的数据存储列或字段名称等)。这还需要类文件中可用的参数名称信息或@ConstructorProperties构造函数中存在的注释。
  可以通过使用@Value特定于商店的 SpEL 表达式使用 Spring Framework 的值注释来自定义值解析。有关更多详细信息,请参阅有关商店特定映射的部分。
  对象创建内部
  为了避免反射的开销,Spring Data 对象创建默认使用运行时生成的工厂类,它会直接调用域类构造函数。即对于此示例类型:class Person {   Person(String firstname, String lastname) { … } }
  我们将在运行时创建一个语义上等同于这个的工厂类:class PersonObjectInstantiator implements ObjectInstantiator {    Object newInstance(Object... args) {     return new Person((String) args[0], (String) args[1]);   } }
  这使我们比反射提高了大约 10% 的性能。要使域类有资格进行此类优化,它需要遵守一组约束:它不能是私人课程它不能是非静态内部类它不能是 CGLib 代理类Spring Data 使用的构造函数不能是私有的
  如果这些条件中的任何一个匹配,Spring Data 将通过反射回退到实体实例化。
  14.1.2.物业人口
  一旦创建了实体的实例,Spring Data 就会填充该类的所有剩余持久属性。除非实体的构造函数已经填充(即通过其构造函数参数列表消耗),标识符属性将首先填充以允许循环对象引用的解析。之后,所有尚未由构造函数填充的非瞬态属性都在实体实例上设置。为此,我们使用以下算法: 如果属性是不可变的但公开了一个with…方法(见下文),我们使用该with…方法创建一个具有新属性值的新实体实例。 如果定义了属性访问(即通过 getter 和 setter 访问),我们将调用 setter 方法。 如果属性是可变的,我们直接设置字段。 如果属性是不可变的,我们将使用持久性操作(请参阅对象创建)使用的构造函数来创建实例的副本。 默认情况下,我们直接设置字段值。
  财产人口内部结构
  与我们在对象构造中的优化类似,我们也使用 Spring Data 运行时生成的访问器类与实体实例进行交互。class Person {    private final Long id;   private String firstname;   private @AccessType(Type.PROPERTY) String lastname;    Person() {     this.id = null;   }    Person(Long id, String firstname, String lastname) {     // Field assignments   }    Person withId(Long id) {     return new Person(id, this.firstname, this.lastame);   }    void setLastname(String lastname) {     this.lastname = lastname;   } }
  示例 101. 生成的属性访问器  class PersonPropertyAccessor implements PersistentPropertyAccessor {    private static final MethodHandle firstname;                  private Person person;                                        public void setProperty(PersistentProperty property, Object value) {      String name = property.getName();      if ("firstname".equals(name)) {       firstname.invoke(person, (String) value);                  } else if ("id".equals(name)) {       this.person = person.withId((Long) value);                 } else if ("lastname".equals(name)) {       this.person.setLastname((String) value);                   }   } }
  PropertyAccessor 持有底层对象的可变实例。这是为了启用其他不可变属性的突变。
  默认情况下,Spring Data 使用字段访问来读取和写入属性值。根据private字段的可见性规则,MethodHandles用于与字段进行交互。
  该类公开了一个withId(…)用于设置标识符的方法,例如,当一个实例插入到数据存储中并生成一个标识符时。调用withId(…)创建一个新Person对象。所有后续的突变都将在新实例中发生,而前一个则保持不变。
  使用属性访问允许直接方法调用而不使用MethodHandles.
  这使我们比反射提高了大约 25% 的性能。要使域类有资格进行此类优化,它需要遵守一组约束:
  类型不得位于默认值或java包下。
  类型及其构造函数必须是 public
  属于内部类的类型必须是static.
  使用的 Java 运行时必须允许在原始ClassLoader. Java 9 和更新版本施加了某些限制。
  默认情况下,Spring Data 尝试使用生成的属性访问器,如果检测到限制,则回退到基于反射的访问器。
  让我们看一下以下实体:
  示例 102. 示例实体 class Person {    private final @Id Long id;                                                   private final String firstname, lastname;                                    private final LocalDate birthday;   private final int age;                                                        private String comment;                                                      private @AccessType(Type.PROPERTY) String remarks;                            static Person of(String firstname, String lastname, LocalDate birthday) {       return new Person(null, firstname, lastname, birthday,       Period.between(birthday, LocalDate.now()).getYears());   }    Person(Long id, String firstname, String lastname, LocalDate birthday, int age) {       this.id = id;     this.firstname = firstname;     this.lastname = lastname;     this.birthday = birthday;     this.age = age;   }    Person withId(Long id) {                                                       return new Person(id, this.firstname, this.lastname, this.birthday, this.age);   }    void setRemarks(String remarks) {                                              this.remarks = remarks;   } }
  identifier 属性是最终的,但null在构造函数中设置为。该类公开了一个withId(…)用于设置标识符的方法,例如,当一个实例插入到数据存储中并生成一个标识符时。Person创建新实例时,原始实例保持不变。相同的模式通常应用于由存储管理但可能必须为持久性操作更改的其他属性。wither 方法是可选的,因为持久性构造函数(参见 6)实际上是一个复制构造函数,并且设置该属性将被转换为创建一个应用新标识符值的新实例。
  的firstname和lastname特性是通过吸气剂可能暴露普通不可变属性。
  该age属性是不可变的,但源自该birthday属性。使用所示设计,数据库值将胜过默认值,因为 Spring Data 使用唯一声明的构造函数。即使意图是计算应该是首选,重要的是此构造函数也将age作为参数(可能会忽略它),否则属性填充步骤将尝试设置年龄字段并由于它不可变且没有with…方法而失败在场。
  该comment属性是可变的,通过直接设置其字段来填充。
  的remarks特性是可变的,并且通过设置填充comment直接字段或通过调用用于setter方法
  该类公开了一个工厂方法和一个用于创建对象的构造函数。这里的核心思想是使用工厂方法而不是额外的构造函数,以避免需要通过@PersistenceConstructor. 相反,属性的默认设置是在工厂方法中处理的。
  内容来源:Spring中国教育管理中心(Spring认证)
  2021年2月,VMware公司正式与北京中科卓望网络科技有限公司(以下简称:中科卓望)达成战略合作,授予其 Spring 中国教育管理中心,携手 VMware 全球最新 Spring技术和认证体系,帮助中国院校构建专业教学内容,全面赋能未来开发人

无需跋涉雪域,在河北也能游西藏,这还有造价14000两的金顶想不想来一次朝圣之旅,无需远行西藏,更不用准备防晒霜和抗高原反应药,在河北就能望见布达拉。在河北省承德市有一座小布达拉宫,它是清朝乾隆皇帝庆为祝其六十大寿和皇太后八十寿辰,专门派人探访国际庄夜幕下的十里花廊犹如一片灯光海洋夜幕降临,华灯初上。走进位于河北省石家庄市鹿泉区的太平河景观带,绚丽多彩的灯光将沿河两岸装扮的美轮美奂,犹如置身于一片灯光的海洋里。除此之外,5公里长的河道两侧还栽种了上百种的鲜花探秘藏在太行山里的超级工程水库竟建在山顶上,太壮观7月23日,河北省石家庄市井陉县西南方向40公里处的张河湾水库,一片绿意盎然。在阳光的折射下,湖水就像碧绿的宝石,与连绵起伏的太行山勾勒出一幅美丽的山水画卷。无人机缓缓升起,俯瞰风太震撼!直击飞机低空飞行降落,感受擦头而过的刺激相信乘坐过飞机的人,都曾透过舷窗一览山河湖海的壮观美景。但有个难得一见的航空奇景,坐在飞机里的你肯定没见过。伴随着一阵急促的飞机轰鸣声,即将降落在跑道的飞机,与地面上的人们擦头而过520武汉3000余对新人领证,新人历经风雨牵手一生5。20谐音我爱你,成为近年来众多年轻人争相追捧的网络情人节。5月20日,全国各地迎来复工后的第一个领证高峰。当天一早,武汉市各大民政局婚姻登记处门前就排起了结婚登记的队伍。由于实天下第一奇松康熙曾派500御林军世代守护,枝头形如九条龙提及松树,相信很多人都会被它顽强的生命力和雄伟的树姿所折服。在位于河北省承德市丰宁满族自治县内,有一棵经历了六个朝代的古松,它枝繁叶茂,九个枝头延伸开来形如龙,造型称奇。据传,这棵你还在用单反和三脚架?太out了!看我是怎么用手机拍大片的我是一名雄安摄影师,2019年雄安新区进入5G时代,到处遍布着疾速的5G网络,而我与5G网相隔最远的距离就是一部自己看得上的手机。作为专业摄影师,专业单反设备一箩筐,为什么还要追求探访清代高考考场可容纳上百考生,还藏着一件小抄马甲7月7日,2020年高考将拉开帷幕,1071万名考生步入考场,迎来人生中不同寻常的一次大考。从古时的科举考试到如今的高考,都承载了每位莘莘学子求知的梦想。不管是科举还是高考,每个时探访国际庄的前世今生在这里,你可以一馆游遍石家庄最近,石家庄又新添了一处网红打卡地,它以极具现代化气息的造型建筑迷倒了众多人。在这里,你能感受到这座火车拉来的城市的历史底蕴,体验黑科技带来的刺激。这里就是位于正定新区的石家庄城市石家庄最大烂尾楼时隔6年后复工,粉刷后犹如童话世界11月3日,位于河北省石家庄市南二环南侧的祥云国际项目,黄绿色的城堡屋顶格外引人注目,建筑工人在屋顶正加紧施工,呈现出一派热火朝天的建设场面。祥云国际的复工,吸引了很多人前来拍摄,航拍石家庄共享电动车坟场,万辆单车摆在空地上,电池被取出现在,在石家庄市区各大街头,已经很难看到街兔共享电动车的身影,取而代之的便是刚刚上新的美团共享电动车。最近,在石家庄南二环附近的宋村西侧,密密麻麻的街兔共享电动车被停放在一片宽敞的