Let's use Spring Boot to build games, because why not? by Alexander Chatzizacharias @ Spring I/O 26
About this talk
In this engaging talk, Alexander Hatzi explores the intersection of game development and Spring framework technology. He begins by discussing his personal journey in learning Spring, specifically his desire to understand the underlying mechanisms of Spring Boot without the 'magic'. The session highlights how he utilizes Spring Boot and Kotlin to create interactive games like Pong and Snake, demonstrating the capability to manage game loops, spawning GUI elements, and registering beans dynamically in a Spring context. Furthermore, he elaborates on creating more complex games, integrating Spring features such as the Actuator for metrics and Spring Security for managing in-game authority. Alexander stresses the importance of playful experimentation in learning and invites developers to push the boundaries of the Spring ecosystem.
Full transcript
[music] >> Hi. Welcome. Welcome. Um thank you very much for coming to this I hope a little bit different talk than what you've seen so far. Um my name is Alexander Hatzi blah blah blah. Um I have a couple hobbies. I occasionally boulder. I have a way too expensive Magic the Gathering card collection. Are there anybody else collecting magic cards here? A couple people. Nice. I went
to Magic Barcelona yesterday. Spent again way too much money. Uh and I This will This will shock you. I'm sure. But I like video games. Um and I like playing video games and I like making video games. Uh that is a little bit what I'll be showing today as well. Any other gamers sitting here by any chance? Oh wow wow yeah. It's Barcelona capital gaming capital of
the world looks like. Um I work I work at a small consultancy in the Netherlands called called J Driven. So we were like 30 people there consulting mainly on JVM technologies. And that's all I have to say about me. Um so a talk like this typically has some sort of origin story, right? How How does this get started? A couple months ago I was talking to a
colleague about well technologies used on JVM to build microservices mostly. Um and we're talking and then of course you talk Spring Boot there you talk Quarkus, you know, etc. etc. Uh Java EE or building our own solution. Don't know why but we go to there. And then I caught myself saying uh this. Um I don't like Spring or Spring Boot because there's too much magic happening. Has
anybody heard this phrase before? Has anybody said this phrase before? No. I'm pretty sure if I go to a Quarkus conference it's going to be a different answer. [laughter] but then I realized this is not necessarily a problem as Spring Boot problem. That is a me problem because I never invested the time to actually understand what Spring is doing underwater and I just used it as it's
out of the box and just assumed things worked, right? So then I was like okay okay I want to learn how Spring does things underwater. when I learn things I typically tend to make games to try and understand things or how things work. And that is how a little bit how this started. Now my initial the initial thing I want to do is kind of show you
how Spring works underwater via games. But as this evolved I was having a lot of fun with it and even more fun. So basically today I'm just going to try to have fun with you all for the upcoming 50 minutes. I don't know if I'm going to teach you anything or or no. That's for you to decide but I hope you'll have fun with me. with that
just know everything you'll see today of course no shocker is built using Spring Spring Web to be sure to be more precise. Uh using Kotlin. Any other Kotlin people A couple. Nice. Um and it's the front ends are typically used build using Java Swing. Uh some people are like ooh. >> [laughter] >> Anybody else that has done something with Java Swing? 20 years ago. >> Now I
feel old. Uh but yeah I I know Java Swing quite okay so that's why mostly why I use it and it's of course it's already in your class path, right? So it's a bundle with Java. All right. So with that first question does anybody know which game launched the video game industry in the 70s? Oh well so you guys are educated. Yes. Pong. when starting with a
with a project like that the first thing you want to typically want to do is verify your assumptions. Verify that you can actually start a game out of a Spring context and start a so-called game loop. So when you program games the first thing you need is a game loop that runs every X milliseconds. So if you're running at 60 frames per second the game loop will
run at 60 milliseconds so it will end at 128 milliseconds etc. etc. etc. I really kind of wanted to see um how early I could hook into the life cycle Spring. Um interestingly did did you know that Spring sets this headless um argument to true uh every time you start it because Spring is like okay you do not need a GUI or anything like that. So if
you turn this if you set this to true it will offload all the Java Swing and all the front end classes from the class path which arguably something you want but if you're making games something you really do not want. So you can change that to that. And then what we're going to do is um we have this new bean register interface that released a couple of
months ago by now to even more programmatically a better in a better way register beans. And what we're going to do here is or what we want to do here is when we're registering a bean we're going to stop the registration process. We're going to play a game of Pong and based off who wins we're going to register bean A or B or bean B. And then
uh uh hopefully there we go. And then we have a little AI that is not very good otherwise I'll lose. Talking from experience. And then you can move play with a game of Pong against the AI. What? So I won and as you can see we stopped we stopped the bean registration waiting for the game of Pong to complete and after it was done we registered the
super cool service instead of the kind of cool service. So you can hook into the whole Spring life cycle quite early I would argue and you can spawn a J component or a Java window as early as you want. So that is pretty cool. That is something we want. Uh so with that we kind of verified the assumption that indeed we can spawn a GUI out of
a Spring Web context and do stuff with it. Who knows in which year Spring Framework was released? 0.9. I heard 2000 and 2003. Nailed it. Uh what games were you playing in 2003? Warcraft III. That's a good game. does anybody remember this? So when I was thinking about what I was playing in 2003 I remember having this phone this huge ass Nokia thing walking around playing Snake.
And then I was starting starting to um look into that Snake game and surprisingly it was built using Java So I found the JAR file >> of that thing. I couldn't use it one to one because they did all kinds of things to make it work on Nokia. But I could find I extracted the um uh the sprites and the art from it. And you can now
play Snake. By the way always change your Spring banner. And then here you have it. Snake XE2 Spring Edition. It's a little bit slow but the games back then were also slow. I don't know if you remember. So how does this work a little bit? So the the Pong game used a Kotlin coroutine for the loop. I figured that Kotlin coroutines that's a little bit boring a
little bit basic. I can anybody guess what I use for the to do the loop? Almost gave it away there. To do the for the Snake game? At scheduled. Very nice. Here you go. So you basically schedule this at a fixed rate of uh a tick rate which in this case is 500. So if I change this to basically telling okay I want this scheduled job to
run every 100 And here you go. So now you have a Spring managed game And as you can see here the ticks are going as expected, right? All right. Let's zoom in. And then furthermore so we have a repository with a repository annotation and we have the services as you would expect them with a at service annotation. You know with all the stereotypes that you were expected
and you basically use the whole Spring bean life cycle to do things. And that works and that's quite nice. But that means if we can use at and pass in a property that means we can also use spell expressions to pass in and calculate the frame rate using a spell expression. Which year did Spring Framework 1.0 release? 2004. That one is easy. >> 2004. There was in
a very popular game that released in 2004. Can anybody remember? Half-Life 2? Really? Oh man, that would have been a good one. >> Could have called it Half-Life Spring in a Half or something. >> No, but not Half-Life. Does anybody know World of Warcraft? Yeah? Anybody still playing World of Warcraft? A couple. No, I did not make World of >> using Spring. But there was an awesome
And this one I played a lot. Halo. Halo 2. What the Any people that played Halo? Oh man, that was That game is amazing. Uh so I figured let's see if we can make a shooter uh in Spring. Uh what let's just start it first. And then we'll see what it does and I'll explain a little bit how it works afterwards. By the way, if you have
questions, insults, criticism, just throw them. It's fine. And I made this and I could could not not put the main menu music on the back. So if the conference gets copyright stricken by Microsoft, I'm sorry, I guess. >> All right. So uh we have this little shooter and we can shoot. Uh we can reload. And then you can see there is an enemy there. And that enemy
has a name. But what is this? >> And then we can press P to enter tutorial. And then we can start level one. And as you can see this is a completely different level. And then we can walk here. Uh can anybody guess how I do the level scene management so to say? Wait, let me kill uh this one. And as you can see, so every bean
in the in the context is is what I use to spawn enemies. Uh and then as you destroy them, I remove the beans from the application context. Because a lot of times I had like this this question, do I really need all these things in my application context? Uh and right now you can actually find out if you really need it because as you remove it, uh
the game still is running fine. So I what an internal event listener processor is, but I don't need it. >> Or uh got to reload. Property placeholder auto configuration. I Oh. The internal scheduled annotation processor was definitely necessary. um so you saw there were some levels here. So I have this tutorial level. And the whole level design is basically in your property in your application YAML. So
this is the level. Uh and this is level one. Uh pretty much. And basically, did you know you can react to your application being uh killed in Spring? I had no idea. So you can actually catch the event that is killing the application. You can react to it. What I do is when I catch the the event, I basically restart the application but with a different configuration
profile. So you So I restarted it with level one. And like that you basically have scene management, a level management built into Spring just by switching application profiles as you go. And there there might be a small problem that the application has to quit and restart, but that is problem for future us. >> Um So yeah, what do we do here? Anything else cool that we do
here? So again, uh apart from that, everything is as you would expect it. So the at schedule doing the tick with fixed with a spell expression calculating the frame rate, which is 1,000 * 60, which is the frame rate that we wanted. And then again had the services, etc., etc. All as you would expect it in a typical Spring Boot Um I'm making assumptions there that you
would expect it like this, but let's let's hope that is I use Spring. We're continuing to the year that Spring Data was released. Anybody got a clue? Arguably one of the most used starters when it comes to Spring, right? Anybody want to take a guess? Three, two 2009? You're close. 2011. In 2011, there was also an indie game that was released that is immensely popular and to
this day is receiving updates. You're all very close. Minecraft released in 2008. Sorry? There you go. Terraria. or I called I called it first Spring Aria, but that doesn't really sound nice. So let's go with Springcraft, okay? Um So yeah, should I show the code first or how it works? Or should I show the game first? How it works first. Okay. Of course, when we're using Spring
Data, so we're going to use the repositories as they are. Uh so basically we have tiles because Terraria as a game is built using a 2D grid, right? The tiles. And basically then every single tile in the world is in a is abstracted by a repository by a Spring repository. A Spring managed repository. And as you can see, even the method names is exactly as you would
expect them >> a JPA repository. And basically as we move as we'll be moving around, you'll see that we're querying this repository for tiles and do thing doing things with tiles, right? Uh the game loop is pretty much the same. Um we have a player class which uh will be doing things. But what's interesting here, you'll see a player in action service. And here is the first
time I introduce my own annotation. Uh at with sound. So you basically annotate a method with you can annotate any method with this. And when it's called, it's going to play a sound, right? So I think if you see this, it makes a lot of sense what this is going to do, probably. Um now this is in a different service, right? Uh next to the player. Uh
even though the player should have its own jump method, arguably. Can anybody Does anybody know why I did this? What happens when you create when you proxy a bean in Spring? Come on, you you know this, people. So when you proxy a bean, um the CGLIB basically creates well, this proxy around it and basically it intercepts calls to the calling class. So if you are Has anybody
ever tried an at transactional to call an at transactional method from the same class that you Right? That doesn't work. And it's exactly the same here. So I've I've structured it away to a different uh to service then we and then it works. There is another way of solving this and when I found out, I was disgusted to the core. You can self-reference the player class. So
you can inject the player in the player and instead of doing jump, you can do player.jump and that works. But that is that just felt so disgusting. >> I just could not do that. Uh yeah, so we didn't do that. Um And if So we have with sound and then we have like the bean processor. And then we also have with looping sound. So we're going to
because we're also having sounds, background music that is going to be looping, right? Um So yeah, let's let's give this a try. And um All right, let's move this a little bit to the up. Um You all understand what this is supposed to be, right? Okay, good I'm very insecure about my pixel art skills. You're going to hear some background music. Was anybody at the Arconia talk
earlier today? So did you know that Thomas is also a music composer? Because this is made by him. So thank you very much. >> Okay. Can anybody Does anybody know who this So that is Finkat. The Rockstar speaker. And then of course Does anybody know who that is? Spoiler alert, he's giving talk right there right now. I wonder if he can hear this. >> Uh and then
we have uh Okay, the next one is going to be loud, so maybe turn out the sound a little bit. Um Has Does anybody know Nano War of Steel and the Hello World.java song? I won't do that again. I should I should walk around by the way. You can see that I mean I love explosions, but they're a little bit distracting. And you can see that I'm
entering certain cage, right? So a game like Terraria, so you can of course dig around. you can build around. Then you can go to lower. has like this intricate cave systems. This is what the cave system looks like. This is what the world is. Every cave is one is a bean in the application context. So can you guess what the cave system is? It's your dependency graph.
So I grab the dependency graph, calculated, and overlayed it over the simple noise that I generate from for the for the world. And then you have a cave system. So I don't know why people are doing like intricate weird algorithms to to create perfect caves in Minecraft in these games. Just grab your dependency graph, you're there. another thing you can do. So in games when you have
settings, you typically want the settings to be persistent, right? So once you quit the game and you restart the game, the settings should be the same. So if I change this jump force to like minus 21. See I jump so super high. Next time I start the game, I want it to be there minus 21 as well. I'm going to stop it. The explosion getting a little
bit distracting. Can anybody guess how how that works? DB? No, man, that is way too straightforward. >> Huh? Save to file? Also way too straightforward, but pretty close. So what if I told you look at your configuration properties and don't see them as something static before your application starts, but see them something dynamic that can change during your application run. So here basically I have this my
application YAML and I just change the jump force. All the classes to do this are already on class path because Spring uses them internally to to read the application YAML etc. etc. So you you can basically create dynamic application properties as you run your Can you imagine self-learning Spring Boot applications that change their own properties as they're going? Might might be onto something here. and that all
that all works. And I have to say especially that at with sound thing, I implemented that and I was like I use Unity 3D like a game engine quite a lot for my hobby projects and I implemented that I was looking at it like why doesn't Unity have this? That [laughter] is so nice. It's so so all right. Um let's continue. We're going to the year that
Spring Boot Anybody knows? Yeah. the second installment of a game, but the whole series is immensely popular ever seen Can anybody guess? Oh man, you play? Dark Souls? So indeed Dark Souls prepare I like to call it the this is the prepare to enterprise edition. you're going to see a lot of things and you're going to hear awesome music by Thomas again by the way. so the
first thing to understand is since we use Spring Boot, why not collect metrics, right? So everything we'll be doing in the game is going to be collected and sent to a Grafana dashboard. Uh so we can basically check how much damage did we do, how much rolls did we How much HP do we have? What is our current status? Are we up or down, you know? Why
look at it in the game when you can watch it in the dashboard? the game loop is basically as you would expect it by now like at a schedule tick. So all the services and the repositories are as you expected. Um so I think I think I'll just start playing the game. I would I would ask somebody to play this, but it's super janky. So we're walking
around as you would expect in Dark Souls. We have an enemy. God damn. My god. Maybe I shouldn't face hugging like there we go. All right. So we have gotten authority and this door only opens if you have a certain authority. Can anybody guess what I use? I think you all guessing So this uses Spring Security underwater to get the authority that you need to open the
door. And wait, maybe quickly take a look at There we go. These are our dashboards. So this our HP 70, stamina we are up right now, so that's good. Our potion charges are you can have trends over your HP over time, how you rolled. It's all very important. An enemy that tried to shoot you off camera like in every Dark Souls game. And then we go here.
Another key. Then you can roll super cool. All right, I've I've did I've done this so many times and I think by now I can defeat them quickly without dying. There we go. There it goes one. Got There we go. Okay. and then we get the architect authority. Wait, let me drink a potion as is Dark Souls tradition. All right. So this is what I like to
call the scrum wall. He's he's pretty difficult. It's okay. I'll lose. I'll lose. Uh all right. Not that I dislike the music. But having a lot of explaining things So you saw the metrics, you saw the dashboards, they work. Why ever have dashboards about anything interesting like I think I also track the JVM pressure at some point. Yeah, I mean not super interesting. This is where the
magic is happening, right? Our player status is down as because well, we died. of course our health when if you may name something a health indicator, you're basically inviting people like me to use that as the health system in the game, right? So you saw the boss HP, the enemy HP, everything you see on the UI is going through actuator and the health end points. And then
when I say it's going through actuator, I mean that to the most literal sense. Because what I do, I was looking through the documentation for actuator. And did you know they never say or write that you shouldn't call your own actuator end point from an application. and then I hear all these talks about, you know, being decoupled and modulars etc. etc. Decoupling between UI layers etc. etc.
So what I do is I call my own actuator health point. Um and then in the for example in the HP, I put all the details like the HP, the all the details to calculate the UI what the UI element should show, put it in the details and that is how the UI is rendered. So I do a rest call to my own actuator end point to
get the data I need to to visualize the HP and the stamina and everything. And it works. And I don't know. Uh this might be falling starting to fall in the category don't do this at home, I guess. Everything [snorts] I've shown so far is good to do at home by the way. and of course we talked about the security stuff. So we have the security config.
Um [snorts] the door service that basically checks do you have a certain authority to pass this door? And if you don't have the authority, well, tough luck. Go get your authority. And it doesn't necessarily be need to be given through a GW token that it goes through a whole security chain or whatever or whatever. You can just give it programmatically and it all works. So that works
quite nice. By the way, if you're wondering, this one is not built >> It's uh using the lightweight uh Java game library, uh which is like GPU bindings and stuff like that. It was pure hell to work with. And that comes from someone that used Java Swing for the rest. So, yeah, that is a little bit everything. Uh I think uh and of course the repositories is
as you would expect it. All the potions are basically in the repository and by now this is a little bit how things start to to work, right? Uh oh. Uh I have one last thing to show game to show you. which year was Spring Boot 3 released? 2022? Nailed it. Uh there was a game. I'm a huge fan of this game that released in 2022. Uh in
the game made with HTML5. Anybody can guess? So sorry sorry. Hollow Knight? No. Oh, that'd be a good one as well. Huh? Does no anybody know Vampire Survivors? Yeah? Anybody that played Vampire Good. I like to call My version is Enterprise Survivors. That one really resonated with me. >> Um and for this one I I thought to myself, okay, let's just go to the max. How would
I how would Spring Boot look like to me if it was like a game development framework? first thing uh first I I started introducing my own um annotations for things. for example, if we go to the game loop, uh suddenly instead of at service this is an at game manager. And this is basically a stereotype annotation that lets people know this is a game manager and you
can inject it left or right. Or works, right? So, it doesn't necessarily need to be at service. Um Okay, so I'm a huge metal fan. Any other metal fans here? Okay, you're going to love the upcoming 10 minutes. Any people that hate metal music by any chance? Okay, okay, okay, then we're good. so, I thought, okay, what if we played Vampire Survivors? Vampire Survivors for people that
don't know, it's a game where uh you are the boss, so to say. So, you're spawning a lot of bullets and you're defeating hordes of enemies as they're coming towards you. And I thought to myself, what if we made a rhythm game out of that? What if we just moved on had to move on the rhythm? Uh so, basically the whole game is built on top of
uh Spring events. So, every beat uh in the game is an event that is getting raised and then everything UI elements or the player is basically reacting on that uh event. Uh so, as you can see it here. So, we have an event listener on the beat. and here we have a uh looping sound. Um and this is the tick and uh for the people that are
very observant observant, you already saw this, but there is no at scheduled annotation So, but this will hopefully, if everything works, uh run again every 16 milliseconds. Can anybody guess how that works then? So, we have uh our own scheduling config. Um which basically is a declarative way of doing at scheduled instead of imperatively with an annotation. Uh and we configure the task. Um and then uh
do whatever you want. So, yeah, uh don't do this at home. >> This is definitely the don't do this at home category. All right, let's uh quickly uh show uh the game uh before we continue. I generated some songs for this because um copyright stuff. So, [music] as you can see you can need to move on go down. Oh man, I'm so bad at my own >>
[music] >> And then you can pick an update. >> Bonus points if you can tell me which band this is supposed to be. >> Rammstein, yeah. that was loud. >> And I died. Of course, as you by now expect, uh we have our dashboarding here. Very important. With our highest combo, how many beats we hit, how many beats we missed, enemies defeated, etc. etc. etc. Um we
use the at with with sound annotation, for example, for the beat Can can can you imagine a future with where you can annotate your message with at with sound? And then you can your your application crashes and you just download an MP3 file and you just sit back and chill and listen to it and like, oh yeah, I hear where it goes wrong. Around 1 minute and
23. um and of course the upgrades, they are tiered, right? So, you could you saw it a little bit, so you need to unlock certain upgrades before you can unlock the next tier of the upgrade. Uh by now you can guess what I use for that. Spring Security. um basically so, we have the uh this gate service and with a spell expression you can basically very easily
say, okay, needs to have a certain authority uh the authority name and then every time you unlock a upgrade, you give authority to the next upgrade. And then basically every time your upgrade repository, which is a GPA repository, is just pulling that and that works actually quite well out of the box. Uh so, that's quite nice. Um I also have a medium medium song. Um anybody that
thinks, hey, I'm pretty good with rhythm games, I want to give it a try. I can't. So, yeah, so this song is about how much I hate daily stand-ups. I feel as an industry we should have outgrown them. >> So, yeah, I'm doing better with the faster song than the slower song. >> That's good. >> Okay, let's uh >> So, as I move around, you can notice
there's a little >> ghost behind me. And every time I miss a beat, I'm put back at the ghost, [music] Stop this. Can anybody guess how that works? Can somebody tell me what the transaction manager does? Well, if you If you think about it, makes a lot of sense. So, in transactional manager, all it kind of does is every X amount of milliseconds or seconds or whatever
you say, it creates a snapshot or it commits something or whatever. And then if it sees an exception in its Well, in its code but in its transaction scope, it basically rolls back to that to that snapshot. And that is all we do here. So, every five beats, I put on a snapshot. Uh that is our safe state. And then if if I miss a beat, I
raise a beat missed exception and the transactional manager will see that and be like, "You suck. Go back." And that is basically how it works. And it works surpris- surprisingly easy. So, I'm not sure if the Spring team knew that basically made an auto save system >> for games when they introduced transactional. But I don't know. I'm pretty sure that was the intended idea behind it. You
saw an easy song. You saw a medium song. Of course, there's a hard song. Uh can anybody So, I could not bring it to my heart to generate the hard song because there's only one hard song when it comes to rhythm games. Does anybody know what I'm referring to? Okay, I always thought that question was harder. >> So, yeah, Through the Fire and the Flames by DragonForce.
Good luck. Yeah, thank you very much. Let's see if I'll even be able to move. Ah. I should probably add like a god mode or a I'm presenting mode. >> Come on. >> That's about like exactly how it went 10 years ago Guitar Hero. >> The intro, "Oh, I can do this." And then it starts and like, "Okay." I guess that's it. That's the end. Yeah, and
I think that is a little bit all the weird stuff I do to make this work or weird stuff. Some might say it's weird. I think it is a natural evolution of the ecosystem. >> This is my favorite part. This is where I shout things that I want implemented without and being too lazy to do it myself. So, I really think the Spring team should ASAP introduce
MP3 or WAV support. It's 2026. I think it's necessary for us to be able to debug our production environments. And while we're at it, some dedicated rendering support. Um com- maybe combined with a GPU abstraction layer so that you can actually load 3D models and stuff like that very easily without having to do weird stuff with external libraries and things etc. Um and good input system because
the Java Swing one is not good. So, something else. And uh would be nice if I didn't have to calculate my own collisions all the time, you know? It's uh There are people smarter than me out there that can probably do it better than me. And while we're at it, add all this as well. Occlusion calling, very important. Textures, scene management, line parallel background, spreadsheet manager. And
I think once we have all we might be getting close to it becoming a game engine. I have to say when I started this, I was like, "Yeah, I wonder how this is going to turn out." But it was a surprisingly fun experience. Um And it worked surprisingly well. Uh once I started kind of leaving behind the conventions and what people taught me over the year that
how I should use things, I was like, "You don't tell me how I should use it. I'll use it however I want." then things started making a lot of sense. And then suddenly things like uh uh sound Um uh and a sound annotation. I think I didn't even show it like I also have this um at update annotation. So, I have like this update bean. Uh and
what what I can do with this is basically um mark update functions all over my code base with that update and it's collected by the processor and with a certain ordering and it's executing these update methods um based on the order, which is really nice because I don't have to inject this class anywhere anymore. I just throw the update um uh annotation there and it's run every
frame, every tick. And I do the same uh do I have it here? Probably not. Uh render. Oh, wait. Add render exit. And I have also one for rendering. So, you just slap this on your rendering functions and then Spring collects all these uh methods. It just run this runs them every time the rendering loop uh refreshes. So, basically like that, you don't have to inject things
left or right. They they they just work. And that is what I like about Spring, right? That is why we use it. It just works. That is what you want. So, yeah, that was really a surprisingly fun and smooth experience. Um I've said this before and I'm going to keep saying it till the end of times. Um code coding and code is your superpower. Maybe coding not
anymore because it might or might not be also generatable. Uh but code, understanding code, code, thinking bytes, thinking what can I do what of the depraved thing can I do with this machine in front of me right So, code is your superpower. Don't forget it and don't ever use it wisely. Just go out. And that's a very selfish thing I say here, but because personally, I love
seeing people doing these kind of projects. When I saw that that somebody created ported to Doom to TypeScript types, that was like Christmas for me reading about it how they did it and stuff like that. That is what That is the content I love to see. So, hopefully maybe next year I'll see somebody of you standing here giving a presentation about uh I don't know, using Postgres
as a database as Well, yes, as a game engine. >> I think using Postgres as a database is unique per se. And maybe another tip for you for everyone. If you want to really learn how to something works and you really want to get to the nitty-gritty of things, um make a game with it. >> And then suddenly one once things start running every frame, so every
16 milliseconds, then suddenly you'll start to see uh where the bottlenecks are and what works, what doesn't work, what you know, what really matters in in in terms of performance. I've heard so many times people say, "Yeah, but those bean processors, that is slow and it's slowing my super super fast uh rest endpoint that is called twice a day." Um and then uh then now I can
show them this. I was like, "I don't think it's that slow. My game is still at 60 frames per second." so, yeah. Uh so, who thinks we should now all go out, go to the Broadcom people and start telling them, "Hey, where is Spring Boot started games?" Who thinks yes, LET'S DO THIS? AHAHA. [applause] >> THANK YOU. >> [applause] >> THANK YOU VERY THANK YOU VERY MUCH.
UH I hope you had fun. Thanks for watching. You can find me on some places. If you have questions, I'll be around the rest of the day and uh feel free to come up to me. Thanks.
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