Agree with Paul here.
A 301 is a directive to the crawler, while a canonical tag is only a hint and is not always followed. Bing for one will ignore canonical tags if it believes they are misused.
as for the mention of "multiple 301 redirect" .
You do not need to have a 301 redirect for every url, just follow the logic
if HTTP_Host is not myPreferredDomain then redirect to myPreferredDomain