All Episodes

July 30, 2025 39 mins

This week, Julián is joined by the first Spring Developer Advocate and Java champion, Josh Long! Tune in as the pair discusses Spring Boot and tools like Spring AI, Spring Modulith, Spring Cloud, and Spring Shell that build upon it. 

If you're a Java veteran like Josh, or returning to it after years away like Julián, this Tips & Tricks episode of Code[ish] will bring you up to speed.css-j9qmi7{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;font-weight:700;margin-bottom:1rem;margin-top:2.8rem;width:100%;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:start;justify-content:start;padding-left:5rem;}@media only screen and (max-width: 599px){.css-j9qmi7{padding-left:0;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}}.css-j9qmi7 svg{fill:#27292D;}.css-j9qmi7 .eagfbvw0{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#27292D;}

Mark as Played
Transcript

Episode Transcript

Available transcripts are automatically generated. Complete accuracy is not guaranteed.
(00:04):
Hello and welcome to Code(ish),
an exploration of thelives of modern developers.
Join us as we dive into topicslike languages and frameworks,
data and event-driven architectures,artificial intelligence and individual
and team productivity, tailoredto developers and engineering leaders.
This episode is part of our Toolsand Tips series.

Julián Duque (00:26):
Here we are on a new edition of the Code(ish) podcast.
We are so honored and happyto have today as our guest,
the one and only Josh Long.
He's the first Spring developer advocate,
is a recognized author, Java champion,

(00:48):
and if you are into Java,you probably might know him.
So, Josh, welcome to Code(ish).

Josh Long (00:54):
Hi, how are you?

Julián (00:56):
I’m pretty good, thank you very much for joining us today
and for sharing all yourknowledge with our audience.

Josh (01:05):
You know, it's my pleasure.
And people who don't know,
we have to record a little audiosample in the beginning of this.
I know why they're doing that.
They're using somethinglike Adobe Audition.
And if you capture like anaudio print, they can use that
to extract out the backgroundnoise from the foreground noise.
And while we were recording that,my dog, who’s sleeping

(01:25):
a meter away from me, woke upand just started scratching himself
very, very, very loudly.Julián: [Laughs]
And so, I'm kind of wondering what the final podcast will look like.
I hope it wasn't captured.
I've got the voice isolation on.

Julián (01:39):
I cannot hear, but I have a very, very important question.

Josh (01:44):
Oh, yeah.

Julián (01:44):
What's your dog's name?

Josh (01:46):
Oh, his name is Peanut.
He's not a good dog.
He's a terrible dog.Julián: [Laughs]
He's like 10 years old. 11.
He’s not, not a good boy.

Julián (01:55):
There are no such things as bad dogs.

Josh (01:58):
No, no, no. You haven't met yet.
Peanut is terrible.
But we keep him for three reasons,you know, in my home.
One is, first, even terrible dogs deservegood, loving homes.
So, so there's that.
And then two, there's an egocomponent to it.
In my home, my partner and my daughter,they both speak five languages.
I only speak three and a half.
So, if we didn't have that stupid,stupid dog, then I would be the stupidest

(02:20):
in the house. That will not stand. Right?Julián: [Laughs]
And then the third reason is he is very, very cute.
So we keep him for those reasons around.
But he's not a good boy.
Did you ever see that ad for thisdog named Prancer during the pandemic?

Julián (02:34):
I don't recall it, no.

Josh (02:37):
This woman was trying to find a new home for her dog.
And the dog's name is Prancer.
P-R-A-N-C-E-R.
This is back in 2021.Actually... [Gasp] I'm so excited.
Today is [the] four-year anniversary [of]the post that just changed my life
because it made me understandfour-year anniversary of Prancer.
So it made me understandthat not all dogs are cute and adorable.

(03:00):
Some are problems...Julián: [Laughs]
...but that's okay.
They deserve homes too.Just because they're a little spicy
doesn't mean they can'tbe fun to have around.
She wrote this post,very, very funny post.
She says, “Okay, I've tried.”
She's looking for a new home for the dog,right, she's trying to rehouse the dog.
So she says, “I've tried for thelast several months to post
this dog for adoption andmake him sound palatable.

(03:22):
The problem is there's not avery big market for neurotic,
man-hating, animal-hating, children-hatingdogs that look like gremlins.

Julián (03:30):
[Laughs] Josh
someone out there for Prancerbecause I'm tired, and so is my family.
Every day, we live in the grips ofthe demonic Chihuahua hellscape
he has created in our home.
If you own a Chihuahua,you probably know what I'm talking about.”
And then she continues that he wasquiet and just laid on the couch.
Didn't bother anyone.
“I was excited to see him come outof his shell and become a real dog.

(03:53):
I'm convinced at this pointthat he's not a real dog,
but more like a vessel for atraumatized Victorian child
that now haunts our home.”Julián: [Laughs] That’s genius.

Josh (04:04):
And then she goes on and on, she continues, “...is only two years old,
and will probably live tobe 21 through pure spite.
So, take that into account.”
And if you look at the photos,he's a very cute dog.
I'd totally pet that dog.
But it sounds like hecan be a little spicy, too.

