使用@Autowired和@Resource给RedisTemplate注入bean的区别

1.redis数据库的小异常

情景:为了保证redis存储的key(“student”)对应的value值为最后一次查询的结果,首先从redis中取出的对象,判断是否和我们查询的id一致,如果是,就直接从redis取,否则就从mysql取,并把这次的对象放入redis的key(“student”)。但第一次操作redis时,redis是空的,取出的对象也是空的,直接调用getId()肯定会出空指针异常,这里一定要先加个非空判断,使用&是不行,因为即使前面判断为空了,后面条件也会做一次判断,还是逃不过空对象调用方法的异常,所以要使用&&,前面为空,后面就不会判断了,也就不会出现异常。

 

    @Override
    public UserEntity getUserById(int userid) {
        UserEntity userEntity=redisTemplate.opsForValue().get("student");
        if (userEntity!=null&&userEntity.getId()==userid)/*防止空指针异常*/
            return  userEntity;
        else {
            userEntity= userMapper.selectById(userid);
            redisTemplate.opsForValue().set("student",userEntity);
            return userEntity;
        }

    }

2.使用@Autowired和@Resource给RedisTemplate注入bean的区别:

@Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果只指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果只指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName(字段名字作为bean id)方式进行装配;如果没有匹配,则类型进行匹配

此次尝试,@Autowired只能注入默认的bean,即是泛型为object类型的那个,使用@Qualifier(name=“redisTemplate”)指定bean的id也不行,而@Resource(name=“redisTemplate”)指定一下id就行,就很奇怪,难道我一个id还能对应出俩不一样的bean对象?

@Autowired是spring注解,没有参数,默认是根据字段类型注入bean,配合@Qualifier(name=“***”)使用name精确指定bean。

Autowired默认先按类型匹配,如果发现找到多个bean(子类或者实现类很多,一般都是抽象类和接口),则又按照字段Name方式比对,如果还有多个,则报出异常这不本身就有了@Qualifier功能吗?

总结,@Autowired先根据类型,再根据字段名字匹配。

public class Springin{
@Test
    public  void ma() {
    ApplicationContext app= new ClassPathXmlApplicationContext("classpath:spring-context.xml");
    Spring spring=app.getBean("spring",Spring.class);
    spring.print();
    }

}
//********************************************************************************
@Repository
    class Spring {
    @Autowired
   private Springi springii;
    public void print() {
        springii.print();
    }
}
//*********************************************************************************
@Repository
class Springi {
    public  void print(){
        System.out.println("我是springi");
    }
}

    @Repository
    class springii extends Springi {
        @Override
        public  void print(){
            System.out.println("我是springii");
        }
    }
//略了spring的配置文件

果真如某位博主说的那样,@Autowired在类型匹配到多个bean时,会根据字段的name匹配唯一bean。

以上的例子有个小插曲,因为只想验证一下spring的ioc,所以使用简单的Java代码去实现,而没有使用mvc框架。使用@Autowired注入时结果总是报出空指针异常,java加载顺序问题,没办法只好用ApplicationContext 对象进行bean的注入了

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值