妙用@Autowired实现对象的注入与封装改造RedisUtils

1. 改造之前的代码

        之间的代码注入方法直接声明了公共的静态字段, 所以不满足封装原则, 因为我可以在任意的地方给 redisTemplate 字段重新赋值, 可能会导致程序出错

2. 改造之后的代码

        改造思路是为了满足封装原则

        1. RedisUtil 工具类, 里面提供静态方法, 需要在外部直接调用 RedisUtil.set() 方法或其他方法完成对 redis 的操作

        2. redisTemplate 需要封装到 RedisUtil 内部,  redisTemplate 必须是私有的, 不能通过外部传递, 阻止外部调用对 redisTemplate 重新赋值

        3. redisTemplate 必须是静态的, 因为操作 redis 的方法是静态的, 需要用 RedisUtil 类名直接调用

        4. RedisUtil 的构造器必须是私有的, 防止在外部创建对象, 如果需要创建对象, 这个对象必须是单例的

改造其实很简单, 依赖 @Autowired 注解

第一 : 私有化构造器, 防止在类的外部实例化, 当然你可以用反射, 但是即便用了反射创建了对象, 也没办法在外部调用私有静态字段和私有方法

第二 : redisTemplate 字段应该是私有的, 防止在外部重新赋值, 而且必须是静态的, 应为需要在静态的方法中使用

第三 : 由于 redisTemplate 字段是静态的, 没办法在字段上使用 @Autowired 注解, 所以需要提供一个方法, 在方法上使用 @Autowired 注解, 方法内部给静态字段赋值,  并且该方法需要是私有的, 也是为了防止在类的外部被调用

类中的 setRedisTemplate() 为什么会被调用不清楚的可以看下 @Autowired 的原理, 简单来说就是 :

        Spring 在通过 byName 的自动填充属性时流程是 :

                1.  找到所有set方法所对应的XXX部分的名字
                2.  根据XXX部分的名字去获取bean

        Spring 在通过 byType 的自动填充属性时流程是 :

                1.  获取到set方法中的唯一参数的参数类型,并且根据该类型去容器中获取bean
                2.  如果找到多个,会报错。

相关源码体现 org.springframework.beans.factory.annotation.AutowiredAnnota

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值