Julián (04:19):
You need to send me that link so we can add it to the blog post
that's going to companion this episode,so everybody can see it.

Josh (04:26):
Prancer and Peanut. They're the best. Not good dogs.
They're just the best dogsbecause they make life more interesting.

Julián (04:33):
Awesome.
But, yes, definitely we do hearPeanut, and I’m pretty sure
all the magic behind producingis going to take care of that.

Josh (04:43):
[Laughs] Julián
I tried this tool from Adobe podcast
and it can do like some magicwith voice, even though I have a
professional microphone and tryto have like a proper setup here
with sound isolation and everything,I still need to use certain tools
and the power of AI to make a recording,kind of like a professional level.

(05:08):
Oh yeah, you’re a better podcaster than I am.
I have a podcast.
I actually had... our friendBetty came on the show.
We were in Singapore a few years ago.
She’s always been an executiveas long as I’ve known her.

Julián (05:21):
She’s our Chief Marketing Officer for Heroku.

Josh (05:24):
And she’s amazing.
I was very, very excited to get somebodythat important to come on my little show.
And that’s the only timeI felt embarrassed because,
unlike you, I don’t careabout the audio of my podcast,
because what happened was I went downthis path for years and years and years.
I’ve been doing this podcast since 2018,and I’ve been doing videos on YouTube

(05:46):
since 2015, and I’ve been doing all sortsof public appearances for decades.
So people have heard my voice.
And so I’m finally doing these podcasts,and the number one complaint
I would get for years and years is,“The audio sounds terrible.
You’re cracking up.The voice doesn’t sound good.”
And I would get these veryexpensive microphones and I
have very expensive recording equipmentand I would soundproof the room.

(06:07):
Nothing.
People still complained and now I thinkmaybe they just don’t like my voice.

Julián (06:11):
[Laughs]

Josh (06:13):
It doesn’t matter, you know, it doesn’t matter what I do.
They will always complain.
So now I’m using acheap RØDE lavalier mic.

Julián (06:19):
RØDE are pretty good. I have RØDE myself, so.
Josh, you have been workingon Spring for a while. 2010.
I remember using the old-school Spring.
I think before Spring MVC was a thing.
I was using just the Spring framework
for dependency injection and stuff.

(06:41):
And that’s most of the Java I did.
I think I tried Spring Roo, whichwas a new thing back in the day
for building quick applicationswith Java, but that’s it.
I transitioned to Node.jsand never did anything with Java,
but we just had almost an hour chatbefore recording this podcast

(07:04):
and Josh showed me aroundthe latest and greatest things
in Java and the Spring world.
And I can say I’m amazed.

Josh (07:13):
Aw shucks. Well, thank you.

Julián (07:15):
So you have been witness of that evolution since 2010.
How has been that whole process for you
while being part of developeradvocate for the Spring project?

Josh (07:28):
So I did join, I joined the Spring team.
I was officially using Spring,and I was part of the community
from 2003 maybe, I was using Spring
very, very early before it was even GA 1.0,
and I started contributing code backin 2007, 8, 9, but they didn’t hire me.
They tried to hire me [in] 2009,but then there was a hiring freeze
or something like this.

(07:49):
They interviewed me in 2009,but I didn’t get the job until 2010.
Through that entire time, remember Springhas been around since GA 1.0 since 2004,
but there was books about itbefore that in the early access
beta builds and all that.
It was really nice, that’s why I was veryexcited to do this demo for you,
because if you haven’t seen it in 15 yearsand the world is completely different,

(08:10):
and it’s always nice to see people’sexpressions and their attitudes
change around where Java and Springhave arrived compared to where it’s been.
You asked me what that’s been like and,
there’s no single point where I can say,okay, this is totally different.
There’s nothing along the road.
The metaphor with the boiling frogs,you don’t know you’re being cooked.
I didn’t know that things were changingso dramatically, but if you take

(08:32):
the long-term sort of perspectiveand look at how things were
10 years ago, 15 years ago,and how they are now, it’s night and day.
And for me, the single most important
turning point in that evolution was 2014.
I can’t say thatthat was like the only thing,
but it was certainly an amazing yearbecause Spring Boot 1.0 came out

(08:52):
and Java 8 came out.

Julián (08:54):
Mmm, yes.

Josh (08:56):
These two things are symbiotic.
Spring Boot, I don’t think it’s veryarrogant or presumptuous to say that
Spring Boot has been verysuccessful in the Java community.
It doesn’t matter who you ask.
Most people of this Javacommunity are using Spring Boot.
It’s even bigger than Spring Frameworkwas and Spring Framework was already
the single largest thingin the Java community.

(09:16):
That 2014 year, that’swhen it really arrived.
And then Java 8 gave us lambdas.
It gave us streams, not great but decentfunctional programming support.
We had an amazing opportunity
and I think amazing platforms likeHeroku and Cloud Foundry on my side,
which were application first,
the idea that you can take an application
and get it deployed really quicklyon these platform-as-a-service offerings,

(09:38):
it had all happened at around the sametime and it was just such a perfect storm.
So I look back at that and I think,Wow, if this didn’t happen,
if Java 8 didn’t arrive,would it be the same?
Or what if Spring Boothad come out a year later?
We also added a project calledSpring Cloud in 2015.
And Spring Cloud,
it builds on Spring Boot, so it’s SpringBoot plus, plus, Spring Boot plus

(09:59):
support for microservices.
And now we’ve got Spring AI,which is Spring Boot plus support for AI.
And these things are hugely popular.
Lightning in a bottlekind of moments in time.
Yeah, it’s just been very,very strange to see this.
Do you have kids?

Julián (10:14):
I don’t. I don’t have kids.

Josh (10:16):
Okay. I’ve got a daughter and she’s much smarter than I am.

Julián (10:20):
[Laughs]

Josh (10:22):
She’s growing.
She’s now 19 and a half
and she’s off in universityand we miss her all the time, of course.
But at university, she’s gone for sixmonths or three months or whatever.
She comes and sees us a lot,but not every day.
And so now we see her,and she’s different.
It’s obvious you can see the differences.
Maybe she’s gotten a littletaller, or maybe she’s...

(10:42):
the way that she is, is very obviouslydifferent from the way that she was.
And I feel like it’s hard to see that
with something that you’restaring at every day like I have been.
But even I can see a fewvery important moments in time.

Julián (10:55):
That’s amazing.
So I can understand a little bitbecause I’ve been away many, many years
from the Java ecosystem.
To put in a little bit of context,
in my time, the most modern thing
that was released was Java Generics.

Josh (11:11):
Huge, Java 5, yeah.

Julián (11:13):
Yeah, Java 5. So imagine that.
So what exactly is Spring Boot?
Because you have been talkingabout like Spring Cloud, the Spring AI
being based out of Spring Boot.
As if Spring Boot, it is the core,but the core of, of what?
What exactly is the Spring Boot project?

Josh (11:32):
Well, okay. So I didn’t mean to mislead.
Spring Framework is the coreand then Spring Boot builds on that
and then Spring AI, Spring Modulith, Spring Cloud,
they all build on Spring Boot.

Julián (11:43):
Okay.

Josh (11:44):
So the core concept of Spring, back in the early days,
and it doesn’t seem like a big dealnow, obviously, and that’s because it’s
been commoditized, it’s becomesomething that everybody takes for granted.
But when it first came out,we talked about the Spring triangle,
three very important things that we use
to help deliver value so thatpeople can build applications.

(12:06):
First of all, it’s a framework.
And what I mean by that iswe provide the essential scaffolding that
all applications needbefore they can do anything useful.
And there’s lots of different frameworksand lots of different opinions
about how much or how littleshould be included in the framework.
But it is a framework.It’s not just a library.
The framework controls the lifecycle.
And when you hear people talkingabout frameworks, what is that definition?

(12:29):
It’s open for extension,closed for modification.
So it is open source.
So of course you can fork it,you can make changes to it.
It’s Apache 2 licensed, be our guest.
But the point is because it’sgot well-known extension hooks,
you don’t need to change it.
You can just add in different objectsof these well-known types,
and they’ll get plugged into the machine,
and they can sort of affectthe behavior of the final thing.

(12:51):
In the old days, we talkedabout dependency injection,
which again, not a new thing,very, very easy to take for granted today.
It just means writingcode using constructors.
Make sure that your objectsare instantiated in a valid state
once they’re constructed.
And there’s also setterdependency injection.
But really, today mostpeople are doing constructors.
There’s dependency injection,there’s aspect-oriented programming.

(13:13):
Basically, you can use this extralayer to decorate existing objects
with new capabilities.
So in Python, for example,you have the ability to do that
kind of thing, where you can addnew capabilities just by adding in Java,
we call them annotations for example,in Java they’re attributes.

Julián (13:29):
Or decorators.

Josh (13:31):
The idea is that you can add new capabilities, and you can do so
in a cost-cutting kind of wayso you solve it once,
and you can just easily tell other objectsto have this behavior in capability.
An example might be transactiondemarcation, or auditing,
or observability,or setting up HTTP endpoints.
And the benefit of thisis that it’s easy to create an object

(13:53):
and then have the methods of thatobject mounted as HTTP handlers.
The benefit of that is that wecan take any regular Java object
and add to it, decorate it,
add to the methodsof that object’s capabilities.
So whenever this method gets called,send a metric to my time series database.
Whenever this URL gets called,call that method.

(14:14):
It doesn’t have tohave a strict interface,
or we can work with therecalled plain old Java object.
So, aspect-oriented programming
allows you to add capabilitiesto plain-old Java objects.
And then finally, we haveportable service abstractions.
So the idea there is that there arecertain things that you need to do,
which are common.

(14:34):
So, for example, dataaccess and messaging and AI.
You want to talk to Kafka,
you want to talk to your database,you want to talk to an AI model.
It’s very useful to havea level of abstraction,
sufficiently abstract that you canwrite code concisely and elegantly,
while also keeping, wherever possible,the full power of allowing you to drop down.
So those three pillars,those three tenets,

