spring中存在以下几种常见的注解:
@Component、@Repository、@Service、@Controller、@Resource、@Autowired、@Qualifier
注解说明:
|- - -| @Repository: 用于标注数据访问组件,即DAO组件。
|- - -| @Service: 用于标注业务层组件(我们通常定义的service层就用这个)。
|- - -| @Contrller: 用于标注控制层组件
|- - -| @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
以上几个注解是当你需要定义某个类为一个bean,则在这个类的类名前一行使用以上注解中的一种,如@Service(“XXX”),就相当于将此类定义为一个bean,bean名称为XXX; 这几个是基于类的,我们可以定义名称,也可以不定义,不定义会默认以类名为bean的名称(类首字母小写)。
注解使用
当我们需要在某个类中定义被注解标注的类作为一个属性时,我们则要使用以下三个注解:
@Resource、@Autowired、@Qualifier
再讲解使用之前,先编写几个类:
//控制层
@controller
public class TestController
{
public void say()
{
System.out.println("I am a good boy");
}
}
//service层
@service
public class TestService
{
@Resource
private Dao Dao;
public void add(){
Dao.add();
}
//定义Dao接口
public interface Dao {
public void add();
}
//定义实现DAO类,DAO层
@Repository
public class DaoImpl implements Dao{
public void add(){
System.out.println("调用了dao");
}
}
回到前面说的,当需要在某个类中定义被注解的类作为属性时,我们则可以使用@Resource或@AutoWired,比如
@Resource
private Dao dao;
@Autowired
private Dao dao;
它们的区别如下:
@Resource,它是javax.annotation.Resource; 这个包中,也就是说是javaEE中的,并不是spring中的,而且@Resource(“xxx”) 是可以定义bean名称的,就是说我这个属性要用那个bean来赋值。
@Autowired,它是org.springframework.beans.factory.annotation.Autowired 是这个包中,它是spring的包中的,而且它没有@Autowired(“xxx”),那我要为这个bean定义名称怎么办这个时候可以用@Qualifier(“xxx”), 这个也是spring中的。
我们在定义一个Dao的实现类DaoImpl2
@Repository
public class DaoImpl2 implements Dao{
public void add(){
System.out.println("调用了dao2");
}
}
此时,如果我们要使用DaoImpl2作为一个类的属性时,则必须要写成如下形式
@Resource
private Dao daoImpl2;
当被注解的类指定名称时,也就是@Repository(“???”)时,则我们必须写成如下形式
@Resource
private Dao ???;
也就是说,定义的属性名称必须与@Repository(“???”)中的名称保持一致。
另一种写法是:
@Resource(???)
private Dao * * *;
或
@AutoWired
@Qualifier(???)
private Dao * * *;