为什么Spring只在控制器中使用自动装配的bean

时间:2014-06-24 01:38:32

标签: java spring spring-mvc

由Spring实现的我的Web应用程序只能在控制器中使用@autowire bean,而不能使用服务。我从Spring文档(第4.9节)中找到以下描述,但它没有给出答案。

仅查找在定义它的同一应用程序上下文中的bean上的注释。这意味着,如果您为DispatcherServlet放入WebApplicationContext,它只检查控制器中的@Autowired bean,而不检查您的服务。有关更多信息,请参见第16.2节“DispatcherServlet”。

在第16.2节中,既没有解释也没有。谁能帮我?我的代码如下所示。

在配置包中,有3个类

public class Webapp extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{PersistConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{ WebMvcConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{ "/" };
    }
}

@Configuration
public class PersistConfig {

    @Bean
    public JdbcTemplate jdbcTemplateRepository() {
        SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
        dataSource.setDriverClass(com.mysql.jdbc.Driver.class);
        dataSource.setUrl("jdbc:mysql://localhost:3306/categorybags_db");
        dataSource.setUsername("root");
        dataSource.setPassword("");

        return new JdbcTemplate(dataSource);
    }

}


@ComponentScan({"web.controller", "persistence.services"})
@EnableWebMvc
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/res/**").addResourceLocations("/res/");
    }

    @Bean
    public ViewResolver viewResolver() {
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
        templateResolver.setCacheable(false);
        templateResolver.setPrefix("/WEB-INF/jsp/");
        templateResolver.setSuffix(".jsp");
        templateResolver.setTemplateMode("HTML5");

        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);

        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setCharacterEncoding("UTF-8");
        viewResolver.setOrder(1);
        viewResolver.setTemplateEngine(templateEngine);

        return viewResolver;
    }

}

在包persistence.services中,只有我想要自动装入JdbcTemplate的类DBServices获取null,但是在控制器jdbcTemplate中使用相同的语句不是null。

@Repository
@Configurable
public class DBServices {

    @Autowired JdbcTemplate jdbcTemplate;
        //some code here
}

1 个答案:

答案 0 :(得分:0)

可能问题出在您的配置中。

检查您的bean定义文件并搜索<context:component-scan base-package="your.package" />标记。

您需要指定放置某种@Component@Controller @Service@Repository的所有套餐。