《Spring Guides系列学习》guide51 - guide55

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。

在这里插入图片描述
接着上篇看过的guide50,接着往下看。

guide51、Consuming a SOAP web service

使用soap服务,了解几个概念:

SOAP是一种基于XML的通信协议,用于在Web服务之间进行交互。它定义了一种规范的消息格式,可以在不同操作系统、编程语言和网络环境中进行互操作。

SOAP最初是用于在Web服务之间进行消息传递的,它使用XML格式来封装请求和响应消息,通常使用HTTP协议进行传输。SOAP消息由一个包含消息头和消息体的XML文档组成。在SOAP消息中,消息头包含了一些元素,如消息ID、时间戳、安全信息等,用于描述消息的属性和元数据。消息体则包含了实际的请求或响应数据,通常使用XML格式进行编码。

WSDL是Web服务描述语言(Web Services Description
Language)的缩写,它是一种XML格式的文档,用于描述Web服务的接口、消息、数据类型和服务地址等信息,以便各种平台上的应用程序可以相互交互。

SOAP(简单对象访问协议)和WSDL(Web服务描述语言)都是用于构建Web服务的技术,但它们的作用不同:

  1. SOAP是一种基于XML的协议,用于在Web服务之间进行数据交换。它定义了一种标准的消息格式,包括消息头和消息体,并且支持多种传输协议,如HTTP、SMTP等。SOAP可以保证数据的可靠性和安全性,但是消息格式比较复杂。
  2. WSDL是一种XML格式的文档,用于描述Web服务的接口、消息、数据类型和服务地址等信息。它为客户端应用程序提供了一个清晰的视图,使它们可以了解Web服务的接口和操作,并生成相应的代码以便与Web服务进行交互。WSDL可以帮助开发人员构建和发布Web服务,并且可以提高Web服务的互操作性。

需要注意的是,SOAP和WSDL通常是一起使用的,因为WSDL描述了Web服务的接口和操作,而SOAP定义了Web服务之间的消息格式和传输协议。开发人员可以使用WSDL来生成客户端代码,然后使用SOAP协议来进行数据交换。


可以对比下json

JSON是一种轻量级的数据交换格式,它基于JavaScript语言的子集,可以被广泛地应用于Web应用程序之间的数据交换。
JSON格式的数据由键值对组成,键和值之间使用冒号分隔,不同的键值对之间使用逗号分隔,整个数据使用大括号包围。

SOAP和JSON都是用于Web服务之间进行数据交换的格式,但它们有以下不同点:

数据格式:SOAP使用XML格式来封装请求和响应消息,而JSON使用键值对的格式来描述数据。
复杂性:SOAP的消息格式比JSON更加复杂,需要包含一些元素,如消息头、消息体等,而JSON的格式更加简单明了。
可读性:JSON格式的数据比SOAP更加易读易写,因为它使用了简洁的语法,并且可以被轻松地解析和序列化。
互操作性:SOAP可以在不同的操作系统、编程语言和网络环境中进行互操作,但需要使用一些规范化的机制,如WSDL、XML Schema等。而JSON的互操作性更加简单,因为它已经被广泛地应用于各种编程语言和平台中。

guide52、Accessing Neo4j Data with REST

使用 Spring Data REST创建和检索存储在Neo4j NoSQL 数据库中的对象Person。Spring Data REST 采用了Spring HATEOAS和Spring Data Neo4j的特性,并自动将它们组合在一起。

Spring Data REST 还支持Spring Data JPA、Spring Data Gemfire和Spring Data MongoDB作为后端数据存储

1、首先是本地安装neo4j,然后启动
在这里插入图片描述

2、配置文件写上:

spring.neo4j.uri=bolt://localhost:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=secret

3、创建一个域对象

