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的,有的是穿出去运动的,有的是休闲的。功能一样,但是用途不是很相同。
@Component
spring基础的注解,被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 {
}