(14:56):
are the most importantparts of Spring Framework.
But you had to configure everything.
When I mean configure I mean youhave to write all the objects yourself.
You have to describe to Spring howall these objects are wired together,
and that’s complete flexibility.
That Spring Framework approachdefinitely says you have all the power,
but also, you have all the responsibility.

(15:17):
If you want to do anything,it has to be you that configures it.
We had some shortcuts here and there.
You can one line, you couldget transactions, another line,
you could get a chron method orwhatever, but still, you had to opt in.
You had to say, I want this.
And if you look at the prevailingtrend of frameworks around this time,
2004, 2005, especially with Ruby on Rails,
you get thisconvention-over-configuration approach.

(15:40):
And here, with conventionover configuration, the idea is that
you’ll get a lot of defaults,and the defaults will give you the power
to move very quicklytowards a particular goal.
The problem is thatRuby on Rails, in particular,
bakes those defaultsso deeply into the code
that every time you wanted tounwind or do something slightly

(16:01):
against the grain of those defaults,the work became very, very difficult.
It was almost impossible in some cases,
and you ended up having to throwaway a lot of code-generated code
and start from the very bottom.
And so we didn’t want to do that.
We tried something like that withSpring Roo, but that didn’t quite work.
And so finally here comes Spring Bootand Spring Boot adds this new mechanism,

(16:23):
this new point on the polygoncalled auto configuration.
So now it’s not reallya Spring triangle, is it?
It’s a Spring square or somethinglike that. A Spring rectangle.
And auto configuration gives you the ability
to have things that are on the class path,
that are on the library path, that arelinked in your program, and that’s it.
And by virtue of the fact that they’represent when the program starts up,

(16:45):
they contribute thingsto the running application
and they can determine, they can askquestions of their environment,
which allow them to determine thingsabout the environment so they can say,
okay, is this environmentvariable set, is this property set,
is there a class of this typeon the library path?
Has somebody already definedanother object of this type
in the application context?

(17:06):
And these cues, also they can determine,
am I running inside of aCloud Foundry or a Heroku?
If I’m not, then don’tbother doing A, B, and C.
So we have this verydynamic configuration model
that can look at the external environmentin which the program is operating
and the internal one, and re-adjust thethe basic behavior of the program.
What this means is that for aSpring Boot user, if I want a web server,

I just add one dependency: spring-boot-starter-web. (17:27):
undefined
Add that to the build,
and then suddenly I’ve got anembedded web server that starts up.
I don’t have to write a line of Java code.
If I want easy data access,talking a sequel database, for example,
there’s a dozen different options.
But I could usespring-boot-starter-data-jdbc.
That’s one of a dozen different,equally interesting options.

(17:48):
And so, if I want observability,I just say spring-boot-starter-actuator,
and then I have metrics anddistributed tracing and all this stuff.
So now that is auto-configuring, it’sautomatically configuring these objects for you.
But, the benefit is thatthese configurations are written
in this dynamic style that will back offif the user provides their own thing.

Julián (18:09):
Okay.

Josh (18:10):
Let’s say I’m using spring-boot-starter-data-jdbc.
It’ll automatically configure a datasource for me based on some properties
or if I have an embeddeddatabase like H2 or whatever.
But what if I don’t havean embedded database?
And what if I want to have two databases?
Okay, well, fine.
As soon as you define a Bean of typeDataSource by yourself, then the default
one that Spring Boot will providedoesn’t get created, it backs off.

(18:34):
So it’s the best of both worlds,you have full automatic convention,
but at any point in the road,if you want to just change an object,
if you want to overridethe default behavior
for one object here orone object there, fine.
Just define the object yourself
and then Spring Boot will defer to youfor that one particular thing.
And so you get the best of both worlds.
And it’s not just for web apps
babysitting databases,as in the case of Ruby on Rails.

(18:57):
We do this for everything.
If you want to build AI services,if you want to build microservices,
if want to build CLIs,if you want to build shell applications,
if you want to build batch processingor messaging and integration and Kafka
or secure applications are OAuthor Samwell or whatever, there’s
a starter for literally everything.
So now you get this convention overconfiguration, but it’s not intractable.
You can always just undosome default assumption,

(19:20):
which I think has been a verypowerful thing for people.

Julián (19:23):
It seems like a very good approach
because you’re adding on top of something
instead of removing or cleaning up.
One of the problems that Ihad before with technologies
like Rails or Django or Pheonix,
these full-feature frameworksthat gives you a web application,

(19:45):
like an MVC web application,
for certain applications that I wantto build, but I don’t need all of that.

Josh (19:51):
Yeah.

Julián (19:52):
I just need to have, let’s say, one route that does one thing.
This is what I like aboutNode, for example.
I kind of start from scratch buildingexactly what I need
instead of cleaning upafter doing on its scaffolding.

Josh (20:07):
Right.

Julián (20:08):
And the thing is that sometimes you don’t know the framework that much to start
deleting things that you don’t knowif it’s going to be used or not.

Josh (20:17):
Right. Julián
Yes, you showed me a... I think it was a website,maybe it will be good to share for people
that don’t know anything about Spring Boot,
where you were pretty muchbootstrapping the application.
This is all the different plug-insor libraries we were going to use,
and it gives you a Maven configurationfile for you to start a project.