@Node
public class Person {
  @Id @GeneratedValue 
  private Long id;
  private String firstName;
  private String lastName;
  ...

创建一个域对象的存储库:

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>, CrudRepository<Person, Long> {
  List<Person> findByLastName(@Param("name") String name);
}

@RepositoryRestResource 是 Spring Framework 中的一个注解,用于将一个 repository 接口暴露为 RESTful 资源。它可以用于自定义 repository 暴露的 REST 端点及其行为。默认情况下,它将 repository 映射到一个基于实体名称的 URL 上,但可以自定义使用不同的 URL,提供自定义查询方法等。它在 Spring Data REST 项目中被广泛使用。

4、启动程序

@EnableTransactionManagement
@EnableNeo4jRepositories
@SpringBootApplication
public class AccessingNeo4jDataRestApplication {
  public static void main(String[] args) {
    SpringApplication.run(AccessingNeo4jDataRestApplication.class, args);
  }
}

@EnableNeo4jRepositories 是 Spring Data Neo4j 中的一个注解,用于启用 Neo4j 存储库的自动配置。它告诉 Spring 在应用程序上下文中扫描包以查找存储库,并创建存储库的实例。它还允许配置存储库的基本包路径和类型。

@EnableTransactionManagement 是 Spring Framework 中的一个注解,用于启用 Spring 的事务管理功能。它告诉 Spring 在应用程序上下文中启用注解驱动的事务管理,以便可以使用 @Transactional 注解来标记事务边界。它还允许配置事务管理器、事务属性等。

可以直接访问
在这里插入图片描述
显示了程序所提供的功能,http://localhost:8080/people,并且还提供page、size、sort等选项。

Spring Data REST 使用HAL 格式进行 JSON 输出。它很灵活,并提供了一种方便的方式来提供与所服务的数据相邻的链接。

可以调用接口,新建一个people对象, 如下:

在这里插入图片描述

根据返回的地址链接,查看单个people

在这里插入图片描述


guide53、Accessing Data in Pivotal GemFire with REST

和上篇讲的基本一致,就是把底层数据存储结构变为了Pivotal GemFire。

Pivotal GemFire是一种内存数据网格(In-Memory Data Grid)和分布式系统,由Pivotal公司开发。它提供了一个高性能、高可用性和可扩展性的数据管理平台,可以处理大规模数据和实时数据流。Pivotal
GemFire使用分布式内存架构,可以将数据存储在多个节点中,从而提高数据访问速度和可靠性。它还提供了一些高级功能,如数据分区、事件处理、分布式查询和事务处理等,使得开发者可以轻松地构建复杂的分布式应用程序。Pivotal GemFire广泛应用于金融、电信、医疗保健、航空航天等领域。

Apache Geode(原名GemFire)

首先域对象:

@Data
@Region("People")
public class Person {
  private static AtomicLong COUNTER = new AtomicLong(0L);
  @Id
  private Long id;
  private String firstName;
  private String lastName;
  ...

@Region(“People”) 是一个注解,用于将Java类或接口声明为一个 Apache Geode 或 Pivotal GemFire 区域(Region)。在Geode或GemFire中,Region是一种分布式缓存数据结构,它将键值对存储在一个或多个节点的内存中,并提供了高性能、高可用性和可扩展性的数据访问方式。

基于域对象的存储库:

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends CrudRepository<Person, Long> {
  List<Person> findByLastName(@Param("name") String name);
}

和上篇的存储库没啥区别。

启动类:

@SpringBootApplication
@ClientCacheApplication(name = "AccessingGemFireDataRestApplication")
@EnableEntityDefinedRegions(
  basePackageClasses = Person.class,
  clientRegionShortcut = ClientRegionShortcut.LOCAL
)
@EnableGemfireRepositories
@SuppressWarnings("unused")
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

@SuppressWarnings(“unused”)是Java中的一个注解,它用于告诉编译器忽略未使用的变量、方法、参数或导入声明等产生的警告信息。

@EnableGemfireRepositories是Spring Data GemFire框架中的一个注解,用于启用GemFire数据存储库(repositories)的支持。GemFire数据存储库是一种Spring Data抽象,它为应用程序提供了一种将数据存储在GemFire分布式缓存中的方式。通过使用@EnableGemfireRepositories注解,Spring Data GemFire可以自动为应用程序生成GemFire数据存储库的实现,并将其注册到Spring应用程序上下文中。

@EnableEntityDefinedRegions是Spring Data Geode框架中的一个注解,用于声明一个或多个实体类作为Geode区域(Region)的模板,并启用实体类和区域之间的映射。

@ClientCacheApplication是Spring Data GemFire框架中的一个注解,用于自动配置和启动一个客户端GemFire缓存实例。客户端GemFire缓存实例是一个连接到一个或多个GemFire服务器的本地缓存,它可以使用Spring Data GemFire提供的各种功能来访问和操作GemFire分布式缓存中的数据。

看下测试结果:

在这里插入图片描述
创建一个新的people:
在这里插入图片描述
就可以查看所有人了, 或者指定id查询
在这里插入图片描述
在这里插入图片描述


guide54、Caching Data with Spring

怎么使用spring缓存bean,其实核心还是@cacheable、@cacheput等注解。

实例:

先构建简单的对象bean:

public class Book {
  private String isbn;
  private String title;
  ... 

创建一个存储库:

public interface BookRepository {
  Book getByIsbn(String isbn);
}

@Component
public class SimpleBookRepository implements BookRepository {
  @Override
  public Book getByIsbn(String isbn) {
    simulateSlowService();
    return new Book(isbn, "Some book");
  }
  private void simulateSlowService() {
    try {
      long time = 3000L;
      Thread.sleep(time);
    } catch (InterruptedException e) {
      throw new IllegalStateException(e);
    }
 }

在写一个commandLineRunner类,启动程序后能自动执行:

@Component
public class AppRunner implements CommandLineRunner {
  private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);
  private final BookRepository bookRepository;
  public AppRunner(BookRepository bookRepository) {
    this.bookRepository = bookRepository;
  }

  @Override
  public void run(String... args) throws Exception {
    logger.info(".... Fetching books");
    logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
    logger.info("isbn-4567 -->" + bookRepository.getByIsbn("isbn-4567"));
    logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
  }

查看结果:
在这里插入图片描述

下面在加入缓存试试,在simpleBookRepository中给getByIsbn方法加上注解@Cacheable

  @Override
  @Cacheable("books")
  public Book getByIsbn(String isbn) {
    simulateSlowService();
    return new Book(isbn, "Some book");
  }

启动类也加上@EnableCaching注解

@SpringBootApplication
@EnableCaching
public class CachingApplication {
  public static void main(String[] args) {
    SpringApplication.run(CachingApplication.class, args);
  }

看看结果:

在这里插入图片描述

Spring为我们提供了几个注解来支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。


@Cacheable注解:@Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。


@Cacheput注解:与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。


@CacheEvict注解:是Spring框架中的一个注解,用于从缓存中删除一个或多个缓存条目。它可以用于标记在方法上,当方法执行成功后,将清除指定的缓存条目。

举例:
@CacheEvict(value = "users", key = "#id")
public void deleteUser(long id) {
    // delete user from database
}
这个例子中,当deleteUser方法成功执行后,@CacheEvict注解将清除名为"users"的缓存中键为id的缓存条目。

参考文档:https://www.cnblogs.com/fashflying/p/6908028.html


guide55、Working a Getting Started guide with IntelliJ IDEA

用intelliJ IDEA打开一个guide工程,我一直都是用Intellij打开的。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值