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代码里面 ...
随机推荐
- LBS(定位)的使用
一.LBS(定位)的使用 1.使用框架Core Location 2.CLLocationManager (1)CoreLocation中使用CLLocationManager对象来做用户定位 (2) ...
- Java 解析Json数据
Json格式字符串{success:0,errorMsg:"错误消息",data:{total:"总记录数",rows:[{id:"任务ID" ...
- Python入门 六、像个 Pythonista
pickle import pickle test_data = ['Save me!',123.456,True] f = file('test.data','w') pickle.dump(tes ...
- Java IO流文件复制/解压的几种方法总结
引言 在JavaWeb项目开发过程,涉及到IO文件的读写操作以及文件的复制copy操作是作为一个程序员不可获取的知识,那接下来就总结一些copy文件的一些方法,与大家通过学习,如果还有其他更好的方法, ...
- Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook解决方法
有时候电脑中进行Java -version相关的操作时,会出现Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook提示信息,尽管这些提示信息不影响JDK的正常使 ...
- Spring Boot (14) 数据源配置原理
数据源配置源码 这里截取org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration的部分源码,主要介绍Tomcat和Hika ...
- C#url相关知识
C#中Url地址重定向的方法: 1:Response.Redirect(url); 这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但他可以跳转到任何页面,没有站点页面限 ...
- javascript 核心概念(1)-数据类型
语法 (1)到现在为止,大多数浏览器也还是支持到ECMAScript 第三版的标准. 核心概念就是一个语言的基本工作原理,涉及语法,操作符,数据类型. (2)javascript的一切--变量,函数名 ...
- Android第三方微博、无线传输、动画特效、商城应用等源码
Android精选源码 Android汽车助手源码 一个酷炫的Android特效源码 新浪微博的第三方客户端.UI遵循Material Design. Android实现旋转木马布局多种效果 Andr ...
- 在命令提示符窗口下(cmd)使用指令操作并编译java代码,运行java编译代码
使用cmd操作java代码,编译.java文件,运行.class文件. 操作步骤: 1:创建一个文件夹: 例如:在e盘根目录(\)下面创建一个名为Hello的文件夹: 使用md指令:如图 在e盘中会生 ...