(20:41):
Or Gradle. I like Maven, or Gradle though, either one.

Julián (20:46):
Can you build also with the other
JVM languages with Spring Boot?

Josh (20:52):
Yeah, Kotlin and Groovy are supported out of the box as well.
Kotlin is even more... I showed youthe code. We built an express JS style,
two HTTP endpoints, one of whichused AI, and it had a web server,
and it had a data access layer,including the public static void main
and the imports, it was like45 lines of code and that was with Java.
You couldn’t do that in Node,you couldn’t do that in Python,

(21:12):
you couldn’t do that in Ruby,you can’t do that that quickly.
But with Kotlin it’s even less, right,because it’s a more concise syntax,
so it’s just a very, very niceexperience, I think for people.
If you don’t want to type a lot,then you can use Spring Boot.
If you don’t want to type a lotof types, Spring Boot in Java is
if you don’t want to type a lot andyou don’t want to type a lot of types,
but you want to type systems,then use Kotlin with Spring Boot as well,

(21:35):
which is a very popular choice,still the number two choice.
I think most people are still using Java,but Kotlin is a gorgeous language. I love it.

Julián (21:43):
Wonderful. I mean, it has evolved a lot.
Like what I saw... you were using Java 24,
it’s way different than the Java I remember.

Josh (21:52):
Yeah, that’s true.
And Kotlin is stilljust a bit more concise.
But yeah, you’re right.
Java has gotten a lot better.
You remember Java had generics.
I’m laughing because it seemsa little silly that a language
would not have generics today,but obviously Go just a few years ago
they only got it,so maybe it’s not so silly.

(22:13):
Yeah, it’s come a long way.

Julián (22:15):
You gotta use the right tool for the job, of course.
I mean, there are like many, many optionsout there for building applications.
You gotta use the right one.

Josh (22:23):
And I think the thing that’s really nice about Spring
is that we take a lot ofinspiration from other things.
Obviously, one of the things
that’s nice about Spring Bootis that it has self-contained binaries,
and so that way you canactually just do Java -jar,
and then the program starts up.
That sounds obvious right now,
but it wasn’t such a big thingwhen Spring Boot came out.

(22:43):
The first real use case I heard of peoplewanting to have this was Heroku.
Heroku did a very good job thereand then of course Cloud Foundry and,
and then the other thingthat was kind of interesting
is that we have built in supportfor building Docker images.
All that built-in support for buildingDocker images comes from build packs,
which started with
Heroku and became a collaborationbetween our teams and your teams.

(23:05):
Actually, I rememberseeing my friend James Ward.
Did you ever meet James Ward?

Julián (23:10):
Yes, of course.

Josh (23:11):
Okay. Lovely human being.
He used to work at Heroku,and I remember seeing him doing talks
using Dropwizard, which is anotheramazing piece of technology.
It didn’t start at Heroku, obviously,but it created self-contained jars.
And that was such a novel thing back then.
At the time, James Ward was one of youramazing developer advocates.
He was out there showing people how tobuild these Dropwizard services for Heroku.

(23:33):
You know, it’s like, Oh, that’s really novel.
So the Spring Boot team took a lotof inspiration from Dropwizard as well.
I love Spring Boot,but obviously, to be fair,
you have to look at theincredible lineage of all these
amazing things that inspired itand that continue to inspire it.

Julián (23:47):
You also showed something today I miss in the Node.js ecosystem,
but I can find it with Bun or Deno,
which are the other two alternativeNode.js... like JavaScript runtimes
for backend and server-side applications,
which is compiling or buildinga binary, like a self-contained

(24:10):
binary with the runtimedependencies and the application.
And that’s something thatyou could do that with Node.
It is not native. There are like sometools that can take you there.
But to be honest, I was notexpecting to see that for Java.
For me, Java wasalways like this huge thing

(24:31):
that you required this hugeruntime to run an application,
and you just with one commandshowed me that that was not the case.

Josh (24:40):
So we’ve had GraalVM support in the Java community for
I think the 1.0 release ofGraalVM came out in 2018,
but it was availableas an early access thing.
Actually, the guy who created it,he’s a vice president at Oracle,
and there’s a whole division that worksunder him, lots and lots of people.
But he worked on the Just in Time compilerfor the V8 JavaScript engine at Google.

(25:02):
His name is Thomas Wuerthinger.
And then of course,he decided to take his
magical powers and applythem for Java a decade ago.
It’s been this thing that’sbeen there for a long time.
The Spring team added support for it.
We had Spring Native, we had this projectthat you could use as early as like 2020.
It must have been 2020.You know why?
I remember doing a demo for everybodyto see back in March of 2020,

(25:25):
and of course…Julián: Everything went down after that. [Laughs]
[Laughs] And nothing else happened that month, right?
I remember that demo being very rough,
but now it’s so easy to doand so, so clean and awesome.

Julián (25:38):
I have to give it a try for sure.

Josh (25:40):
And it makes it easy to deploy on Heroku.

Julián (25:43):
Nice. Oh yeah. That’s something that I want to experiment.

Josh (25:46):
Yeah, super good.

