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的注入了