Spring几大注解类的详解与区别
2016-04-06 17:59
686 查看
转自:http://www.ulewo.com/user/10001/blog/273
@Resource和@Autowired的主要区别:
然后我们在看后面的几个注解
@Resource、@Autowired、@Qualifier
当需要在某个类中定义一个属性,并且该属性是一个已存在的bean,要为该属性赋值我们就用着三个。我们看上面的代码可以看到这三个都是定义在一个属性上的,比如
那这几个到底有什么区别呢?
我们先看@Resource,它是javax.annotation.Resource; 这个包中,也就是说是javaEE中的,并不是spring中的
而且@Resource("xxx") 是可以定义bean名称的,就是说我这个属性要用那个bean来赋值。
@Autowired,它是org.springframework.beans.factory.annotation.Autowired 是这个包中,它是spring的包。
而且它没有@Autowired("xxx"),那我要为这个bean定义名称怎么办这个时候可以用@Qualifier("xxx") 这个也是spring中的。这个xxx定义bean名称有什么用呢?我们回头看下刚才的代码。
在IIocDao 这个接口中,我们定义的实现类IocDao 只有一个,好那么我们再定义一个实现类:
其他不变,我们再运行:testIoc(),控制台打印出 调用了dao,所以在service层中
@Resource
private IIocDao iocDao;
这个iocDao 注入的是IocDao 这个实现。奇怪了,它怎么知道我要调用哪个实现呢?
好我们修改一下,把 private IIocDao iocDao;改一下,改成 private IIocDao iocDaox 把属性名改一下,再运行,会报错:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.ulewo.ioc.IIocDao] is defined: expected single matching bean but found 2: iocDao,iocDao2
错误很明显啊,有两个bean iocDao和iocDao2,但是我们的是iocDaox所以找不到了。所以可以看出来在用 @Repository注解来生成bean的时候,如果没有定义名称那么就会根据类名来生成。所以我们要调用第二个实现的时候可以 定义为private IIocDao iocDao2 。我们再运行:调用了dao2,所以可以根据属性名来区分,到底注入那个bean。但是有的人说,我不想定义bean名称跟类实现一样,我要定义其他的,那怎么玩呢,方法有2种:
第一种:我们在生成bean的时候就给bean定义个名称
@Repository("myIocDao")
public class IocDao implements IIocDao{
public void add(){
System.out.println("调用了dao");
}
}
当然@Service是一样的,这样就把这个实现定义为myIocDao了,而不是默认的类名 iocDao。
那么我们在使用这个bean的时候就要这么定义了:
@Resource
private IIocDao myIocDao;
运行 输出:调用了dao
如果你这里不是用的 myIocDao,你又多加了一个x,成了myIocDaox,你运行会是这样的:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.ulewo.ioc.IIocDao] is defined: expected single matching bean but found 2: myIocDao,iocDao2
所以,要自定义bean的名称可以在类注解的时候指定。
@Resource和@Autowired的主要区别:
然后我们在看后面的几个注解
@Resource、@Autowired、@Qualifier
当需要在某个类中定义一个属性,并且该属性是一个已存在的bean,要为该属性赋值我们就用着三个。我们看上面的代码可以看到这三个都是定义在一个属性上的,比如
@Resource private IIocDao iocDao;
@Autowired private IocService service;
那这几个到底有什么区别呢?
我们先看@Resource,它是javax.annotation.Resource; 这个包中,也就是说是javaEE中的,并不是spring中的
而且@Resource("xxx") 是可以定义bean名称的,就是说我这个属性要用那个bean来赋值。
@Autowired,它是org.springframework.beans.factory.annotation.Autowired 是这个包中,它是spring的包。
而且它没有@Autowired("xxx"),那我要为这个bean定义名称怎么办这个时候可以用@Qualifier("xxx") 这个也是spring中的。这个xxx定义bean名称有什么用呢?我们回头看下刚才的代码。
在IIocDao 这个接口中,我们定义的实现类IocDao 只有一个,好那么我们再定义一个实现类:
package com.ulewo.ioc; import org.springframework.stereotype.Repository; @Repository public class IocDao2 implements IIocDao{ public void add(){ System.out.println("调用了dao2"); } }
其他不变,我们再运行:testIoc(),控制台打印出 调用了dao,所以在service层中
@Resource
private IIocDao iocDao;
这个iocDao 注入的是IocDao 这个实现。奇怪了,它怎么知道我要调用哪个实现呢?
好我们修改一下,把 private IIocDao iocDao;改一下,改成 private IIocDao iocDaox 把属性名改一下,再运行,会报错:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.ulewo.ioc.IIocDao] is defined: expected single matching bean but found 2: iocDao,iocDao2
错误很明显啊,有两个bean iocDao和iocDao2,但是我们的是iocDaox所以找不到了。所以可以看出来在用 @Repository注解来生成bean的时候,如果没有定义名称那么就会根据类名来生成。所以我们要调用第二个实现的时候可以 定义为private IIocDao iocDao2 。我们再运行:调用了dao2,所以可以根据属性名来区分,到底注入那个bean。但是有的人说,我不想定义bean名称跟类实现一样,我要定义其他的,那怎么玩呢,方法有2种:
第一种:我们在生成bean的时候就给bean定义个名称
@Repository("myIocDao")
public class IocDao implements IIocDao{
public void add(){
System.out.println("调用了dao");
}
}
当然@Service是一样的,这样就把这个实现定义为myIocDao了,而不是默认的类名 iocDao。
那么我们在使用这个bean的时候就要这么定义了:
@Resource
private IIocDao myIocDao;
运行 输出:调用了dao
如果你这里不是用的 myIocDao,你又多加了一个x,成了myIocDaox,你运行会是这样的:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.ulewo.ioc.IIocDao] is defined: expected single matching bean but found 2: myIocDao,iocDao2
所以,要自定义bean的名称可以在类注解的时候指定。
相关文章推荐
- [JAVA修炼之路六]-JVM 垃圾回收机制(算法)
- kafka java producer consumer实践
- RxJava学习第一天
- 约瑟夫环算法java
- XStream 解析xml 转 javaBean 问题
- JAVA 错误集合--源自技术
- eclipse发布web不带项目名的url
- 详解Java的MyBatis框架中动态SQL的基本用法
- 文章标题
- java代码分析及分析工具
- 各个版本JDK官方下载地址
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- java程序导出为jar包的问题
- 腾讯笔试题,蛇形矩阵的Java实现
- xml和JSON相互转换的Java实现
- Gson使用简单介绍
- Java实现JTabbedPane选项卡的切换
- Java图形界面基础实战项目讲解以及构造方法的介绍
- JAVA-多线程
- 关于java