Bean加载控制

Controller加载控制与业务bean加载控制

  • SpringMVC相关bean(表现层bean)

  • Spring控制的bean

    • 业务bean(service)
    • 功能bean(DataSource等)

因为功能不同,如何避免Spring错误的加载到SpringMVC的bean?

加载Spring控制的bean的时候排除掉SpringMVC控制的bean

  • SpringMVC相关bean加载控制

    • SpringMVC加载的bean对应的包均在com.xxx.controller包内
  • Spring相关bean加载控制

  • 方式一:Spring加载的bean设定扫描范围为com.xxx,排除掉controller包内的bean

  • 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等

  • 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中

方式一

@Configuration
@ComponentScan({"com.xxx.service", "com.xxx.dao"})
public class SpringConfig {

}

方式二

@Configuration
@ComponentScan(value = "com.xxx",
    excludeFilters = @ComponentScan.Filter(
        type = FilterType.ANNOTATION,
        classes = Controller.class
    )
)
public class SpringConfig {

}
//@Configuration // 会被 SpringConfig 中的 ComponentScan 扫描到
@ComponentScan("com.xxx.controller")
public class SpringMvcConfig {

}

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }

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

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigclasses() {
        return new Class[]{SpringConfig.class};
    }

    protected Class<?>[] getServletConfigclasses() {
        return new class[]{SpringMvcConfig.class};
    }

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