Caratteristiche tecniche Centrocampista duttile, esibiva una notevole mobilità in vari settori difensivi ed offensivi. Ricopriva generalmente la posizione di mezzala, ma poteva agire anche da ala sinistra o trequartista. Dotato di ottima tecnica individuale e buona velocità, era abile nel dribbling, nel colpo di testa ed era anche un buon tiratore dalla distanza e di calci piazzati. Era inoltre solito utilizzare il piede sinistro grazie al quale riesce ad effettuare ottimi tiri nonostante sia un destro naturale.

Carriera Club Esordio con l'Atalanta e successivi prestiti Nasce calcisticamente alla Virtus Castelvecchio e, dopo aver militato nei settori giovanili della San Francesco '93 di Cingoli e della Settempeda fino ai Giovanissimi, si trasferisce al Tolentino; qui viene notato da Antonio Bongiorni, osservatore dell'Atalanta e direttore sportivo della Polisportiva Margine Coperta di Massa e Cozzile (PT), società-satellite degli orobici in Toscana, che lo tessera. Viene poi chiamato da Mino Favini, responsabile del settore giovanile nerazzurro, che lo porta direttamente nella sede di Zingonia, il "Centro Bortolotti".

Debutta in Serie A il 4 maggio 2008, nel corso della partita Atalanta- (3-2), che sarà anche l'unica apparizione stagionale.

La stagione successiva lo vede aggregato in pianta stabile con la prima squadra, e dopo una presenza la società opta per un prestito nelle categorie inferiori durante il mercato di riparazione invernale. Viene quindi ceduto in prestito al Pergocrema, società di Prima Divisione. Il 18 gennaio 2009 fa il suo esordio nella categoria, siglando la rete del provvisorio pareggio, nel corso della partita contro la , incontro che terminerà con il punteggio di 2-1 in favore dei padroni di casa; si tratta del suo primo gol fra i professionisti. Nella squadra cremasca è titolare, ma è costretto a fermarsi dopo poche partite a causa di un infortunio che comprometterà gran parte della stagione.

Nel corso dell'estate 2009 fa ritorno a Bergamo, dove non riesce a ritagliarsi spazi nella formazione titolare: nella sessione invernale del calciomercato viene quindi ceduto in prestito al Padova. Il 20 febbraio 2010 debutta con i biancoscudati nella partita -Padova (2-2). Alla fine del primo anno ottiene la salvezza in Serie B, dopo i play-out contro la , nei quali segna anche un gol.

Ritorno all'Atalanta

Il 23 giugno 2010 il Padova comunica di non aver esercitato il diritto di opzione sul cartellino di Bonaventura che ritorna quindi all'Atalanta. Il 16 luglio seguente rinnova il contratto con la società bergamasca fino al 2015. Disputa la stagione nell'inedito ruolo di esterno di centrocampo (sia destro che sinistro), venendo impiegato anche qualche volta come trequartista alle spalle degli attaccanti. Segna il suo primo gol con la maglia nerazzurra il 9 novembre contro il (1-0). Bonaventura va a segno in altre otto circostanze, risultando essere l'uomo più decisivo della stagione atalantina, portando alla causa nerazzurra 18 punti. Conclude la stagione con 33 presenze (31 in campionato e 2 in Coppa Italia) condite da 9 gol e con la vittoria del campionato cadetto.

L'11 aprile 2012 segna il suo primo gol in Serie A nella vittoria esterna della sua squadra contro il . Si ripete tre giornate dopo, il 29 aprile, realizzando la rete del 2-0 chiudendo la sfida casalinga contro la Fiorentina (2-0) che vale la salvezza per l'Atalanta con tre giornate d'anticipo. La sua prima stagione da titolare in Serie A si chiude con 2 reti in 29 partite.

Nella stagione 2012-2013 ormai è uno dei punti fermi della formazione lombarda, tanto da risultare il secondo miglior marcatore dietro a Germán Denis. La sua prima doppietta in carriera in Serie A è datata 3 marzo 2013, quando fissa il risultato nella partita Siena-Atalanta (0-2) della 27ª giornata. Al termine della stagione, conclusasi con una nuova salvezza per la Dea, Bonaventura ha realizzato 8 reti in 36 partite, di cui uno in una gara di Coppa Italia.

