Java使用速记
1、作用域标记(Scope)无效
尝试在Bean上面标记作用域,但是结果是无效的。
@Scope("prototype")
config
找了一些资料,比如下面这个:
https://blog.csdn.net/2301_78385600/article/details/143964088
仍然没有解决
2、Java枚举,使用自定义的值
java的枚举,默认使用从0开始的整数递增连续数字,假如希望使用自定义的值,需要使用枚举扩展(参考一)。

枚举.枚举名.ordinal() 可以获得对应的数字
例如: Season.SPRING.ordinal()
参考一:《Java中的枚举类型(Enum)》
https://www.cnblogs.com/zwh0910/p/16991886.html
参考二:《Java枚举详解》
https://blog.csdn.net/yk_dflkg/article/details/147964000
3、单例模式当中使用注入
结合文章《静态方法使用@Autowired注入》(https://blog.csdn.net/wh710107079/article/details/98183733)、《深入浅出:在 Spring 中实现静态变量注入的几种方法》(https://zhuanlan.zhihu.com/p/2363301618)和百度AI,以及我实际经验,可知:
使用使用默认无参数的构造函数,不论是字段还是方法通过@Autowired注入都是无效的。
解决办法是,使用带参数带@Autowired注释的构造函数,将依赖项赋值给字段,Springboot,同时也会把其它所有的注入都生效的。
下面是伪代码:
class StudentMng3 {
private static StudentMng3 _Ins;
@Autowired
public StudentMng3(StudentService studentService) {
_Init();
Service3 = studentService;
_Ins = this;
}
public static StudentMng3 Self(){
return _Ins;
}
private StudentService Service3;
@Resource
private StudentService studentService;
@Resource
private RedisTemplate redisTemplate;
}
或者是把需要使用的依赖项放入专门的静态类静态方法当中。
https://files.cnblogs.com/files/xpnew/Java%E5%9C%A8%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%E5%BD%93%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%B3%A8%E5%85%A5%EF%BC%88Demo4Bean01%EF%BC%89.rar?t=1750405129&download=true
4、在RedisTemplate当中出现乱码
简单处理是如文章《使用RedisTemplate存储到redis的值乱码了怎么解决?》(https://blog.csdn.net/weixin_43526092/article/details/129900885)所说,处理相关的内容就行。
redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setValueSerializer(RedisSerializer.string());
进一步处理是需要springboot指定一个处理的Bean:
@Configuration
public class RedisConfig {
// @Bean(name = {"RedisConfig"})
// @ConditionalOnMissingBean(
// name = {"RedisConfig"}
// )
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//设置工厂链接
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置自定义序列化方式
setSerializeConfig(redisTemplate);
//redisTemplate.of
return redisTemplate;
}
private void setSerializeConfig(RedisTemplate<String, Object> redisTemplate) {
//对字符串采取普通的序列化方式 适用于key 因为我们一般采取简单字符串作为key
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//普通的string类型的key采用 普通序列化方式
redisTemplate.setKeySerializer(stringRedisSerializer);
//普通hash类型的key也使用 普通序列化方式
redisTemplate.setHashKeySerializer(stringRedisSerializer);
//解决查询缓存转换异常的问题 大家不能理解就直接用就可以了 这是springboot自带的jackson序列化类,但是会有一定问题
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(om);
//普通的值采用jackson方式自动序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//hash类型的值也采用jackson方式序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
//属性设置完成afterPropertiesSet就会被调用,可以对设置不成功的做一些默认处理
redisTemplate.afterPropertiesSet();
}
}
比较新的版本使用下面这个:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//设置工厂链接
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置自定义序列化方式
setSerializeConfig(redisTemplate);
//redisTemplate.of
return redisTemplate;
}
private void setSerializeConfig(RedisTemplate<String, Object> redisTemplate) {
//对字符串采取普通的序列化方式 适用于key 因为我们一般采取简单字符串作为key
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//普通的string类型的key采用 普通序列化方式
redisTemplate.setKeySerializer(stringRedisSerializer);
//普通hash类型的key也使用 普通序列化方式
redisTemplate.setHashKeySerializer(stringRedisSerializer);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
//解决查询缓存转换异常的问题 大家不能理解就直接用就可以了 这是springboot自带的jackson序列化类,但是会有一定问题
// Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
// jackson2JsonRedisSerializer.setObjectMapper(om);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(om,Object.class);
//普通的值采用jackson方式自动序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//hash类型的值也采用jackson方式序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
//属性设置完成afterPropertiesSet就会被调用,可以对设置不成功的做一些默认处理
redisTemplate.afterPropertiesSet();
}
}
但是,如果这时,还在单例模式的入参当中指定了RedisTemplate,就会报错(比较旧的版本会出现,新的版本没有)

这时候,如果填写了org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration类上面的名称redisTemplate还好,如果是给前面的RedisConfig命名,然后在单例的入口引用,那就会重新出现乱码的问题!

解决办法是,创建两个RedisConfig,其中一个命名,一个不命名。


漂泊是无尽的轮回。

浙公网安备 33010602011771号