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

时间: 2024-10-06 08:44:18

Spring注解@Repository、@Service、@Controller、@Component的相关文章

SpringAnnotation注解之@Component,@Repository,@Service,@Controller

@Component:组件,表示此写上了此注解的bean,作为一个组件存在于容器中.这样的话别的地方就可以使用@Resource这个注解来把这个组件作为一个资源来使用了.初始化bean的名字为类名首字母小写 与@Component注解功能相同的注解有:@Repository,@Service,@Controller,@Component ,默认情况下Spring认为这4个注解会被认为是一个组件. @Repository:数据层,一般放在Dao接口的实现类上 @Service:服务层,一般放在se

Spring注解 Component Repository Service Controller区别

Spring 4.1 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能.所以,如果 Web 应

@Component @Repository @Service @Controller

Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能.所以,如果 Web 应用

使用Spring的@Autowired 实现DAO, Service, Controller三层的注入(转)

简述: 结合Spring和Hibernate进行开发 使用@Autowired实现依赖注入, 实现一个学生注册的功能,做一个技术原型 从DAO(Repository) -> Service -> Controller 目录结构: 使用Maven做本地包管理, pom.xml [java] view plaincopy <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww

Struts2+Spring3+MyBatis3整合以及Spring注解开发

 分类: Web(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在做一个SpringMVC+spring+MyBatis的项目,突然想起以前自己要搭建一个Struts2+Spring+IBatis的框架,但是没成功,正好看见培训时候老师给的千里之行的开源项目.于是将这个项目提供的SQL加入到了自己的数据库中(所以数据和项目名用的是qlzx),打算以后做练习的时候用这个数据库.那么接下来问题来了(不要说某翔或者不约,不是那个问题):我有了数据库和数据,想要搭建一个网站,该怎么做

Spring 注解详解01

博客原文: http://www.cnblogs.com/xdp-gacl/p/3495887.html 使用注解来构造IoC容器 用注解来向Spring容器注册Bean. 需要在applicationContext.xml中注册 <context:component-scan base-package="pagkage1[, pagkage2, -, pagkageN]"/>. 如:在base-package指明一个包 <context:component-scan

8、Spring+Struts2+MyBaits(Spring注解+jdbc属性文件+log4j属性文件)

一.注解理论 使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>. 如:在base-package指明一个包 1 <context:component-scan base-package="cn.gacl.java"/> 表明cn.gacl.java包

spring注解大全

出自http://www.cnblogs.com/xiaoxi/p/5935009.html 1.@Autowired @Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property. 当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留. @Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中. 2

Spring 注解驱动(一)基本使用规则

Spring 注解驱动(一)基本使用规则 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 一.基本使用 @Configuration @ComponentScan(basePackages = "com.github.binarylei", excludeFilters = {@Filter(type = FilterType.ANNOTATION, classes = {Controller.class})