发表于: 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的再封装类


收获:无所事事?反正好像一天都在找东西,看东西,学到的东西反而挺少的。




返回列表 返回列表
评论

    分享到