Spring注解@Repository、@Service、@Controller、@Component
继前几章所讲解的注解中:
http://www.cnblogs.com/EasonJim/p/6892280.html
http://www.cnblogs.com/EasonJim/p/6899747.html
http://www.cnblogs.com/EasonJim/p/6901115.html
发现上述遗漏了一些注解,比如:@Repository、@Service、@Controller、@Component,现在做如下补充:
Spring自2.0版本开始,陆续引入了一些注解用于简化Spring的开发。到了2.5版本时才大量引入更全面的注解功能。@Repository注解便属于最先引入的一批,它用于将数据访问层(DAO 层)的类标识为Spring Bean。具体只需将该注解标注在DAO类上即可。同时,为了让Spring能够扫描类路径中的类并识别出@Repository注解,需要在XML配置文件中启用Bean的自动扫描功能,这可以通过<context:component-scan/>实现。如下所示:
//首先使用 @Repository 将 DAO 类声明为 Bean
package com.jsoft.dao;
@Repository
public class UserDaoImpl implements UserDao{ …… }
<!--其次,在XML配置文件中启动Spring的自动扫描功能-->
<beans … >
……
<context:component-scan base-package=”com.jsoft.dao” />
……
</beans>
如此,我们就不再需要在XML中显式使用<bean/>进行Bean的配置。Spring在容器初始化时将自动扫描base-package指定的包及其子包下的所有class文件,所有标注了@Repository的类都将被注册为Spring Bean。
为什么@Repository只能标注在DAO类上呢?这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为Spring的数据访问异常类型。Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。
Spring 2.5在@Repository的基础上增加了功能类似的额外三个注解:@Component、@Service、@Constroller,它们分别用于软件系统的不同层次:
- @Component是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
- @Service通常作用在业务层,但是目前该功能与@Component相同。
- @Constroller通常作用在控制层,但是目前该功能与@Component相同。
通过在类上使用@Repository、@Component、@Service和@Constroller注解,Spring会自动创建相应的BeanDefinition对象,并注册到ApplicationContext中。这些类就成了Spring受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与@Repository是完全相同的。
另外,除了上面的四个注解外,用户可以创建自定义的注解,然后在注解上标注@Component,那么,该自定义注解便具有了与所@Component相同的功能。不过这个功能并不常用。
当一个Bean被自动检测到时,会根据那个扫描器的BeanNameGenerator策略生成它的Bean名称。默认情况下,对于包含name属性的@Component、@Repository、 @Service和@Controller,会把name取值作为Bean的名字。如果这个注解不包含name值或是其他被自定义过滤器发现的组件,默认Bean名称会是小写开头的非限定类名。如果你不想使用默认Bean命名策略,可以提供一个自定义的命名策略。首先实现BeanNameGenerator接口,确认包含了一个默认的无参数构造方法。然后在配置扫描器时提供一个全限定类名,如下所示:
<beans ...>
<context:component-scan base-package="a.b" name-generator="a.SimpleNameGenerator"/>
</beans>
与通过XML配置的Spring Bean一样,通过上述注解标识的Bean,其默认作用域是"singleton"(单例),为了配合这四个注解,在标注Bean的同时能够指定Bean的作用域,Spring2.5引入了@Scope注解。使用该注解时只需提供作用域的名称就行了,如下所示:
@Scope("prototype")
@Repository
public class Demo { … }
如果你想提供一个自定义的作用域解析策略而不使用基于注解的方法,只需实现ScopeMetadataResolver接口,确认包含一个默认的没有参数的构造方法。然后在配置扫描器时提供全限定类名:
<context:component-scan base-package="a.b" scope-resolver="a.SimpleScopeResolver" />
简单例子:
DAO层
package com.jsoft.dao; public interface UserDao {
public void save();
}
DAO层实现类
package com.jsoft.dao.impl; import org.springframework.stereotype.Repository; import com.jsoft.dao.UserDao; @Repository
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("测试保存");
}
}
Service层
package com.jsoft.service; public interface UserService {
public void Usersave();
}
Service实现类
package com.jsoft.service.Impl; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.jsoft.dao.UserDao;
import com.jsoft.service.UserService; @Service
public class UserServiceImpl implements UserService{
@Autowired//自动注入
UserDao userDao; @Override
public void Usersave() {
System.out.println("Service执行保存方法");
userDao.save();
} }
DTO中间类
package com.jsoft.dto; import org.springframework.stereotype.Component; @Component
public class DtoClass {
public void say(){
System.out.println("我是DTO");
}
}
控制层
package com.jsoft.Controller; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import com.jsoft.dto.DtoClass;
import com.jsoft.service.UserService; @Controller
public class UserController {
@Autowired
private UserService userService;
@Autowired
public DtoClass dtoClass; public void save(){
System.out.println("控制层save");
dtoClass.say();
userService.Usersave();
}
}
测试类
package com.jsoft.test.autoTest; import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import com.jsoft.Controller.UserController;
import com.jsoft.util.SpringUtil; public class MyTest {
ApplicationContext applicationContext = null; @Before
public void before() {
applicationContext = SpringUtil.getApplicationContext();
} @Test
public void controller(){
UserController controller = applicationContext.getBean(UserController.class);
controller.save();
}
}
参考:
http://blog.csdn.net/ye1992/article/details/19971467
http://www.cnblogs.com/lonecloud/p/5745885.html
Spring注解@Repository、@Service、@Controller、@Component的更多相关文章
- Spring-Boot-Bean的使用,@Repository,@Service,@Controller,@Component
前言 在Spring MVC的时候,我们使用xml来配置bean,如今的Spring boot推荐我们使用元注解的发生,那就听Spring Boot的推荐,下面我就为大家来介绍下Spring Boot ...
- SpringAnnotation注解之@Component,@Repository,@Service,@Controller
@Component:组件,表示此写上了此注解的bean,作为一个组件存在于容器中.这样的话别的地方就可以使用@Resource这个注解来把这个组件作为一个资源来使用了.初始化bean的名字为类名首字 ...
- @Repository , @Service , @Controller 和 @Component
用Spring MVC时@Controller注解的类将变成一个Spring MVC的控制器. 不用Spring MVC的情况下, 这四个注解没有区别. 根据注解的语义, 注解在类上面可以提高代码的可 ...
- @Component @Repository @Service @Controller
Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring ...
- 从头认识Spring-2.7 自己主动检測Bean(1)-@Component @Repository @Service @Controller
这一章节我们来讨论一下自己主动检測Bean. 1.domain 厨师类: package com.raylee.my_new_spring.my_new_spring.ch02.topic_1_19; ...
- 【转载】@Component, @Repository, @Service的区别
@Component, @Repository, @Service的区别 官网引用 引用spring的官方文档中的一段描述: 在Spring2.0之前的版本中,@Repository注解可以标记在任何 ...
- 使用Spring的@Autowired 实现DAO, Service, Controller三层的注入(转)
简述: 结合Spring和Hibernate进行开发 使用@Autowired实现依赖注入, 实现一个学生注册的功能,做一个技术原型 从DAO(Repository) -> Service -& ...
- 8、Spring+Struts2+MyBaits(Spring注解+jdbc属性文件+log4j属性文件)
一.注解理论 使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base- ...
- spring注解大全
出自http://www.cnblogs.com/xiaoxi/p/5935009.html 1.@Autowired @Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面 ...
随机推荐
- Opencv保存摄像头视频&&各种编码器下视频文件占用空间对比
打开视频文件或摄像头视频需要使用Opencv中的VideoCapture类,保存视频或摄像头视频到本地磁盘,需要使用Opencv中的VideoWriter类,使用都很简单,这篇文章就记录一下Video ...
- B1047 理想的正方形 RMQ
大家吸取我的教训,想好再写.我码了好长时间,最后发现算法处理的是另一个问题,我处理的是正方形情况的,才能用我优化之后的记忆化搜索,然而矩形就凉了. 先看一下题吧: Description 有一个a*b ...
- bzoj 1024 [ SCOI 2009 ] 生日快乐 —— 递归
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1024 因为每次把一块切成两块,所以可以枚举从哪里切开,然后递归求解: 一开始用了不太对的贪心 ...
- 杂项-人物:Alan cooper
ylbtech-杂项-人物:Alan cooper Alan Cooper ,“VB之父”“交互设计之父”,荣获视窗先锋奖(Microsoft Windows Pioneer)和软件梦幻奖(Softw ...
- APP-Android:APK
ylbtech-APP-Android:APK APK是AndroidPackage的缩写,即Android安装包(apk).APK是类似Symbian Sis或Sisx的文件格式.通过将APK文件直 ...
- javaweb 课程设计编码和设计文档
企业办公软件设计文档 1引言 1.1编写目的 OA办公自动化系统详细设计是设计的第三个阶段,这个阶段的主要任务是在OA办公自动化系统概要设计书基础上,对概要设计中产生的功能模块进行过程描述,设计功能模 ...
- Hadoop一主一从部署(2)
Hadoop部署一主一从(2) 1.关闭防火墙和Linux守护进程 执行命令: iptables -F setenforce 0 2.对Hadoop集群进行初始化,在namenode(主机)上执行命令 ...
- MAC软连接
在mac上不设置环境变量有的时候也可以直接就访问到了某些文件.这个是为什么呢?答案是用了软连接. 1 查看加载文件 可以使用cat命令查看paths文件 cat etc/paths /usr/loca ...
- 跳出双重for循环的案例__________跳出了,则不再执行标签ok下的for循环代码
ok: for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { System.out.print("*" ...
- OneThink管理平台 ,登录后台一直提示验证码错误
可能是数据库的错.上传到服务器以后要改2个地方的配置,\Application\Common\Conf\config.php(整站公用配置文 件),\Application\User\Conf\con ...