Julián (25:47):
So there is this personal misconception of using Spring
just for web applications,but that seems not to be the case.
What other type ofapplications or solutions
can I build with theSpring Boot for example?

Josh (26:03):
It’s easier to think of things that I cannot build.

Julián (26:06):
Okay.

Josh (26:07):
So right now I would not try to build an iOS application.
I think Spring Boot would bea very tough thing to use.
But you know, with GraalVM,
you can export your JVM codeas a DLL or a .DYLIB or .SO.
So they can be linked onto iOS.
You can actually link to them from iOS.
There’s actually... GraalVM also gives you a...they just showed a preview feature

(26:27):
just two weeks ago where you can takeJava code and target web assembly.
Maybe this is three weeks ago.Julián: Ooh.
Now you can imagine linking to that web assembly from your Rust
or your C code, but that’snot yet ready for prime time.
It’s still very early days,but give it a little while,
maybe we’ll see amazing things.
So if I wanted to do kernelextensions in C, Spring is terrible.

Julián (26:48):
[Laughs] I can imagine.

Josh (26:50):
Yeah, it’s not going to be a good choice, but that doesn’t tell you much.
I’m not going to cry about two people thatwanted to do kernel extensions in Java
not being able to do that.

Julián (26:58):
What about a C-like tool?

Josh (26:59):
Well, we have a project called Spring Shell,
which gives you full tabcompletion readline support.
It gives you parameters.
You can run it as a shellor you can run it as a CLI.
Just run the program andthen exit or it gives you a console
where you can actually have cursorprompts and all that kind of stuff.
I can build up a shell,a usable shell, in five lines of code
or something like that.
It’s really powerful.

(27:20):
It’s built in Spring Boot and of courseyou can use GraalVM native images.
So now you can ship somebody aMyCLI.exe or MyCLI, Mac and Linux.
So you can do that.
You can do batch processing,big data, no SQL.
We have Spring Data and we have SpringBatch for those use cases.
And of course Spring Batchcan do distribution of data.
So I’ve got billions of recordsI need to process in concurrence

(27:40):
and I need to make sure thatwe don’t lose track of which
data has been reador write. You can do that.
We have Spring integration forevent-driven architectures and messaging.
So if you want to do a Kafka or Apache Pulsar,JMS, RabbitMQ or literally anything.
TCP IP, you want to do Twitter,
you want to do email, there’s aframework for that instead of buying...
You don’t have to buy

(28:00):
TIBCO or Rendezvous or webMethodsor whatever, you can just use this.
If you wanted to do web services,we talked about that, fine,
you can do Spring MVC and Spring Boot,but if you want to build microservices,
want to do distributed computing,
client-side load balancing, you wantto do a centralized configuration,
federated oAuth centralized configuration,
you want to do a circuit breakersand bulkheads and all that stuff,
we have this project called Spring Cloud.

(28:21):
Spring Cloud, in turn, providesabstractions for different
infrastructure-as-a-service providers,and those are maintained
with one exceptionby the individual company.
So there’s Spring Cloud for GCP,
there’s Spring Cloud for Azure,
Spring Cloud for AWS,
Spring Cloud for Aliyun,which is Alibaba,
and those all provide idiomaticbindings to these different

(28:42):
infrastructure pieceson these different platforms.
In terms of the Spring interfaces,the only one that isn’t maintained
by the original companyis the AWS integration.
So all the other cloud providers maintaintheir own Spring Cloud distribution
built on top of our basicSpring Cloud, you know?
There’s security so you can doSAML, oAuth federated login,
the best security technologyfor any developer, in any period.

(29:04):
It’s been around for 20 years.
It’s the richest ecosystem.It can do pass keys.
You can do magic links,
you can do NIM password, you can doall sorts of things with Spring Security.
You can build desktop apps using JavaFX.

Julián (29:16):
Oh yeah, I remember JavaFX for sure.

Josh (29:19):
I contributed the support for building Kubernetes Java clients
and making that work in GraalVM.
So basically, you canbuild a Kubernetes operator
or a controller usingSpring Boot very, very easily.
You can build a servicebroker in Spring Boot.
So it’s just endless.

Julián (29:33):
Whatever you can imagine.

Josh (29:35):
Yeah. Oh, and AI. We have this whole... Spring AI.

Julián (29:39):
Exactly. That’s where I was going to go... to leave the most interesting topic right now
for a lot of people to thelast one to discuss, which is AI.
You showed me in this example,just doing a basic chat completion,
a call to OpenAI.
But what about the good stuff, like

(30:00):
can I build an MCP serverclient right now with Spring?

Josh (30:04):
So Spring AI is a toolkit that’s meant to make it easy for you to interface
with dozens of different LLM modelsand transcription models and image models.
And it also provides support
for all the useful patternsin AI engineering like RAGS.
We have integration for dozens ofdifferent vector stores for RAG pipelines.

Julián (30:22):
pgvector, of course.

Josh (30:24):
pgvector, the one I use all the time in my demos, I love that one.

Julián (30:27):
And we support them by the way, so.

