发表于: 2017-09-02 17:17:33
2 1267
今天做的事:
先推荐个软件,可视化Redis
https://redisdesktop.com/download
然后今天在寻找springMVC整合Redis的例子,还在努力中
不过在寻找的过程中,又发现了一个新的Spring的注入bean方式的标签
constructor-arg和property
constructor-arg:通过构造函数注入。
property:通过setter对应的方法注入。
之前使用的都是property,今天学习了一下constructor-arg的用法
pom文件
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
</dependencies>
构造函数类student
public class Student {
private Integer id;
private String name;
private List<String> dream;
private Map<String, Integer> score;
private boolean graduation;
public Student() {
}
public Student(Integer id, String name, List<String> dream, Map<String, Integer> score, boolean graduation) {
this.id = id;
this.name = name;
this.dream = dream;
this.score = score;
this.graduation = graduation;
}
//toString方式
}
getter和setter方法类teacher
public class Teacher {
private Integer id;
private String name;
//setter和getter方法
//toString方法
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="student" class="Student">
<constructor-arg name="id" value="1"/>
<constructor-arg name="name" value="MLP"/>
<constructor-arg name="dream">
<list>
<value>soldier</value>
<value>scientist</value>
<value>pilot</value>
</list>
</constructor-arg>
<constructor-arg name="score">
<map>
<entry key="math" value="90"/>
<entry key="English" value="60"/>
</map>
</constructor-arg>
<constructor-arg name="graduation" value="false"/>
</bean>
<bean id="teacher" class="Teacher">
<property name="id" value="1"/>
<property name="name" value="MMP"/>
</bean>
</beans>
测试
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by yubotao on 2017/09/02.
*/
public class ATest {
@Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Student student = (Student) context.getBean("student");
System.out.println(student);
Teacher teacher = (Teacher) context.getBean("teacher");
System.out.println(teacher);
}
}
测试结果
水完了(-_-||)
继续找整合例子
整合成功一个例子,是Spring和Redis的整合。
链接:http://blog.csdn.net/java2000_wl/article/details/8543203/#reply
这个例子中有一个问题,就是会有一些报错,最关键的一句
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userDao': Unsatisfied dependency expressed through field 'redisTemplate'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.data.redis.core.RedisTemplate<java.lang.String, com.redis.entity.User>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
定位报错代码
@Repository
public abstract class AbstractBaseRedisDao<K,V> {
@Autowired
//有这个注解报错,将它注掉,并在setRedisTemplate上加上@Resource,程序即可运行成功
protected RedisTemplate<K,V> redisTemplate;
/**
* 设置redisTemplate
* @param redisTemplate the redisTemplate to set
*/
// @Autowired注解表示让Spring容器自动注入这个bean,
// @Resource表示把当前注解的类交给Spring容器管理,你不使用@Resource注解,Spring容器就不会加载这个类型的bean
@Resource
public void setRedisTemplate(RedisTemplate<K,V> redisTemplate) {
this.redisTemplate = redisTemplate;
}
/**
* 获取 RedisSerializer
* <br>------------------------------<br>
*/
protected RedisSerializer<String> getRedisSerializer() {
return redisTemplate.getStringSerializer();
}
}
将代码中的@Autowired注掉,然后在setRedisTemplate上加上@Resource注解,就可以正常运行了
这里为什么会有这个问题,大概查了一下,由于对于Spring注解了解有限,所以只能看一些比较浅显的回答
其中一条回答
@Resource的源码介绍
这是@Resource
注解的介绍,@Resource
用在字段或者方法上的时候,Spring会从容器里面寻找需要的类型Bean,@Resource
用在类上的时候,Spring会把当前类作为资源放入Spring容器。
@Autowired
注解表示让Spring容器自动注入这个bean,@Resource
表示把当前注解的类交给Spring容器管理,你不使用@Resource
注解,Spring容器就不会加载这个类型的bean,需要注入的时候自然就报错了
另一条回答
@Resource
表示该bean交由spring容器来管理,一般情况下会将resource写在类或者接口的实现类上,而不是直接写在接口上。让spring容器管理的意思就是你想要实例化该类的时候,spring会自动帮你创建对象。
@Autowired
表示该属性(一般写在属性或者set方法上)让spring来自动注入。只有spring容器中有该资源(加了resource的bean当作一个资源对待)的话,spring才可以给你自动注入。spring容器中没有该资源时你再自动注入肯定找不到资源报错。
恰当而又不恰当的例子
火车站有个包寄存器(Spring容器),你想将你的包寄存到容器中。你就在包上贴了个@Resource标签,工作人员给你一个小条,表示该资源属于你。当你想拿包(获取该资源)的时候,你可以拿着小条(@Autowired)去包寄存器中找该资源。
如果你的包确实寄存在容器里了,那就根据你的小条给你包。
如果你没有把包寄存到容器里,还想问工作人员要包,那就报错。你就开始了和工作人员的决斗中。。。。。。。。。。。。。。
Spring是很正直的,有就给你,没有就是没有,没有资源的情况下,你再问我要。我就给你报错!!!
PS:感觉举的例子好乱,自己理解去吧。
回答链接:https://segmentfault.com/q/1010000006100767
我的理解就是,你是用@Autowired让Spring注入,但是Spring容器中没有,就抛没有的错误;而@Resource直接让Spring帮你接管,Spring会在容器中先添加好,等你来取。
@Resource是Spring主动,@Autowired是Spring被动,嘿嘿嘿~
代码都是贴的例子里的,具体还没分析,只是跑成功了,明天好好研究一下。任务进度推迟。
然后还有一个博客写的挺不错,明天也写出来跑一下。
链接:http://blog.csdn.net/defonds/article/details/48716161
本来想着随便配一下RedisUtil放到项目中跑跑就算了,后来看到很多整合Spring和Redis的例子,有一些跑不通,这两个例子,其中一个跑通了,有点难度,需要钻研一下;另外一个用了另一种截然不同的方式,之前看到一位师兄使用过,所以打算尝试一下,一个关键词:@Cacheable 注解
明天计划:继续深入学习Redis,已经不把时间什么的放在眼里。。。
问题:跑通的例子需要深究一下,里面涉及了很多Spring对Jedis的再封装类
收获:无所事事?反正好像一天都在找东西,看东西,学到的东西反而挺少的。
评论