La stagione 2013-2014 si rivela essere per lui l'ultima tra le file della Dea, che termina la stagione con la terza salvezza consecutiva, con Bonaventura che realizza 5 reti in 31 partite di Serie A. Conclude quindi la sua esperienza in neroazzurro dopo otto anni (inclusi quelli trascorsi in prestito e nelle giovanili), durante i quali ha messo a segno 24 reti in 135 partite considerando Serie A, Serie B e Coppa Italia.

Milan Nell'estate 2014, durante le ultime ore di mercato, viene acquistato dal per 7 milioni di euro. Il direttore sportivo del club lombardo Adriano Galliani decise di puntare su Bonaventura dopo che saltò la trattativa per Jonathan Biabiany. Va in gol con i rossoneri già al debutto, il 14 settembre 2014, segnando nella vittoria esterna contro il Parma (4-5). Esordisce in Coppa Italia con il Milan il 13 gennaio 2015, nella vittoria casalinga contro il (2-1) che vale ai rossoneri il passaggio del turno ai quarti di finale. Nell'ultima giornata di campionato realizza la sua prima doppietta, decisiva per il successo (3-1) contro la sua squadra precedente, l'Atalanta. Il giocatore, autore di 7 reti in 34 presenze complessive, risulta una delle poche note liete per la formazione, incappata in una stagione deludente che si chiude con la mancata partecipazione alle coppe continentali.

Nella stagione 2015-2016 totalizza 7 reti e 8 assist in 39 presenze tra tutte le competizioni con i rossoneri, piazzatisi settimi in classifica e, pertanto, ancora esclusi dall'Europa. Il 1º dicembre 2015, nella gara casalinga contro il Crotone (3-1) valida per gli ottavi di finale di Coppa Italia, sigla il primo gol in questa competizione con la maglia rossonera. Con il Milan, il 22 maggio 2016, raggiunge la finale di coppa nazionale, la prima della sua carriera, gara persa 1-0 contro la Juventus e che Bonaventura ha disputato per intero.

Nella stagione successiva, a seguito del ritiro di Mexès, cambia numero di maglia, passando dalla 28 alla 5. Il 23 dicembre 2016 si aggiudica la Supercoppa italiana, con il Milan che batte ai rigori proprio i bianconeri: Bonaventura segna il gol del pareggio, trasformando anche un rigore della sequenza finale. La sua annata termina in anticipo, a causa di un infortunio alla coscia riportato nella gara con l' a fine gennaio nella quale sigla l'unica rete del Milan. Ritorna in prima squadra il 28 maggio per l'ultima gara della stagione persa contro il (2-1), senza però riuscire ad entrare a partita in corso. Conclude la sua terza stagione con il Milan con 5 reti siglate in 22 partite in tutte le competizioni.

Il 27 luglio 2017 esordisce nelle manifestazioni continentali, giocando contro il in Europa League; la settimana seguente trova il primo gol in campo internazionale, andando a segno nel 2-0 del ritorno. Il successivo 20 settembre, in occasione dell'incontro contro la , viene premiato per la centesima presenza in rossonero. Il 21 gennaio 2018, nella trasferta vinta per 2-1 in casa del Cagliari, raggiunge quota 200 partite in Serie A. Il 28 febbraio, nella semifinale di ritorno di Coppa Italia, sigla uno dei rigori che consentono al Milan di disputare la finale del 9 maggio seguente contro la Juventus. Nell'atto conclusivo della competizione i rossoneri sono usciti sconfitti per 4-0, con Bonaventura che ha giocato la partita per intero. Al termine di una deludente annata per i rossoneri, Bonaventura si rivela essere uno degli elementi migliori della squadra, concludendo la stagione come terzo miglior marcatore con 9 reti in 47 incontri complessivamente (di cui 8 in 33 presenze in Serie A).

Il 7 ottobre 2018, nella gara casalinga vinta per 3-1 contro , conquista il traguardo delle 150 partite con il Milan in tutte le competizioni. Dopo un ottimo inizio di stagione, il 27 ottobre subisce una lesione al ginocchio sinistro, che lo vede costretto a sottoporsi a un'operazione chirurgica pochi giorni dopo. Pertanto conclude anticipatamente la sua quinta stagione con i rossoneri, totalizzando 3 gol in 10 presenze complessive.

