当某个对象需要根据配置文件的值来判断是否需要加载时可用通过@ConditionalOnProperty来实现,根据使用方的配置来决定是否加载该对象。在下面的例子中,redisService就不能直接通过@Autowired注解来初始化,当项目中不需要使用到该服务时,此时被@Autowired注解标记的对象仍然会进行初始化,从而导致异常。需要使用该对象时可以通过springApplicationContext来获取该对象。
@Configuration
@ConditionalOnProperty(
value = {"com.config.test"}//为true时会初始化当前对象,false则不初始化
)
public class ConditionalTest {
@Bean("redisTemplate")
public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(jedisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean("redisService")
public RedisService initRedisService(RedisTemplate<String, Object> redisTemplate){
RedisService redisService = new RedisService(redisTemplate);
return redisService;
}
}
class RedisService{
RedisTemplate redisTemplate;
public RedisService(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void setValue(String key, Object obj){
redisTemplate.opsForValue().set(key, obj);
}
}
//从spring容器中获取对象