java - 为什么@autowiring字段为空?

标签 java spring-boot autowired

我有一个像这样的 RedisConfig:

@Configuration
@EnableRedisRepositories
@EnableRedisHttpSession
@ComponentScan("com.where.redis.config.is")
public class RedisConfig {

    /**
     * Lettuce Connection Factory
     * 
     * @return Lettuce Connection Factory
     */
    @Bean
    public LettuceConnectionFactory lettuceConnectionFactory() {
        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .readFrom(ReadFrom.REPLICA_PREFERRED).build();

        String host = System.getenv("REDIS_HOST") != null ? System.getenv("REDIS_HOST")
                : "localhost";
        RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration(host,
                6379);

        return new LettuceConnectionFactory(serverConfig, clientConfig);
    }

    /**
     * Redis Template
     * 
     * @return redisTemplate
     */
    @Bean
    public RedisTemplate<Object,Object> redisTemplate() {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory());
        return redisTemplate;
    }

    /**
     * Redis String Template
     * 
     * @return redisStringTemplate redis String Template
     */
    @Bean(name = "redisStringTemplate")
    @Primary
    public RedisTemplate<String, String> redisStringTemplate() {
        RedisTemplate<String, String> redisStringTemplate = new RedisTemplate<>();
        redisStringTemplate.setConnectionFactory(lettuceConnectionFactory());
        JdkSerializationRedisSerializer jdkSerializationRedisSerializer 
            = new JdkSerializationRedisSerializer();
        RedisSerializer<String> stringSerializer = new StringRedisSerializer();
        redisStringTemplate.setKeySerializer(stringSerializer);
        redisStringTemplate.setHashKeySerializer(stringSerializer);
        redisStringTemplate.setValueSerializer(jdkSerializationRedisSerializer);
        redisStringTemplate.setHashValueSerializer(jdkSerializationRedisSerializer);
        redisStringTemplate.setEnableTransactionSupport(true);
        redisStringTemplate.afterPropertiesSet();
        return redisStringTemplate;
    }

    /**
     * Configure Redis Action
     * 
     * @return Redis Configure Action
     */
    @Bean
    public ConfigureRedisAction configureRedisAction() {
        return ConfigureRedisAction.NO_OP;
    }
}

然后我尝试在这样的类中使用它:

public class Someclass {

    private static Long TIMEOUT = 60L;

     /** Inject the actual template */
    @Autowired
    private RedisTemplate<String, String> redisStringTemplate;

    /**
     * Stores a User in redis. 
     * 
     * @param user Exavault User
     */
    private void cacheUser(ExavaultUser user) {

        redisStringTemplate.expire(REDIS_KEY, TIMEOUT, TimeUnit.MINUTES);
        redisStringTemplate.afterPropertiesSet();
        redisStringTemplate.opsForHash().put(REDIS_KEY, user.getUsername(), 
                user.getAccessToken());
    }
} 

我按如下方式启动应用程序:

@SpringBootApplication
@EnableScheduling
@ComponentScan(basePackages = "com.where.all.java.code.is")
public class SchedulingTasksApplication {

    public static void main(String[] args) {
        ApplicationContext applicationContext = 
                SpringApplication.run(SchedulingTasksApplication.class, args);      
    }   
}

我在这里缺少什么?

最佳答案

要使用 @Autowired 的类没有 Spring 注解。将以下注释之一添加到类中:@Component、@Repository、@Service、@Controller、@Configuration。

此外,该包必须位于 ComponentScan 搜索路径内。将包移动到扫描位置或配置 ComponentScan 来修复此问题。

@Component
public class Someclass {

    private static Long TIMEOUT = 60L;

     /** Inject the actual template */
    @Autowired
    private RedisTemplate<String, String> redisStringTemplate;

    /**
     * Stores a User in redis. 
     * 
     * @param user Exavault User
     */
    private void cacheUser(ExavaultUser user) {

        redisStringTemplate.expire(REDIS_KEY, TIMEOUT, TimeUnit.MINUTES);
        redisStringTemplate.afterPropertiesSet();
        redisStringTemplate.opsForHash().put(REDIS_KEY, user.getUsername(), 
                user.getAccessToken());
    }
} 

此外,@dassum 也添加了相同的评论。

关于java - 为什么@autowiring字段为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61024474/

相关文章:

spring - 没有定义类型的唯一 bean : expected single bean but found 0:

Web项目中的Java文件路径

java - 如果用户不验证电子邮件,会发生什么?

java - MongoDB 连接拒绝 java spring boot

java - 在 tomcat 启动时, Autowiring : Exception sending context initialized event to listener instance of class

java - 尝试使用 Autowiring 的候选者运行存储库 impl 进行测试

java - 根据成员变量或映射函数返回子列表

java - 使用 selenium webdriver 36 在 chrome 中自动化执行太慢

spring-boot - 从 springBoots `bootJar` gradle 任务中排除特定依赖项

java - 多部分/表单数据 Restful 请求