Spring/Spring-Boot 学习 @Controller,@Component,@Service,@Repository的异同
本文转自
Spring典型注解-@Controller,@Component,@Service,@Repository的异同
spring常用注解-@Component, @Service, @Repository,@Controller,@Autowired,@Qualifier,@Scope
相同点:
@Controller,@Service,@Repository都有带@Component父注解,四个注解都可以说成是Component级别的注解,Spring框架自动扫描的注解也是检测是否有Component注解标记。把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>。这三个注解它们除了@Component的属性外还有其他的的场景应用。
@Repository
这个注解用来标识这个类是用来直接访问数据库的,dao层使用@repository注解。如@Repository(value="goodsDao")注解是告诉Spring,让Spring创建一个名字叫goodsDao的GoodsDaoImpl实例。当Service需要使用Spring创建的名字叫goodsDao的GoodsDaoImpl实例时,就可以使用@Resource(name = "goodsDao")注解告诉Spring,Spring把创建好的goodsDao注入给Service即可。
注解在数据访问层Bean,还可以将数据库操作抛出的原生异常翻译转化为spring的持久层异常。 举例:
@Repository(value="goodsDao")注解是告诉Spring,让Spring创建一个名字叫goodsDao的GoodsDaoImpl实例。
@Repository(value="goodsDao")
public class GoodsDaoImpl extends BasicDaoImpl implements GoodsDao {
}
当Service需要使用Spring创建的名字叫goodsDao的GoodsDaoImpl实例时,就可以使用@Resource(name = "goodsDao")注解告诉Spring,Spring会自动把goodsDao创建好然后注入给goodsDao。
@Resource(name = "goodsDao")
private GoodsDao goodsDao;
@Service
应用的业务逻辑通常在service层实现,因为我们一般使用@Service注解标记这个类属于业务逻辑层。如@Service("goodsService")注解是告诉spring,当Spring要创建GoodsServiceImpl的的实例时,bean的名字必须叫做"goodsService",这样当Action需要使用GoodsServiceImpl的的实例时,就可以由Spring创建好的"goodsService",然后注入给Action。
@Service("goodsService")注解是告诉Spring,让Spring创建一个名字叫goodsService的GoodsServiceImpl实例。
@Service("goodsService")
public class GoodsServiceImpl implements GoodsService {
}
当Controller需要使用GoodsServiceImpl的实例时,只要在Controller中声明@Resource(name = "goodsService")来接收由Spring注入的goodsService,然后Spring会自动创建好goodsService,注入给Controller
@Resource(name = "goodsService")
private GoodsService goodsService;
@Controller
这个注解主要告诉Spring这个类作为控制器,可以看做标记为暴露给前端的入口。@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
使用@Controller注解标识GoodsController之后,就表示要把GoodsController交给Spring容器管理,在Spring容器中会存在一个名字为goodsController的Controller,这个名字是根据GoodsController类名首字母小写来取的(如果@Controller不指定value,则默认bean名称为这个类的类名首字母小写)
@Controller
public class GoodsController {
}
@Component
用来表示一个平常的普通组件,当一个类不合适用以上的注解定义时用这个组件修饰。
总结:
项目小的时候对这些注解没有特别的区分,但项目如果变得越来越大,那么就要划分的细致一些有一定的规则才方便大家的维护。有点像衣服,虽然都是衣服,但是有的是要穿出去开party的,有的是穿出去运动的,有的是休闲的。功能一样,但是用途不是很相同。
@Componentspring基础的注解,被spring管理的组件或bean@Repository用于持久层,数据库访问层@Service用于服务层,处理业务逻辑@Controller用于呈现层,(spring-mvc)
其他配合注解 @Qualifier, @Scope
@Qualifier
注入指定bean的名称,有两个匹配的bean及以上会用到:
@Service("service1")
public class GoodsServiceImpl1 implements GoodsService {
}
@Service("service2")
public class GoodsServiceImpl2 implements GoodsService {
}
@Controller
public class GoodsController {
@Autowired
@Qualifier("service1")
GoodsService goodsService;
}
@Scope
Spring默认产生的bean是单例(即singleton)的,如果设置为prototype表示原型即每次都会new一个新的出来。
@Controller
@Scope("prototype")
public class GoodsController {
}

浙公网安备 33010602011771号