如何在@Configuration类中自动装配Spring注释的服务类?

Raz*_*een 5 java spring-boot

我正在尝试将一个服务注释类注入Spring Boot应用程序中的配置类,但它没有被注入(设置为null),我认为这是由于Spring生命周期.

此外,这个服务有一个使用构造函数注入的重载构造函数,我想这也是一个问题,因为自动装配作用于默认构造函数.但是,该服务需要进行Spring配置,因此我不认为可以在Bean注释方法中创建新实例.

怎么解决这个问题?

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private SessionService sessionService;

    @Bean
    public SessionService sessionService() {
        return sessionService;
    }
}

public interface SessionService extends BaseCacheService<Session> {
    void extendExpiration(String key);

    String getSessionId(String key);
}

@Service
public class SessionServiceImpl implements SessionService {

    private Environment environment;
    private UserService userService;

    @Autowired
    public SessionServiceImpl(Environment environment, UserService userService) {
      this.environment = environment;
      this.userService = userService;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我排除@Bean方法,那么我得到一个编译错误: 如果找不到bean,则自动发送编译错误

ale*_*xbt 9

您的错误如下(您返回一个空值):

@Bean
public SessionService sessionService() {
    return sessionService;
}
Run Code Online (Sandbox Code Playgroud)

  1. 由于您SessionServiceImpl的注释是@Service,您可以删除该@Bean方法,让spring创建它.Spring已经为您提供了它.

  2. 或者,如果您SessionServiceImpl没有注释@Service,则需要以下内容:

@Bean
public SessionService sessionService() {
   return new SessionService();
}
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,可能只是因为你SessionServiceImpl的包裹没有被弹簧扫描(正如@MilošMilivojević所建议的那样)

您可以添加@ComponentScan到Configuration类

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
@ComponentScan("com.package.to.sessionServiceImpl-or-higher")
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
Run Code Online (Sandbox Code Playgroud)