Josh (30:29):
Yeah, there you go.
That’s right there becauseHeroku Postgres is awesome.
Beyond that, you’vegot a couple of things.
First of all, MCP.
So MCP, for those thatdon’t know, is a protocol
created by Anthropic, the peoplethat made Claude Desktop,
and this was back inNovember of last year.
I don’t know if peoplecan remember that far back,
but it’s only been four anda half months, five months.

(30:51):
They created this originally for theirdesktop, Claude Desktop software.
The idea is that the MCP servicewould run on the same platform,
on the same host, and so theycommunicate via standard in/standard out.
So this is really useful.
I mean, people have got demosof using Claude Desktop to control
Blender 3D or to control musicsynthesizers or whatever.

(31:15):
So you can actually just type into ClaudeDesktop or use your voice, like in Star Trek,
you can say, “Render a scene ofpeople sitting in a cafe in 1920s Paris.”
and just give it a few minutesand then it will do it, right?
So that’s interesting in andof itself and people can say,
“Okay, I want music. Play jazz. Give mesome jazz from 1920s Paris as well.”
But the real interesting

(31:35):
possibility is having that stuffcentralized like over HTTP
and so Anthropic actually definedanother version of the protocol
that is network aware and that’sover HTTP using service and events.
And that version is,I think, way more interesting
for the most enterprise developers.
It’s also a protocol, so it’s not,strictly speaking, just Anthropic.
You can use anything thatcan speak then, act as an

(31:57):
MCP client, can talk to an MCP service.
So the Spring AI team in the weekthat they announced this MCP protocol,
we built a Java SDK for MCP,
and that code was so goodthat that’s become the official SDK
from Anthropic from themodelcontextprotocol.io project.
So if you download the Java SDKfrom that project, you’re using our code.

Julián (32:21):
Ooh, I’m seeing that right now.

Josh (32:24):
Yeah, and so if you use now Spring AI plus our support for MCP,
what you’re getting is theSpring Boot style auto configuration,
which I just described earlier,in the Spring AI project for MCP,
but it pulls in the core libraries fromthe official MCP project that we donated.
So not only can we support it,but it’s actually one of the best ways

(32:46):
to do it on the planet right now
and it’s one of the easiest, most elegant,most powerful ways to do it.
And it’s also one of the earliest, right?
We were there literally weeks after
we started discussions with Anthropicto donate that code last year.

Julián (32:58):
Amazing. One thing... I’ve been building agentic AI applications recently.
This is what I’ve been studying.
What about agents like React Agents,
tool calling, now a littlebit more advanced AI apps.

Josh (33:17):
The idea behind agentic is that you’re going to let AI control AI.
You let the model direct its own flow,so to speak, in response
to a bigger task, a more ambitious task.
They have so-called one-shot AIwhere you can make a single request
and get a single response.And that’s good enough.
But the real question ishow much better a result can you get

(33:38):
if you let the model refineor iterate or evolve or change,
if you let it try multiple timesand then improve upon things?
So the classic example isyou have one model
that can write some code,and then you have maybe the same model
in a new session, or a different model
looks at the code and says, “Oh, that’spretty good, but maybe improve this.”
And then the model tries again andgenerates with the new changes allowed.

(34:00):
And you keep going like this,and then the resulting code
is actually much better than the thingyou would get if you did one-shot.
So this is a simple example,and maybe it’s a little silly
because most people aren’t generating,
they’re not using AI to generate their owncode unless you’re CoPilot or whatever.
But the idea is very simple.It’s a while loop.
While the model has suggestions,implement the suggestion.
And the same thing for... A very commonexample is I have a request that comes in.

(34:25):
It uses a cheap, very, very fast, verysmall model to do basic categorization.
Is this request for customer service?
Send it that way.
Order? Send it that way.
If it’s for something else,send it this way.
And so you can use an AI modelto look at the text and the request
and do categorization,
and then that can send it to anothermodel that’s more properly trained

(34:45):
or that’s more sophisticated or thatspeaks more languages or whatever,
that might be a little slower,
but you don’t want thecategorization itself to be slow.
So you put that smaller AI model there.
And that’s a content-basedrouter, basically,
from the enterprise integrationworld done in this agentic style.
The point is you cando all this kind of stuff.
There’s two different kindsof patterns these days.

(35:05):
There’s agents and then there’s workflows.
And I think for most people,workflows are actually the better bet.
Workflows are basically, here’sthe ten steps I want you to do,
and I want the output of onestep to be the input of another.
And if you do it in concurrence,if you do it in whatever,
then that’s fine.
That basically, it’s easyto kind of govern.
You kick it off, and you waituntil the response is done.

(35:25):
It can interact with youif it needs to, but basically,
there’s a fixed number of steps.
These other kind of agentsletting AI just take the wheel,
you can do that as well,
but I don’t know that that’sthe safest result for a lot of people.
You should start with a workflows patternand then see if you can make that work
or that it will work, right.
I mean if that works for you,then keep going maybe,
and try the more sort ofambitious, just let it run

(35:48):
autonomously by itselfas opposed to you kicking it off.

Julián (35:51):
Totally agree.
Oh, my God, Josh, amazing.
All this information that we have here.
Definitely you piqued my curiosity.
There are like a bunchof things that I miss
from the Java ecosystem in mycurrent workflow that maybe...

