gpt4 book ai didi

java - 如何在 @Configuration 类中 Autowiring Spring 注释的服务类?

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:27 24 4
gpt4 key购买 nike

我正在尝试将服务注释类注入(inject)到 Spring Boot 应用程序的配置类中,但它没有被注入(inject)(设置为 null),我认为这是由于 Spring lifeycle。

此外,此服务有一个使用构造函数注入(inject)的重载构造函数,我想这也是一个问题,因为 Autowiring 作用于默认构造函数。但是,该服务需要由 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;
}
}

如果排除@Bean 方法,则会出现编译错误: Autowire compilation error if no bean found

最佳答案

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

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

解决方案

  1. 由于您的SessionServiceImpl 是用@Service 注释的,您只需删除@Bean 方法并让spring 创建它。 Spring 已经为您提供了它。

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

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

如果这不起作用,可能只是因为您的 SessionServiceImpl 位于未被 spring 扫描的包中(正如@Miloš Milivojević 所建议的那样)

您可以将@ComponentScan 添加到您的配置类

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

关于java - 如何在 @Configuration 类中 Autowiring Spring 注释的服务类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38337012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com