About this talk
This talk focuses on gRPC, a powerful framework for remote procedure calls developed by Google. The speakers, Dr. Dave Syer and Josh Long, discuss the resurgence of gRPC, particularly its integration with Spring and Spring Boot. They elaborate on its key features, such as schema support and performance advantages over traditional RPC methods. The session includes a demonstration of creating a gRPC service and client in a Spring application, showcasing dependency management and code generation for schema definitions. They also touch on security integration using OAuth 2.0 and the benefits of observability within gRPC services. The presentation emphasizes how these capabilities streamline development in polyglot environments.
Full transcript
[music] >> Hi everybody. Can you see that screen in the back? Good, because while you're looking at the screen, we're going to take a quick selfie. >> [laughter] >> Very subtle. I'm all about subtlety. That's what they say about me, subtle. Right. >> Yeah. Then look here. No, yeah. Then Look there. Look me? No. >> One and All right. Thanks everybody. Hi. Hi. Woah. Don't worry, we'll
be quick. We know lunch is right now. Very soon. Um Welcome. Dave Syer. Josh Long. No, the You know him. [applause] >> Dr. Dave Syer. Josh is going to give a demo and my job is to slow him down. Yeah. So, it's If anybody else wants to slow him down, just raise your hand and I'll uh Yeah. I'll interrupt. Yeah. There's four seats in the front for
Don't all race Don't Don't trampling, but there are four seats if you need them. Um Dr. Syer, one of my favorite doctors along with Doctors Who, Strange, Seuss, Subramanian, um Pepper. You know, some of my favorite doctors and this is my favorite. Uh and uh and we're going to talk about gRPC, this project that you got rolling a couple years ago now. >> Yeah. I feel like
Dr. Pepper, very misunderstood. >> So misunderstood. >> Um yeah, so uh gRPC, who knows if what gRPC is? Quite a few, yeah. It's It's g- G is for Google. RPC is the old remote procedure call. Boo. Wait, no, we're okay with that now. We're okay with it now, I think, yeah. Fine, it's back. >> As long as it's Google, yeah, it's fine. Um so, we know that
RPC is dangerous, right? But um so, the best you can do, it turns out, is to uh codify it, basically, and that's what Google did. Make a Make a protocol see if anybody implements it, and they have implemented it in quite a few different languages, which is one of the things that makes it very popular. Uh actually, how many people actually already use gRPC in production or
just messing around, you know, anything? Quite a quite a few few. So, um that There have been It's It's a lot It's an old project, and there have been Java uh implementations. There are There is a Java implementation. That's the one that we use it within Spring, right? So, this is what Spring does. It We reach out and integrate stuff that people already do cuz we're lazy.
Um we don't want to do it ourselves. And um What was I trying to say? >> Yeah, so there there were uh gRPC um Java integrations even with Spring in the in the community. A couple at least, I know. Yeah, I think maybe I counted three or four. Yeah. Uh and we'd always just so that's all that's fine, you know, let them get on with it. They're
They're They're They're a nice community. They're They're working together. And then things I think on all of those projects, they slowed down quite a lot, and the people who were maintaining them just didn't have time anymore, and you know what it's like with um you know, these one-man bands um open-source projects. So, it was actually Google came to us and said, "Well, you know, we've we've noticed
that this Spring gRPC community is dying a little bit. Can you come in and and do something to to to prop it up?" So, um we could have done you know, a a number of different things, but what we chose to do is create our own project, um Spring gRPC, and that's what we're here to talk to you about today. And it's been maintained You started it
as a separate project, uh but now it's sort of converging It's um toward the Spring Boot It's life cycle was It's It's experimental to start with, and zero point So, there's a zero point X um release train that was with Spring Boot 3, and when we went to Spring Boot 4, we released at 1.0. So, we now have You have the opportunity to get long-term support and
things like that like you do with Spring projects. And um so, the And the next plan that's already in motion is to take part of the project, the part that is to do with Spring Boot, and just put that in Spring Boot. So, Spring Boot is going to get a whole new load of new features in 4.1 in November, is it? No, it's It's in the summer.
Yeah. Summer, yeah. Coming very Next month next month. You can check that by going to calendar.spring.io. He would know that. Uh if I didn't ever bother to look, yeah. No, it's November's in my mind because that's the Spring Framework Yeah, the big one. Yeah. Yeah. No, it's uh so, it's it's in the summer, isn't Yeah. So, um So, what But what we're going to do today is
just give you a nice demo so you can see all the features uh well, at a very high level, of course, and very fast because you know Yeah. [laughter] Yeah, that's our style. our style, and we don't have much time. Um But why gRPC? Why not just Why does anybody use gRPC? Would anybody like to answer that question for us? I mean, it's a good question. It
is a good question. I made a joke earlier about, you know, RPC boo, but actually, I think gRPC fixes a lot of the things that made made regular RPC less appealing, palatable, right? Yeah. I think that's that's that's the reason that they set it up the way that they did, yeah. So, I mean, I I I don't know. It dep- It must be a personal choice, I
suppose, at the end of the day, but the the reasons I see people listing for using gRPC uh number one, probably top of the list, is uh the schema support. So, the fact that you It It's You can't really get away without having uh a contract for your remote procedure. So, it's not just loosey-goosey HTTP through JSON at it, and you can get anything back. Um there
is an actual protocol with uh an IDL, right? A a language that defines the interface. Is it WSDL? Uh Web services description language? Is this what we're doing? A bit like that, Much better. but actually, you Yeah. >> But designed to be human-readable. I mean, there's a binary version of it as well, which is what actually gets exchanged between the services and the clients, but there's a
human-readable version of it, which we're going to see like in about 30 seconds. Yep. Um so, number one, the uh schema. Number two, because of the schema and the big community that's out there, uh polyglot. So, there's any language you want, basically, you can um you can generate gRPC clients and server Yep. uh uh code, and you're going to see that working in a minute in Java,
of course. Super fast. But in uh organizations where you have polyglot uh requirements, so if somebody wants to use Python, Go, Node, um Rust, whatever, they've all got uh support. So, um and Java, of course, um also since a long time. Um so, that's number two, and number three, uh people often talk about performance because it uh it isn't intrinsically magic, I don't think. It's It's a
binary um protocol, so binary data transfer tends to be a little bit more efficient than JSON. I think that's something to do with it. >> Fair bit, yeah. Um and also, the servers that they've implemented. So, so we You'll see that happening here as well. There's a a server in Java, which is written on very specifically for gRPC on the Netty platform, and Netty, as we know,
is very efficient. So, if you do something focused on it, it's going to be very fast. And um the people who've given that as a reason. Uh I I'm not sure if it would stand up to that much scrutiny, to be honest, but uh it's it's a reason that people use. Cuz I mean, just, you know, any old web server with a binary protocol, binary data exchange
would probably be just as good, I I think, anyway. All right. Should we get started? >> Let's get going. Okay, start.spring.io. We're going to generate a new application. I have a preconfigured uh service here. So, what do we got? Spring gRPC server. Okay. We've got the security. We're going to comment this out for now. Got observability. Going to call this service because I'm great with names. I
get that from my father. He was great with names. When I was a small boy, we had a small white dog, and my father named him white dog. Okay, very good with names. Um and then the version of Java. And again, it doesn't really matter, I guess. You could use this if you wanted to make terrible life decisions, but we're going to use 25. Hit enter. Open
this up. First things first, I'm going to comment out the security. Don't be scared. Comment out all the security, yeah. That's first thing everybody does. Yep. But notice that when we generate the project, we have the dependency management. This won't be here for too long, right? >> That's one of the things that's going into Spring Boot, yeah. So, the Spring Boot Spring Boot um starter parent will
contain that. And this giant Maven plugin that I've never correctly gotten right by myself. And also delete that, I think, when you get to 4.1. >> Yep. Most of that will go away in 4.1. Not all of it, but most of it. It's three lines, I think. Yeah. And then now for the security. Okay, ciao. Anything else? I think that's it, actually, yeah. There's a test one
there, but I don't think that affects Nice. So, what is it? So, now I want to write code, but I am not in a position to do that because I need to configure the schema. I want to export the definition. So, let's see it. This is one of those things where uh when you build REST When you build HTTP services, invariably you You want to do it
at scale with any kind of success, you end up having to build schema of some sort, right? And there's a lot of discussion and debate about how to best do this, but it's it's pretty clear you need to do it at some point for it to be workable in a distributed system at a large scale having solid understanding of the shape of the API is valuable. You
get that for free here. Your clients need to know what you're doing. So, yeah, you can invent a way to expose it or you or you can use something off the shelf. Just realized RPC is off the shelf. Creating a There you go. Can you see that, everybody? I can see it, yeah. What am I doing? Uh yeah, so we're doing proto3 is the um this the
level of the the version of the standard, the GRPC standard. Actually, it's the proto version, isn't it? The the proto version encoding standard is uh proto3. And then you've got two options which just relate to the Java code generation. So, we're going to do coverage Java code generation in a minute and you'll see those see that package name. See bunch of files generated. String name equals >>
Okay, so why is what is name and message have number one? Why? Because it's >> it's in the proto version, it's a positional argument. So, the first argument is always the name in a greeting's request and that's the way recommend that you Well, I mean, you have to you have to provide a positional number. You They recommend that you never change that, right? So, if you want
to add another field, make it number two, but never never make another number one because that'll just confuse your old clients. So, this is a way of ensuring some level at least of if evolvability of the API for older clients. We just code generated all that. I have to Yeah, I'm He does not let me forget. As an Eclipse user and a Visual Studio Code user, I
never have to do this. He never has to do Every time he does it, he has to go and add another source to his uh IDE class path. So, I have to tell IntelliJ about the presence of that code generated code. But you never forget, I suppose, so Uh default >> Probably all right. So, now we're going to implement we're going to extend the one of the
um generated classes. We're going to make it into an app service, probably. Yeah, so this is going to become a Spring Bean. You have to tell the client we're done. We have to do something on next. Greetings response dot new builder uh and we're going to say uh set message hello. I'm going to take the request. Request is the object that came in from the client, right?
And you you you define this service here? Yeah. Oh, yeah. Should we talk about that a bit? versus others? That's a um that's a a single request response. RPC is just it takes an object and returns an object. There's a stream keyword, so you can also uh accept a stream and return a stream, so you can have unidirectional or bidirectional streaming. Okay. We're just going to do
the request response for this demo. There's a nice You're running it already. That was quick. I didn't see that. Well. He's fast. Um mundo So. Daniel. localhost 9090. It starts up So, it's not starting up on Tomcat. Why is that? What did I do? >> It's not starting on Tomcat because you didn't include Tomcat in your class path, right? It's Spring Boot, so we expect things to
be auto-configured. And what you're getting auto-configured here is the GRPC Netty based server, which comes from Google. It's a GRPC But you could run it on Tomcat. You could run it on Tomcat. That's actually one of the things that they support in the Google Java project as well. They they provide a servlet. And so, in Spring Boot land, what that means is if the servlet is on
your class path and so is Tomcat or or a servlet container, we configure it for you. So, then you've got a GRPC running on the same web server as your other endpoints, I guess. And that might be valuable to some people. We built a client. Let's go back. We built a We used the client. Let's go build one. Go build a client. Yeah. Okay. Client client. Web
client, GRPC client, web. Right. Okay. Spring web because we still have to do that to get the And same as before, we're going to copy and paste We're going to do something terrible, something you should never ever do. Never, not even when you're all by yourself at home and no one is looking. We're going to copy and paste That You might see him do it a couple
of times here. Uh client There are other strategies for this, right? You could package it up into a JAR file or something. Or you could package the generated classes, I guess, because you're just going to generate the same things. Right, that's true. Is Is that common? Do you have a common JAR between the two? >> yeah. I've seen some pretty horrific examples of that though, where I
used You've got If you've got a thousand services and all of their GRPC generated code is in a single JAR file, that's a horrible hot mess, right? So, probably don't do that. Wait. With this used to be that you would have to generate You'd use the stub, but now you've got this You can just do that, yeah. I When you first learned it, you didn't have this
option. So, this is a bit like the um HTTP interface clients, if you've seen those in when we're in Spring Framework six or seven? No, well, the interface itself >> thing was in six, but then the Spring Boot auto-configuration for it just came in Spring Boot four, I think. So, this is a lot like that. Yeah, he's So, he's showing you what it would look like for
HTTP. >> They call their services, we call ours clients. Yeah, we had an argument about that and I lost, so Oh, well. >> So, now I've got the plan on the classpath, I can actually use it. >> Can you add a target to the import? Yeah, just as a just make things easier later actually, cuz I think this is the Can I comment out security? Comment out
security again. That we aren't talking secure. That's You would know. You worked on the um Oh, I forgot. You actually were one of the uh Okay. I was Spring Security OAuth2. That was my thing for a while, yeah. >> Getting So, they Cool thing is >> that actually, yeah. You know You know the reason we did that? UAA? Yeah, the UAA in Cloud Foundry. So, Cloud Foundry
I I was working on the Cloud Foundry team and we needed user access um a security server. um Java wasn't very popular in the Cloud Foundry um ecosystem, it had to be said. I I I was there and we couldn't find anything that wasn't Java where we could do what the depth of what you can do with with Java and security, right? SAML OAuth2, all of this
stuff is just much better supported in Java than on any other platform then. And I think it's still true. I mean, that that speaks to what you were saying in the keynote, right? That Now is the time, right? If a Java developers to to seize the enterprise, if they haven't already. But yeah, so that's that's the reason that I was involved in that. So, it's running now
insecure and we can just have a look at There you go. There you go. Yeah, it did. So, if I try He hardcoded the uh request name. Sure. There we go. So, I have an HTTP controller Can you Have you got Have you got that? Have you got that? Yeah, I was going to explain. >> There's an HTTP REST endpoint here where um calling GRPC client out
to the separate server process. So, the server and the client are both implemented in Spring. One of them is a web in web web application and the other one's a GRPC server. So, we're not using like a REST client or HTTP client, we're using the generated client stub Yeah. from the schema. So, we have the schema on both sides. You could share it, you could put it
in a shared JAR, et cetera. Okay. And now, this could be streaming, you could do all sorts of things. This kind of looks like like a If you implemented your own publisher in the reactive world, it kind of looks like that, right? You've got the the on next Yeah, yeah, yeah, yeah. The on next looks like an emit. pull back based thing. Yeah, so We've got our
application. They're talking to each other. I feel like that's already half the battle. That took me hours before we before this project came along. Yeah, because of all auto-configuration conventions, putting over convention conventions over coding, whatever you whatever we Convention over configuration. That's the one. Yeah, So, now we've [clears throat] got this observable I I don't know It's not real until I can actually measure it, right?
Like I can't prove it's Right, let's have a look at the metrics, [clears throat] cuz you've been playing with it, so it should have spit out some localhost 3000 And By the way, isn't this amazing? I went to the and I chose Open Telemetry. This is a new thing in Spring Boot four. Uh getting a little crowded in here, sorry. Open Telemetry There, I just added that.
Yeah. I've got Grafana running on the default port and it's just automatically sending things over. In my config uh I probably should have done something like sampling whatever, you know, 1.0. But it doesn't matter. We probably have something here. >> we won't have many traces cuz you haven't hit it with very much load yet, but you should have metrics. Definitely. So, if I search for just GRPC
there you go. I don't have Yeah, well. No no real like >> You haven't done very much with it yet. It's fine. It's collecting data. >> Right. >> Behind the scenes. So, there we go. We've got a client, we've got a service. Oh, is it healthy? We don't know that either, right? Uh healthy, right. Yeah, right. So, there's a health endpoint cuz you put that actuator thing.
Yep. This code, by the uh is on my GitHub on uh github.com/joshlong/attic. So, github.com/joshlong/attic. Right? And then it's this folder name here. So, that folder. Here we are. Okay? The reason that's important is because we want you to be able to play the home game. Follow along at home. Internet doing its thing. There you go. So, the code's already there. Now, I'm The reason I'm looking at
my own notes here is because I can never remember We're using a nice command line tool called GRPC curl. It's like curl but for GRPC. We're asking if it's healthy. Is that backed by the same actuator health endpoint? It is because you're in a Spring Boot app, of course. Yeah, so you get this the um the status that you get back will reflect what you would have
got back from the HTTP endpoint in uh a normal Spring Boot application. So, if the database is down, this will say that it's unhealthy? Yeah, yeah, yeah. And this this is, you know, a Google feature. This is uh the health check is uh like a a public reference point for um uh for for for GRPC services. And for instance, Kubernetes has its own probes set up to
ping that endpoint using GRPC, not using plain HTTP. Okay, so we've got now observability, we've got the client, the server. Uh it's been pretty easy so far. I think the next bit is get some security and then lunch. Yeah. Yeah. Yeah. Early lunch would be good, wouldn't it? Right. Okay, so fingers crossed for a smooth security integration. I saw your one with with James this morning. Yeah,
if I can do it, come on. It'll be fine. [laughter] We're going to do this This is going to be the third time I've done the Spring Authorization Server. By the way, you worked on the original integration for OAuth and Spring. Yes. In starting 2011. It wasn't that long ago, was it? No. [laughter] Um that project was really good, but it was missing some things like OIDC
because it was it came before OIDC, right? It was missing a few things that Yeah, OIDC was kind of it was a an RFC, I think, at the when we started work on that. But yeah, so that that project ran out of steam and kind of migrated itself into Spring Security. Right. >> Cuz that's what he's going to use now to create an OAuth server. So, OAuth
2 authorization server web Postgres JDBC, okay? Create some users. And I do like how easy this is. Oh, me too. >> Um the only thing that isn't good is is YAML. >> Oh, I hate YAML. Um Didn't even need very much for for this No, that's fair. That's fair. The only Okay, look away, everybody. It's fine. Just YAML. So, I'm going to connect to the SQL database.
I've got a registered OAuth client. Remember, OAuth is all about uh delegated authentication and authorization, right? I I have a server that has access to the uh thing that I use to authenticate in my system. It in turn can Once it's Once I've authenticated, it'll hand out a token that clients can use to then be sure that they are using that they are who they say they
are. They Yeah, the system can be sure that that is the person they say they are. Okay, so Bend and verify, I like that. Yeah. Registration client ID. This is Normally, you'd have like a [email protected] or [email protected]. You'd go there and self-register a new app or whatever. Yeah, if you're using Twitter as an authorization server. Right. Yeah. And here we're just doing it in in YAML, but
there's an object you can do You can create your own self-service forms, all that kind of stuff. And we're going to get the users, the identity, the the users and passwords from our SQL database. So, to that end, let's go to the Java code here and I'll write some code. Now, stand back. This is going to be a little gruesome, but I think we'll get it done.
You know, my my dad always said if it's worth doing, do it right. Okay, it's done. So, there's the off server. And uh now we need to integrate OAuth service with our uh we need to to have it validate uh the the properties, right? So, we're going to go here, paste that all there. We're going to have it validate the client rather the tokens by going to
the off server, which is running on port 7070. Uh in the build, I need to re-enable the security. Very important. You will not get far without this. Okay? Now, when when they wrote OAuth did anybody have any sense that that they'd be using it in GRPC? Uh [clears throat] That's not how it would be. I don't think so. You did it. It's awesome. I mean, uh you're
still using it in the original setting, actually, here, but yeah. This is so cool cuz I want my tokens to go everywhere. >> It's sort of generally applicable anywhere where you've got a sort of messaging paradigm, right? Where you've got um request that has headers. You can add an authentication. So, people have done this with, you know, points as well. What am I doing here? >> That
sort of thing. >> way, GRPC uh it's easy to say GRPC or HTTP, but it is actually HTTP, isn't it? It is HTTP, yeah. So, the protocol actually mandates that it's HTTP, again, I mean, like that's a bit like the point that you just made about OAuth 2, right? It's they kind of never assumed that anybody would want to do it over any other transport, but I
don't know why. I mean, why why wouldn't you want to It's just binary data exchange, but they said that it has to be over HTTP 2. It has It has to be HTTP. Does that look great to you? Um you want an OAuth OAuth server and to authenticate everything. Yeah, that looks good. Okay, so this is like a filter. This is like the resource server support in
integration. >> actually introspect the uh the users, the authenticated user. This is the server, Oh, I want to Oh, yeah, yeah, here. So, instead of the name coming from the request, I'm just going to ignore that. And we'll get access to the very convenient security context holder. getContext.getAuthentication.getName. Right. So, we'll just ignore the request coming in and we'll say hello to whoever's logged in, right? But now
we need to do the same thing on the client side. >> Just to prove that it's working. I would be the first to admit this could I think we can clean this up. But yeah, I'll watch you do it. I think I think you'll be fine. Right. Uh GRPC channel this That thing, yeah. this And look at the global GRPC this one dot matching um local host
name. This is the target. Right? This goes right here. Same string. So, it's going to match that string. Yeah. Okay, and then a. get You can also use logical names here if you wanted to extract the configuration of the port and the host and everything into external configuration, but for the demo, we're just using literals. Oh, I have to bring in the build. Bring in security. And
shift I. Authorize client manager. Up up. There we all we're going to do is we're going to build a method that given uh a request will extract out the currently authenticated user and use that to send it off into the request. wait, what? Could that actually work? No You have to do some work here, AI. Don't cheat. Okay. If [laughter] So, var user >> Yeah, it jumps
a bit too far too fast there, didn't it? Yeah. If the user is an instance of OAuth authentication uh then we want to given the token get the Nope, wrong one. We want to get the registration ID which is this uh token >> Nice that it thinks it knows the answer. It's It's like me. It's confidently wrong. >> Okay? Uh token. getClientRegistrationId. And then we want to
say off authorization request. clientRegistrationId dot principal and pass in the user dot build, okay? Var request Request, here we are. And then return request dot Uh no, I have to pass the authorization. OAuth 2 client service, whatever. What is that object? It's not the right OAuth 2 authorized Not the right one. authorized client manager. It is right. I think you just spelt it wrong down The service
name manager. Oh. What is this thing? Where that came from. AI Oh, wait. It actually It forced it Oh, it's this. It is the same thing. Okay, that should work. So, that authorized, pass in the request Got it. get the access token get the token value. Easy. Rolls right off the tongue. Return null at the end. Return null at the end in case Oh, yeah. Return null.
>> So sad. So, there's the So, basically, it's just an interceptor that will >> you don't do that, it'll Well, you have to have to return something, right? But don't throw an exception. You don't have to cuz it'll just deny access. So, this is a filter that's going to sit when we make a request going out it's going to customize all requests going out to this service
and we're going to add an interceptor and the interceptor is in turn when it gets run this is a callable supplier when it gets run we're going to look up this method and look up the current authenticated user so in order to make this request you have to be authenticated if you're not authenticated it'll ask you to authenticate does that sound right? Yeah, it sounds right. It
looks like you don't you shouldn't have to do this. Did I fail somewhere? The um Yes, I knew this is wrong. What is that? >> The HTTP client picks up an interceptor on its own doesn't it? Did that did it pick >> told you it was like interceptor okay. I went with my heart off to authorized. Wait, wait, wait. This is still the wrong window. I manager
feel like that's the only one that's correct. >> Maybe you didn't import But I oh the client config. Ah yeah, yeah, yeah, yeah, yeah. Don't worry. There's spring boot magic going on here. Spring boot is looking for properties. If it doesn't find them it's not going to configure that manager right? Yeah. So this is the client side equivalent to the the client definition in the server okay?
So now all together now >> I've done that already today. That's why you do that today. Yeah. Hello Josh. Ah and then it knows who you So we went to 8080 went to hello it said hey I don't know you I'm not going to give you that response that kind greeting that was waiting for you on the other side of that gRPC service unless you identify yourself.
It redirected me to the off server that gave me a token I then use that token to make a request to the gRPC service which was able to extract my identity from it and then provide provide a response accordingly. Yeah. Nice. So now we have So apart from that well do you want to summarize? Yeah. I just think that's it and we have a gRPC service that
code generation we have observability we have easy integration and it works in the Tomcat it works by itself works in reactive. What works in reactive? Well there's there is a reactive gRPC project. And we have security. Which you can use to generate reactive clients and servers actually so if the code generator knows about it it will it can create reactive code for you and also Kotlin if
you like Kotlin. Um so yeah so I was going to say apart from the awkwardness with the OAuth2 client Right. what would you like to happen next? Yeah in Spring gRPC what's your what's your what's on your shopping list? My main I want a controller anybody else got any requests? Yeah. I I I I have questions who who likes code generation? Don't all raise your hands at
once. Right? There are some people who like it [clears throat] you see. I I wouldn't wouldn't it be cool if you had like a controller like a gRPC controller just like with RSocket or GraphQL or WebSockets or whatever? Wouldn't it be cool if you got a like a method where you could do that kind of thing? You mean like at get mapping? Yeah but like at RPC
mapping or something I don't know. Yeah. Who likes that idea? We're not going POJO POJO controllers who likes that? What is it? Nobody likes it okay. Nobody likes it. Who likes POJO controllers I said. >> Oh oh POJO control plain old Java object controllers yes I like this. Yes. Who likes regular Java objects instead of like code generation? Yeah. Yeah we could try that. I'm not convinced
they understood the questions. Oh I think I think you might be right >> Okay. It's the lack of it's the lack of food. Yeah maybe we should wrap up because you know they'll be opening the lunch lines soon and we don't want to miss it. If we let you go early will you promise to rate this talk the highest? >> Okay. Any questions? Any questions? I had
a question who learned something new? Who had fun? All right. Thank you everybody. Have a great tonight. >> [applause]
More from this event
See all 38 talks →
Spring I/O 2026 Keynote
1:08:44
The Spring AI Ecosystem in 2026: From Foundations to Agents @ Spring I/O 2026
43:39
Breaching LLM-Powered Applications: Overcoming Security and Privacy Challenges by Brian Vermeer
48:40
New in Spring Security 7: MFA, OAuth2 and more by Daniel Garnier @ Spring I/O 2026
46:43