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,其中一个命名,一个不命名。

 

 

 

posted @ 2025-06-20 16:21  柳城之城  阅读(4)  评论(0)    收藏  举报