Java Spring启动-Spring安全@ComponentScan或@Import

Java Spring启动-Spring安全@ComponentScan或@Import,java,spring,spring-mvc,spring-boot,spring-security,Java,Spring,Spring Mvc,Spring Boot,Spring Security,我已经使用SpringInitializer生成了一个SpringBootWeb应用程序,使用嵌入式Tomcat+Thymeleaf模板引擎,并将其打包为一个可执行的JAR文件 使用的技术: Spring Boot 1.4.2.RELEASE、Spring 4.3.4.RELEASE、Thymeleaf 2.1.5.RELEASE、Tomcat Embed 8.5.6、Maven 3、Java 8 我有这个保安课 com.tdk.config /** * @author nunito *

我已经使用SpringInitializer生成了一个SpringBootWeb应用程序,使用嵌入式Tomcat+Thymeleaf模板引擎,并将其打包为一个可执行的JAR文件

使用的技术:

Spring Boot 1.4.2.RELEASE、Spring 4.3.4.RELEASE、Thymeleaf 2.1.5.RELEASE、Tomcat Embed 8.5.6、Maven 3、Java 8

我有这个保安课

com.tdk.config

/**
 * @author  nunito
 * @version 1.0
 * @since  4 mar. 2017
 */
@Configuration
@EnableWebSecurity
@PropertySource("classpath:/com/tdk/config/app-${APP-KEY}.properties")
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    protected String loginPage = "/tdk/login";

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .formLogin()
                .loginPage(getLoginPage() )
                .permitAll()
                .and()
            .authorizeRequests()
                .antMatchers("/mockup/**").permitAll()
                .antMatchers("/welcome/**").authenticated()
                .and()
            .logout()
                .permitAll()
                .logoutSuccessUrl("/index.html");


    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .passwordEncoder(new StandardPasswordEncoder())
                .withUser("nunito").password("08c461ad70fce6c74e12745931085508ccb2090f2eae3707f6b62089c634ddd2636f380f40109dfb").roles("ADMIN").and()
                .withUser("nunito").password("4cfbf05e4493d17125c547fdba494033d7aceee9310f253f3e96c4f928333d2436d669d63a84fe4f").roles("ADMIN");
    }

    public String getLoginPage() {
        return loginPage;
    }

    public void setLoginPage(String loginPage) {
        this.loginPage = loginPage;
    }
使用此配置文件

@SpringBootApplication
@ComponentScan(basePackages = "com.tdk.config")
@EnableAutoConfiguration
public class TdkCloudApplication {

    public static void main(String[] args) {
        SpringApplication.run(TdkCloudApplication.class, args);
    }
}
我在URL中访问的任何地方都有404

但这一切都很好

@SpringBootApplication
@EnableAutoConfiguration
@Import({SecurityConfig.class})
public class TdkCloudApplication {

    public static void main(String[] args) {
        SpringApplication.run(TdkCloudApplication.class, args);
    }
}
我想知道其中的区别,因为对我来说,有两种不同的方法可以做完全相同的事情。我想这是一种解释,而不是对你的问题的回答(因为我不知道为什么它不能与ComponentScan一起工作),更像是一个提示

用于导入其他配置,因此如果用
@Configuration
注释类,并且在其中定义了一些bean,则它们将被导入到应用程序上下文中,例如

@Configuration
public class config{
    @Bean
    public ClassA a(){
        return new ClassA();
    }
}

@Import({config.Class}) // import Bean for ClassA
扫描用
@Component
@Service
@Repository
注释的所有类,并将一对一bean映射到每个类。 e、 g

在Spring 4.2版之后,还可以作为组件扫描
@Configuration
。因此,在您的情况下,SecurityConfig也应该作为组件而不是配置导入到上下文中


我唯一不太明白的是,如何触发SecurityConfig中代码的执行,如果有人知道,请给出评论。

很抱歉回复太晚。但它可能会帮助某些人。 问题中不存在“TdkCloudApplication”包。我假设它位于与“com.tdk.config”不同的包中。 如果是这种情况,那么在@ComponentScan()注释中,必须给出TdkCloudApplication的包和“SecurityConfig”的包

像这样。 @ComponentScan(basePackages={“com.tdk.config”,“TdkCloudApplication的packageName”})


这是因为@SpringBootApplication。默认情况下,它将扫描该包及其子包中的bean。但是如果我们用@ComponentScan注释这个类,那么我们必须提供我们需要的所有包,这样spring将检查所有这些区域。

你能尝试删除“@EnableWebSecurity”吗,因为它禁用spring boot自动配置,也不需要“@ComponentScan”,因为spring boot会扫描所有子包,对于不需要的“@EnableAutoConfiguration”也是一样的
@springboot应用程序也是
@Configuration
(),所以这可能就是
@Import
起作用的原因。请在代码周围添加^^
@Component
public class ClassB {}

@ComponentScan // import Bean ClassB