Josh (36:09):
Let’s write some code together.

Julián (36:11):
I might be spending some time.
For people like me orpeople that are just like
coding some curiosityabout the Spring Boot.
Where to start?
Do you have like a veryspecific recommendation for us?

Josh (36:24):
Well, as it happens, I have two videos.
If you go to my YouTube channel.

Julián (36:30):
We will share the link with the audience for sure.

Josh (36:33):
YouTube.com/coffeesoftware, @coffeesoftware.
There’s two videos there.
The two most recent videos...the one that I think people looking
for a video to learnSpring Boot should look at is
the Spring Boot End-to-End Tutorial,new for 2025,
and that was published four weeks ago.
And it’s 2 hours,and it goes through everything.
It starts at basic Spring dependency injection

(36:53):
and it works through AI and security.
And then there’s another videoI did about 30 minutes long,
and it’s more than a month ago.
It’s called MCP, it’s easy as ABC.
This is a hot topic, right?
The Spring Boottutorial has 186,000 views.
The MCP one is 96,000,and that’s all just people going,
okay, I want to learnabout this stuff right now.
Yeah, go check that out, myYouTube channel. It’ll get you started.

(37:16):
And then if you want to learn via text,obviously Spring.io/guides will get you there.
There’s tons of good stuff there as well.

Julián (37:24):
In the episode notes, you’re going to find all the links
to the videos and everythingthat we have shared here.
And last but not least,I kind of have a complaint.

Josh (37:35):
Another one? I can only handle two per year.

Julián (37:37):
[Laughs] Checking your website,
I see there’s a funthing on your about page.
You have 27 differenttranslations of your name,
all of those contributed by the community,but I don’t see a Spanish, why?

Josh (37:54):
Josue. I have Portuguese, which is kind of the same.
Okay, do you wantto send it and I’ll add it?

Julián (38:00):
Of course, representation matters here. [Chuckles]

Josh (38:03):
Yes. I’m sorry. If people send it to me, I add it.
I have no reason to say no, of course.

Julián (38:08):
Of course. Well, I will reply to the thread.

Josh (38:11):
Please.

Julián (38:12):
Josh, thank you very much for sharing
all this amazing content to our audience.
It seems that you are like verypassionate about it and,
I’m infected right now.

Josh (38:24):
Aw, amigo.
That makes me sohappy to hear that, truly.
You and I, I can’t wait to code together,we can teach each other stuff.

Julián (38:32):
We might have some opportunities to do some live
coding in the near future and happyto have you again here in Code(ish).

Josh (38:39):
Yes. Sign me up. I can’t wait.

Julián (38:42):
Of course. Well, thank you so much, and see you in the next one.
Thanks for joining us for thisepisode of the Code(ish) podcast.
Code(ish) is produced by Heroku.
The easiest way to deploy, manage,and scale your applications in the cloud.
If you’d like to learn more aboutCode(ish) or any of Heroku’s podcasts,

(39:03):
please visit Heroku.com/podcasts.
Advertise With Us

Popular Podcasts

New Heights with Jason & Travis Kelce

New Heights with Jason & Travis Kelce

Football’s funniest family duo — Jason Kelce of the Philadelphia Eagles and Travis Kelce of the Kansas City Chiefs — team up to provide next-level access to life in the league as it unfolds. The two brothers and Super Bowl champions drop weekly insights about the weekly slate of games and share their INSIDE perspectives on trending NFL news and sports headlines. They also endlessly rag on each other as brothers do, chat the latest in pop culture and welcome some very popular and well-known friends to chat with them. Check out new episodes every Wednesday. Follow New Heights on the Wondery App, YouTube or wherever you get your podcasts. You can listen to new episodes early and ad-free, and get exclusive content on Wondery+. Join Wondery+ in the Wondery App, Apple Podcasts or Spotify. And join our new membership for a unique fan experience by going to the New Heights YouTube channel now!

Dateline NBC

Dateline NBC

Current and classic episodes, featuring compelling true-crime mysteries, powerful documentaries and in-depth investigations. Follow now to get the latest episodes of Dateline NBC completely free, or subscribe to Dateline Premium for ad-free listening and exclusive bonus content: DatelinePremium.com

On Purpose with Jay Shetty

On Purpose with Jay Shetty

I’m Jay Shetty host of On Purpose the worlds #1 Mental Health podcast and I’m so grateful you found us. I started this podcast 5 years ago to invite you into conversations and workshops that are designed to help make you happier, healthier and more healed. I believe that when you (yes you) feel seen, heard and understood you’re able to deal with relationship struggles, work challenges and life’s ups and downs with more ease and grace. I interview experts, celebrities, thought leaders and athletes so that we can grow our mindset, build better habits and uncover a side of them we’ve never seen before. New episodes every Monday and Friday. Your support means the world to me and I don’t take it for granted — click the follow button and leave a review to help us spread the love with On Purpose. I can’t wait for you to listen to your first or 500th episode!

Music, radio and podcasts, all free. Listen online or download the iHeart App.

Connect

© 2025 iHeartMedia, Inc.