Button's two-stop strategy proved decisive as he became the ninth straight winner from pole position at the Circuit de Catalunya, even after Barrichello overtook him out of the start.
"I crossed the line first and this is a race where I didn't really think I was going to," Button said.
Barrichello's extra pit stop allowed Button to make up the difference, and the Briton won by 13 seconds to extend his championship lead over his teammate to 14 points after five races.
"I had the race in my hands and I was quite surprised when they told me they were switching Jenson to two [stops]," Barrichello said. "I would like to understand why they changed that."
Webber overtook Vettel in the closing laps for his second top-three finish of the season after Vettel had finally passed Felipe Massa with four laps remaining following a battle between the two drivers throughout the 66-lap race.
Massa would eventually finish sixth -- behind Renault's Fernando Alonso -- as Ferrari remained without a podium finish for its longest opening period of a season since 1993.
BMW Sauber's Nick Heidfeld was seventh, while Nico Rosberg of Williams picked up the final point in eighth place. Defending champion Lewis Hamilton of McLaren finished ninth, while teammate Heikki Kovalainen retired after 10 laps because of a mechanical problem.
Button leads with 41 points, Barrichello has 27 and Vettel 23.
Button is off to the most dominating start to a season since Michael Schumacher won the last of his seven titles for Ferrari five years ago.
"It gives me a lot of confidence for the rest of the season," Button said. "Even when times are tough, we've been able to get the wins. I feel on top of the world."
But it didn't look so certain early on.
Barrichello overtook Button on the outside to hit the lead, while Massa applied a boost of KERS to pass Vettel down the long straight into the first corner to sit third.
"I had a great start and went to the lead, I was running a tiny bit quicker than Jenson to begin with," Barrichello said. "Then they changed the strategy and I had to keep on pushing."
The safety car was then deployed for several laps as the field dropped to 16 after separate incidents involving four cars.
Toyota's Jarno Trulli drifted back onto the track after being nudged only for Force India's Adrian Sutil to collide with him. Behind them, Sebastien Bourdais went over the top of teammate Sebastien Buemi as he braked, leaving Toro Rosso without a car.
Ferarri's Kimi Raikkonen retired with a mechanical failure as the first round of pit stops began. Barrichello stretched his lead over Button to nearly eight seconds after all the leaders had visited the pits.
But Barrichello's second stop -- with 35 laps remaining -- saw him return fourth behind Vettel, with Button opening up some distance before his second pit with 19 laps left.
Button was in front for good with 16 laps remaining when Barrichello, who played second fiddle to Schumacher at Ferrari for many years, pitted for the last time three laps later.
"My third set of tires was not good ... I couldn't keep my pace up," Barrichello said. "From there on it was a struggle, a big struggle to keep the car on the track. I then had to go flat-out. And I did, but I couldn't do anything better."
Heidfeld finished his 33rd straight race. The German's last retirement was at Indianapolis in 2007.
The next stop on the calendar is the Monaco GP.