Torna a pieno regime nella stagione 2019-2020, caratterizzata dall'avvicendamento in panchina tra Marco Giampaolo e Stefano Pioli. Il 22 giugno raggiunge le 150 partite in Serie A in maglia rossonera nella partita vinta in casa del per 4-1, gara nella quale trova anche il gol del momentaneo 2-1. Non venendo rinnovato il suo contratto in scadenza, disputa la sua ultima partita con i rossoneri il 1º agosto 2020, subentrando a Rafael Leão al 38' del primo tempo dell'ultima partita di campionato vinta in casa contro il Cagliari (3-0), gara nella quale ha anche servito l'assist del terzo gol a Samu Castillejo. Ottiene 29 presenze e 3 reti nel campionato che il Milan chiude al 6º posto. Complessivamente, in sei anni al Milan, ha disputato 184 partite segnando 35 reti in tutte le competizioni ed ha conquistato una Supercoppa italiana nel 2016.

Fiorentina Dopo essersi svincolato dal Milan, il 10 settembre 2020 viene ingaggiato dalla . Realizza la sua prima rete con i viola il 23 gennaio 2021 nel successo per 2-1 contro il . In chiusura di stagione va a segno altre due volte, nelle trasferte contro Sassuolo e Bologna, aiutando la squadra a centrare la salvezza in anticipo. Tre reti in 34 presenze sono lo score della sua prima stagione a Firenze.

Nella stagione seguente, continua a giocare regolarmente da titolare, fornendo ottime prove, tanto da raggiungere il rinnovo automatico del contratto fino al 2023. Chiude il girone d'andata andando a segno due volte, contro Genoa e . Nel girone di ritorno segna ancora contro il Genoa, mentre un infortunio rimediato nel mese di marzo contro il Bologna lo costringe a uno stop di circa un mese. Tornato in campo il 27 aprile nella sconfitta casalinga contro l'Udinese, risulta decisivo per la qualificazione europea realizzando il definitivo 2-0 contro la Roma nella partita del 9 maggio giocata al Franchi. Termina l'anno con 4 gol e 9 assist in 35 presenze, Coppa Italia compresa.

Confermato da titolare anche per l'annata 2022-2023, segna il primo gol stagionale della Fiorentina aprendo le marcature nella prima giornata di campionato contro la Cremonese. Si ripete, risultando sempre decisivo, tra il 6 il 9 novembre, andando in rete rispettivamente contro Sampdoria e Salernitana. In virtù del suo ruolo sempre più importante nel gioco del tecnico Italiano, nel gennaio del 2023 Bonaventura rinnova il proprio contratto con la Fiorentina fino al 2024, con un'opzione per un'ulteriore stagione. Il 23 febbraio 2023, il centrocampista serve tutti e tre gli assist decisivi (rispettivamente, a Mandragora, Saponara e Cabral) della vittoria per 3-2 dei viola sul , nella gara di ritorno dei play-off di Conference League, successo che consente loro di qualificarsi per gli ottavi di finale. Il 1º aprile la sua rete permette ai viola di vincere a San Siro contro l'Inter, mentre nella gara di andata dei quarti di finale di Conference League contro il Lech Poznan realizza il primo gol internazionale in maglia viola. Nella finale di Conference League disputata il 7 giugno a Praga contro il West Ham, realizza il gol del pareggio dopo il vantaggio dei londinesi, ma la gara viene persa per 2-1.

Il 12 novembre 2023, segnando contro il Bologna il momentaneo gol dell'1-0, raggiunge il traguardo delle 100 partecipazioni a reti in Serie A (61 reti e 39 assist). Mette a referto otto reti lungo tutto il campionato. A fine stagione, lascia la Fiorentina alla scadenza naturale del proprio contratto, dopo aver messo insieme 162 presenze, 22 gol e 22 assist in quattro annate con il club viola.

Al-Shabab e ritiro Il 5 agosto 2024, passa a parametro zero all', squadra della Saudi Professional League, con cui sottoscrive un contratto annuale, con opzione per un'altra stagione.

Il 5 marzo 2026, tramite un post sul suo profilo Instagram, annuncia il suo ritiro dal calcio giocato, all'età di 36 anni e 195 giorni.

Nazionale

Nazionali giovanili