Spooner was selected fifth overall in the 2008 OHL Bantam Draft by the Peterborough Petes. In his third season with the Petes, on November 11, 2010, Spooner was traded to the Kingston Frontenacs in exchange for Alan Quine, Clark Seymour, a 2011 second-round draft pick and a 2013 second-round draft pick. On January 5, 2012, Spooner was then traded by the Frontenacs to the Sarnia Sting for Ryan Kujawinski.
Professional
Boston Bruins
As a rookie, Spooner led the Providence Bruins of the American Hockey League, the Boston Bruins' top minor league affiliate, in points, scoring 57 points in 59 games. Spooner made his NHL debut for Boston on February 6, 2013, against the Montreal Canadiens. Spooner was called up to the Bruins for the first time in the 2013–14 season on October 31, 2013. Playing against the Anaheim Ducks, Spooner assisted on a Carl Söderberg goal to record his first NHL point. Spooner scored his first career NHL goal on February 27, 2015, in overtime to beat the New Jersey Devils 3–2 in a Boston road victory. Spooner's first goal in regulation time came as the first Boston goal in a 3–1 road defeat of the Ottawa Senators on March 10, 2015, with Spooner also scoring a second goal in the same game. On July 1, 2015 the Boston Bruins re-signed Spooner to a two-year, $1.9 million contract worth $950,000 annually. On July 26, 2017, Spooner and the Bruins avoided arbitration by agreeing to a one-year contract worth $2.825 million. In 2018, Spooner scored his 100th NHL career assist on February 11, assisting on defenceman Torey Krug's second period goal during a 5–3 victory over the New Jersey Devils.
New York Rangers
On February 25 Spooner along with: Matt Beleskey, Ryan Lindgren, a 2018 first-round pick and a 2019 seventh-round pick were traded to the New York Rangers in exchange for Rick Nash. On July 31, 2018, as a restricted free agent Spooner signed to a two-year deal with the Rangers.
Edmonton Oilers
Spooner struggled to replicate his initial success with the Rangers to begin the 2018–19 season, posting 2 points in 16 games before he was traded to the Edmonton Oilers in exchange for Ryan Strome on November 16, 2018. His offensive woes continued with the Oilers, registering just 2 goals in 24 games before he was placed on waivers by the Oilers on January 21, 2019. After clearing waivers, Spooner was later re-assigned to affiliate, the Bakersfield Condors, on January 23, marking his first return to the AHL since 2015.
Vancouver Canucks
Spooner played in 7 games with the streaking Condors, posting 6 points, before he was traded by the Edmonton Oilers to the Vancouver Canucks in exchange for Sam Gagner on February 16, 2019. Remaining on the NHL roster, Spooner played out the remainder of the season registering 4 assists in 11 games for the Canucks. With the Canucks in need of salary cap relief, Spooner was placed on unconditional waivers and bought out from the remaining year on his contract on June 30, 2019.
Europe
As a free agent, Spooner opted to pause his NHL career, agreeing to a one-year European contract with Swiss club, HC Lugano of the NL on July 17, 2019. Spooner was a healthy scratch for most of the beginning of the season, appearing in only 2 games through Lugano's first 14 regular season games. With no intention from the coaching staff to reinsert Spooner in the lineup, he joined HC Dinamo Minsk of the Kontinental Hockey League on October 21, 2019.