The Rossoneri were three goals to the good at the interval and added one more late on, making it back-to-back defeats for their opponents on their Asian tour.
While the scoreline is not that important at this stage in the summer programme, Bayern boss Carlo Ancelotti will no doubt be concerned by his side's profligacy in front of goal for a second match running, which came back to haunt them against a no-nonsense Milan side.
In complete contrast to both teams' opening matches, when Bayern were on top in the first half against Arsenal and Milan were outplayed by Borussia Dortmund, it was the Italian side who dictated play from the off.
Mateo Musacchio had an on-target header kept out inside the opening 90 seconds of the match, but it was another summer signing who was making the telling difference.
Ricardo Rodriguez, who joined from Wolfsburg in a £15m deal, exchanged passes with M'Baye Niang down the left before picking out Franck Kessie on the penalty spot, with the youngster blasting the ball past an unprepared Juan Bernat on the line.
Milan were continuing to see plenty of the ball and, with a little over a quarter of the match played, had themselves a second when Rodriguez this time swung in a free kick for Patrick Cutrone to brilliantly nod past Christian Fruchtl.
The Bavarian outfit finally started to assert themselves a little more in the closing stages of the first half, seeing a Robert Lewandowski shot drift narrowly wide, before Franck Ribery's slalom run into the box ended with Lewandowski somehow failing to connect with the ball from a few yards out when it was worked to him.
Moments later Milan had a killer third as Niang led a counter and picked out Giacomo Bonaventura, who in turn spotted young striker Cutrone for his second senior goal in Rossoneri colours.
Bundesliga champions Bayern improved in the second half without managing to get themselves on the scoresheet, testing Gianluigi Donnarumma for the first time 58 minutes in through a Thomas Muller drive.
Niang then brought a save out of Fruchtl at the other end, doing well to cut inside and send a shot down the middle in what was one of his final acts before being withdrawn.
Bayern certainly had the chances to find a route back into the match yet Corentin Tolisso and Muller failed to take them, the latter picking out the side-netting and his teammate opting to pass rather than shoot when one-on-one.
Those misses would come back to haunt them as, with five minutes of the game left to play, Hakan Calhanoglu was given time and space to pick out the bottom corner from 20 yards out in trademark fashion.