springAI
關于最近看了很多SpringAi,閱讀很多代碼都感覺特別陌生
SpringAI依賴的springBoot版本都是3.3以上,
以及很多SpringAi都是依賴JDK版本最低17,
并且出現了很多新關鍵字例如 var,record 等寫法,
煙花繚亂得lambda 表達式,
到處都是使用build 構建對象(創建型模式)
JDK版本下載:
OPENJDK
事例代碼地址:
spring-ai-examples
public class ClientStdio {public static void main(String[] args) {// var 新特性只能聲明局部變量,聲明變量時候必須初始化,并且不能再方法做形式參數,不用注意對象類型。var stdioParams = ServerParameters.builder("java").args("-jar","model-context-protocol/weather/starter-stdio-server/target/mcp-weather-stdio-server-0.0.1-SNAPSHOT.jar").build();var transport = new StdioClientTransport(stdioParams);var client = McpClient.sync(transport).build();client.initialize();// List and demonstrate toolsListToolsResult toolsList = client.listTools();System.out.println("Available Tools = " + toolsList);CallToolResult weatherForcastResult = client.callTool(new CallToolRequest("getWeatherForecastByLocation",Map.of("latitude", "47.6062", "longitude", "-122.3321")));System.out.println("Weather Forcast: " + weatherForcastResult);CallToolResult alertResult = client.callTool(new CallToolRequest("getAlerts", Map.of("state", "NY")));System.out.println("Alert Response = " + alertResult);client.closeGracefully();}}
/** Copyright 2024-2024 the original author or authors.*/package io.modelcontextprotocol.client.transport;import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.modelcontextprotocol.util.Assert;/*** Server parameters for stdio client.** @author Christian Tzolov* @author Dariusz J?drzejczyk*/
@JsonInclude(JsonInclude.Include.NON_ABSENT)
public class ServerParameters {// Environment variables to inherit by defaultprivate static final List<String> DEFAULT_INHERITED_ENV_VARS = System.getProperty("os.name").toLowerCase().contains("win")? Arrays.asList("APPDATA", "HOMEDRIVE", "HOMEPATH", "LOCALAPPDATA", "PATH", "PROCESSOR_ARCHITECTURE","SYSTEMDRIVE", "SYSTEMROOT", "TEMP", "USERNAME", "USERPROFILE"): Arrays.asList("HOME", "LOGNAME", "PATH", "SHELL", "TERM", "USER");@JsonProperty("command")private String command;@JsonProperty("args")private List<String> args = new ArrayList<>();@JsonProperty("env")private Map<String, String> env;//私有化構造器 不讓你直接new 關鍵字實例化對象private ServerParameters(String command, List<String> args, Map<String, String> env) {Assert.notNull(command, "The command can not be null");Assert.notNull(args, "The args can not be null");this.command = command;this.args = args;this.env = new HashMap<>(getDefaultEnvironment());if (env != null && !env.isEmpty()) {this.env.putAll(env);}}public String getCommand() {return this.command;}public List<String> getArgs() {return this.args;}public Map<String, String> getEnv() {return this.env;}//var stdioParams = ServerParameters.builder("java")
// .args("-jar",
// "model-context-protocol/weather/starter-stdio-server/target/mcp-weather-stdio-server-0.0.1-SNAPSHOT.jar")
// .build();public static Builder builder(String command) {return new Builder(command);}
// builder構建器在這里,構建器里面接了入參public static class Builder {private String command;private List<String> args = new ArrayList<>();private Map<String, String> env = new HashMap<>();public Builder(String command) {Assert.notNull(command, "The command can not be null");this.command = command;}// 上面注解的 入參方法 ,返回builder對象public Builder args(String... args) {Assert.notNull(args, "The args can not be null");this.args = Arrays.asList(args);return this;}public Builder args(List<String> args) {Assert.notNull(args, "The args can not be null");this.args = new ArrayList<>(args);return this;}public Builder arg(String arg) {Assert.notNull(arg, "The arg can not be null");this.args.add(arg);return this;}public Builder env(Map<String, String> env) {if (env != null && !env.isEmpty()) {this.env.putAll(env);}return this;}public Builder addEnvVar(String key, String value) {Assert.notNull(key, "The key can not be null");Assert.notNull(value, "The value can not be null");this.env.put(key, value);return this;}//最后使用build 對象,實例化我們的ServerParameters public ServerParameters build() {//內部可以調用私有化構造器return new ServerParameters(command, args, env);}}/*** Returns a default environment object including only environment variables deemed 本地方法獲取你系統的環境變量信息* safe to inherit.*/private static Map<String, String> getDefaultEnvironment() {return System.getenv().entrySet().stream().filter(entry -> DEFAULT_INHERITED_ENV_VARS.contains(entry.getKey())).filter(entry -> entry.getValue() != null).filter(entry -> !entry.getValue().startsWith("()")).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));}}
reocrd 關鍵字
參考學習:record詳解
public record Love(Long id, String name) {public static void main(String[] args) {String name1 = new Love(1L, "張三").name();System.out.println(name1);}
}
相當于傳統的
public class Love2 {Long id;String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Love2(Long id, String name) {this.id = id;this.name = name;}}
最后:先說這些