java - Spring Boot - Spring security @ComponentScan 或 @Import

标签 java spring spring-mvc spring-boot spring-security

我使用 Spring Initializr 生成了一个 Spring Boot Web 应用程序,使用嵌入式 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);
    }
}

我想知道其中的区别,因为对我来说,有两种不同的方法可以做完全相同的事情

最佳答案

这是@Import的解释和 @ComponentScan ,这不是您问题的答案(因为我不知道为什么它不能与 ComponentScan 一起使用),更像是一个提示。

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

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

@Import({config.Class}) // import Bean for ClassA

@ComponentScan扫描所有用@Component@Service@Repository注释的类,并将一对一的bean映射到每个类。 例如

@Component
public class ClassB {}

@ComponentScan // import Bean ClassB

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

我唯一不太明白的是 @Import 是如何实现的触发SecurityConfig中代码的执行,有知道的请评论。

关于java - Spring Boot - Spring security @ComponentScan 或 @Import,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42606002/

相关文章:

java - 如何使用类路径通过 Liquibase 回滚数据库更改

java - 单元测试错误 : java. util.NoSuchElementException : No value present at java. util.Optional.get

java - 在线程安全的 Spring Controller 中查找队列中有多少请求

java - 为什么Spring Boot无法解析带有+符号的 View ?

java - 在/具有重叠路由(例如/api/search)提供Java Spark静态文件

java - 从字符串中提取所有表情符号的正则表达式是什么?

java - 无法为 Java 应用程序安装 SSL 证书

java - 需要正则表达式来验证自定义输入

javascript - 我需要获取 JSON 响应的内部内容

spring - 如何在没有 spring-boot 的情况下在 spring-webflux 中加载配置?