Spring JDBCTemplate. Excepción de puntero nul

Estoy tratando de configurar un sitio web SpringMVC desde cero, pero he llegado a un callejón sin salida.

Estoy usando el cableado automático para instanciar JdbcTemplate con un DataSource, pero de alguna manera obtengo una excepción de puntero nulo. Agradecería su ayuda con esto.

Mi AppConfig es el siguiente:

@Configuration
@ComponentScan
public class AppConfig {
    @Bean
    public DriverManagerDataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/onlinelibrary");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
    /*Deleted this code, still doesn't work
    @Bean
    public Book Book() {
        return new Book();
    }
    */
}

Mi clase de libro es la siguiente:

@Component
public class Book {
    private JdbcTemplate jdbcTemplate;
    private String title;
    private String author;
    private String isbn;

    public Book() {

    }

    @Autowired
    public Book(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public ModelMap getBooks() {
        ModelMap model = new ModelMap();
        String sql = "SELECT * FROM Books";
        model.put("data", jdbcTemplate.queryForList(sql));
        return model;
    }
}

Y esta es la infame excepción de puntero nulo:

Cualquier ayuda sería muy apreciada. Probablemente olvidé hacer algo, pero no puedo resolverlo yo mismo, y tampoco puedo encontrar nada en StackOverflow que me ayude (aunque ya he leído muchos artículos).

ACTUALIZAR CON MÁS DATOS:

Mi estructura de proyecto es la siguiente:

Y estoy usando el objeto Libro en este controlador:

@Controller
public class BookController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String getBookData(Book book, ModelMap model) {
        model.put("data", book.getBooks());
        return "BookView";
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta