代码之家  ›  专栏  ›  技术社区  ›  johnlinp

在上下文配置中,@ComponentScan和@Bean有什么区别?

  •  1
  • johnlinp  · 技术社区  · 6 年前

    1. @Bean 在配置类中。
    2. @ComponentScan

    我原以为这两种方法在结果springbean方面没有区别。

    // UserInfoService.java
    
    public interface UserInfoService
    {
        @PreAuthorize("isAuthenticated()")
        String getUserInfo ();
    }
    
    // UserInfoServiceTest.java
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextHierarchy({
            @ContextConfiguration(classes = TestSecurityContext.class),
            @ContextConfiguration(classes = UserInfoServiceTest.Config.class)
    })
    public class UserInfoServiceTest
    {
        @Configuration
        public static class Config
        {
            @Bean
            public UserInfoService userInfoService ()
            {
                return new UserInfoServiceImpl();
            }
        }
    
        @Autowired
        private UserInfoService userInfoService;
    
        @Test
        public void testGetUserInfoWithoutUser ()
        {
            assertThatThrownBy(() -> userInfoService.getUserInfo())
                    .isInstanceOf(AuthenticationCredentialsNotFoundException.class);
        }
    
        @Test
        @WithMockUser
        public void testGetUserInfoWithUser ()
        {
            String userInfo = userInfoService.getUserInfo();
            assertThat(userInfo).isEqualTo("info about user");
        }
    

    上面的代码是为了测试服务中的安全注释 UserInfoService . 但是,它将在上失败 testGetUserInfoWithoutUser() . 原因是豆子 userInfoService userInfoService.getUserInfo() @PreAuthorize("isAuthenticated()") .

    注释 @组件扫描 用户信息服务 将得到代理和呼叫 userInfoService.getUserInfo() 将被 @PreAuthorize 注释。

    @豆子 @组件扫描

    另外,完整的例子是 here 上面提到的修正是 here

    0 回复  |  直到 6 年前
        1
  •  3
  •   Ken Chan    6 年前

    是因为 @ContextHierarchy TestSecurityContext 定义父上下文的bean配置 UserInfoServiceTest.Config 为子上下文定义。

    @ComponentScan ,安全相关的bean是在父上下文中定义的,父上下文对 UserInfoService bean,因此它不会被Spring安全性代理。

    另一方面,如果你定义 @组件扫描 UserInfoServiceTest.Config文件 ,它还将扫描所有 @Configuration 从包含 也在这个包中,因此它会被扫描,并且还为子上下文配置了与安全相关的bean。 用户信息服务

    @ContextConfiguration :

    @ContextConfiguration(classes= {TestSecurityContext.class,UserInfoServiceTest.Config.class})
    public class UserInfoServiceTest {
    
        public static class Config {
            @Bean
            public UserInfoService userInfoService() {
                return new UserInfoServiceImpl();
            }
        }
    }