精华内容
下载资源
问答
  • 2. @Service() 3. @Repository持久层 springvmc采用经典的三层分层控制结构,在持久层,业务层和控制层分别采用@Repository、@Service、@Controller对分层中的类进行注解,而@Component对那些比较中立的类进行...
    
    
    
    

    @Autowired依赖注入源码分析

    1. @Controller控制层

    @Controller用于标记在一个类上,使用它标记的类就是一个SpringMvc Controller对象,分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。
    @Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是处理请求的处理器。
    @Controller标记在一个类上还不能真正意义上说它就是SpringMvc的控制器,应为这个时候Spring还不认识它,这个时候需要把这个控制器交给Spring来管理。有两种方式可以管理:
    <!--基于注解的装配-->
    <!--方式一-->
    <bean class="com.HelloWorld"/>
    <!--方式二-->
    <!--路径写到controller的上一层-->
    <context:component-scan base-package="com"/>
    

    Action层:

    package com;
    @Controller
    public class HelloWorld{
    	
    	@RequestMapping(value="/showRegUser")
    	public String printHello() {
    		return "hello";
    	}
    
        @Autowried
        private IocSerevce service;
        public void add(){
            service.add();
        }
    }
    
    component-scan默认扫描的注解类型是@Component,不过,在@Component的语义基础之上细化为@Reposity,@Service,@Controller.
    有一个use-defaultbao'i-filters属性,属性默认是true,表示会扫描抱下所有的标有@Component的类,并注册为bean,也就是@Component的子注解@Service,@reposity等
    如果只想扫描包下的@Controller或其他内容,则设置use-default-filters属性为false,表示不再按照scan指定的包进行扫描,而是按照指定包进行扫描
    <context:component-scan base-package="com" user-default-filters="false">
        <context:include-filter type="regex" expression="com.tan.*"/>
    </context:component-scan>
    

    当没有设置use-default-filters属性或属性为true时,表示基于base-package包下指定扫描的具体路径。

    2. @Service()


    此注注解属于业务逻辑层,service或者manager层
    默认按照名称进行装配,如果名称可以通过name属性指定,如果没有name属性,注解写在字段上时,默认去字段名进行查找,如果注解写在setter方法上,默认按照方法属性名称进行装配。当找不到匹配的bean时,才按照类型进行装配,如果name名称一旦指定就会按照名称进行装配

    Service层:

    @Service()
    public class IocService{
    
        @Resource
        private IIocDao iiocDao;
        public void add(){
            iiocDao.add();
        }
    }
    

    3. @Repository持久层

    此注解式持久层组件,用于标注数据访问组件,即DAO组件
    DAO层
    先定义一个接口

    public interface IIocDao{
        public void add();
    }
    

    然后实现类

    //Dao层中定义了一些接口
    //表示将Dao类声明为bean
    @Repository
    public class IocDao implements IIocDao{
        public void add(){
            System.out.println("调用了Dao");
        }
    }
    
    另外一种解释: @Repository对应数据访问层Bean
    @Repository(value="userDao")
    public class UserDaoImpl extends BeansDaoImpl<User>{
        ......
    }
    

    @Repository(value=“userDao”)注解告诉Spring ,让Spring创建一个名字叫做"userDao"的UserDapImpl实例。
    当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name=“userDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可。

     //注入userDao,从数据库中根据用户Id取出指定用户时需要用到
     @Resource(name = "userDao")
     private BaseDao<User> userDao;
    

    参考文章:https://www.cnblogs.com/xdp-gacl/p/3495887.html

    展开全文
  • @Service

    千次阅读 2019-10-30 11:23:07
    @Service注解作用 1、 其getBean的默认名称是类名(头字母小写),可以@Service(“xxxx”)这样来指定, 2、其定义的bean默认是单例的,可以使用@Service(“beanName”) @Scope(“prototype”)来改变。 3、可以...

    @Service注解作用

       1、 其getBean的默认名称是类名(头字母小写),可以@Service(“xxxx”)这样来指定,   2、其定义的bean默认是单例的,可以使用@Service(“beanName”) @Scope(“prototype”)来改变。
       3、可以通过@PostConstruct和@PreDestroy指定初始化方法和销毁方法(方法名任意)

    @Service("baseCacheService")
    public class BaseCacheServiceImpl implements BaseCacheService{
    
    }

    详解

    首先,在applicationContext.xml文件中加一行:

    <context:component-scan base-package="com.hzhi.clas"/> 

    加上这一行以后,将自动扫描路径下面的包,如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了,类似的还包括@Component、@Repository、@Controller。

    比如下面这个类:

    @Service("courseDAO")
    @Scope("prototype")
    public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{
    
        ......
        
    }

    其作用就相当于applicationContext.xml文件里面的:

        <bean id="courseDAO"
             class="com.hzhi.course.dao.CourseDAOImpl" scope="prototype">
             ......    
        </bean>    

     

    展开全文
  • @Component, @Repository, @Service的区别

    万次阅读 多人点赞 2017-12-07 14:18:47
    @Component, @Repository, @Service的区别官网引用引用spring的官方文档中的一段描述:在Spring2.0之前的版本中,@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并...

    @Component, @Repository, @Service的区别

    官网引用

    引用spring的官方文档中的一段描述:

    在Spring2.0之前的版本中,@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常

    在Spring2.5版本中,引入了更多的Spring类注解:@Component,@Service,@Controller@Component是一个通用的Spring容器管理的单例bean组件。而@Repository, @Service, @Controller就是针对不同的使用场景所采取的特定功能化的注解组件。

    因此,当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller来替代它,同时这些注解会具备有更多的功能,而且功能各异。

    最后,如果你不知道要在项目的业务层采用@Service还是@Component注解。那么,@Service是一个更好的选择。

    就如上文所说的,@Repository早已被支持了在你的持久层作为一个标记可以去自动处理数据库操作产生的异常(译者注:因为原生的java操作数据库所产生的异常只定义了几种,但是产生数据库异常的原因却有很多种,这样对于数据库操作的报错排查造成了一定的影响;而Spring拓展了原生的持久层异常,针对不同的产生原因有了更多的异常进行描述。所以,在注解了@Repository的类上如果数据库操作中抛出了异常,就能对其进行处理,转而抛出的是翻译后的spring专属数据库异常,方便我们对异常进行排查处理)。

    注解 含义
    @Component 最普通的组件,可以被注入到spring容器进行管理
    @Repository 作用于持久层
    @Service 作用于业务逻辑层
    @Controller 作用于表现层(spring-mvc的注解)


    其他网上资料

    这几个注解几乎可以说是一样的:因为被这些注解修饰的类就会被Spring扫描到并注入到Spring的bean容器中。

    这里,有两个注解是不能被其他注解所互换的:

    @Controller 注解的bean会被spring-mvc框架所使用。
    @Repository 会被作为持久层操作(数据库)的bean来使用
    如果想使用自定义的组件注解,那么只要在你定义的新注解中加上@Component即可:

    @Component 
    @Scope("prototype")
    public @interface ScheduleJob {...}

    这样,所有被@ScheduleJob注解的类就都可以注入到spring容器来进行管理。我们所需要做的,就是写一些新的代码来处理这个自定义注解(译者注:可以用反射的方法),进而执行我们想要执行的工作。

    @Component就是跟<bean>一样,可以托管到Spring容器进行管理。

    @Service, @Controller , @Repository = {@Component + 一些特定的功能}。这个就意味着这些注解在部分功能上是一样的。

    当然,下面三个注解被用于为我们的应用进行分层:

    @Controller注解类进行前端请求的处理,转发,重定向。包括调用Service层的方法
    @Service注解类处理业务逻辑
    @Repository注解类作为DAO对象(数据访问对象,Data Access Objects),这些类可以直接对数据库进行操作
    有这些分层操作的话,代码之间就实现了松耦合,代码之间的调用也清晰明朗,便于项目的管理;假想一下,如果只用@Controller注解,那么所有的请求转发,业务处理,数据库操作代码都糅合在一个地方,那这样的代码该有多难拓展和维护。

    总结

    @Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
    @Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
    @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
    @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
    @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
    用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。

    原文:
    https://github.com/giantray/stackoverflow-java-top-qa/blob/master/contents/whats-the-difference-between-component-repository-service-annotations-in.md

    其他:
    http://stackoverflow.com/questions/6827752/whats-the-difference-between-component-repository-service-annotations-in

    Spring注解@Autowired、@Resource区别

    展开全文
  • 目录前言1.不同时间的三组注解2.注解的升级2.1 @Reference... @DubboReference2.1.2.1 注解升级2.1.2.2 属性增加2.2 @Service2.2.1 Alibaba @Service -> Apache @Service2.2.1.1 注解升级2.2.1.2 属性修改与增加2.2

    前言

    大家春节假期好哦,我是内个内个内个内个内个内~~~~

    1.不同时间的三组注解

    在旧版本中,Dubbo使用自己的@Service、@Referenc注解来标注服务与引用。
    或许是想与spring等框架的注解区分开,在2.7.7版本后,源码中的@Service、@Referenc被打上了@Deprecated注解,它们被使用的地方都被拦腰打上了横线,表示不建议使用。
    在这里插入图片描述
    定位到它们所在路径,发现总共有三种相似的注解

    在这里插入图片描述
    其实它们是Dubbo的三个不同时期的产物,它们的全路径名称如下

    // 2.7.x 之前,Alibaba时期
    com.alibaba.dubbo.config.annotation.Reference
    com.alibaba.dubbo.config.annotation.Service
    
    // 2.7.0之后,Apache时期
    org.apache.dubbo.config.annotation.Reference
    org.apache.dubbo.config.annotation.Service
    
    // 2.7.7之后
    org.apache.dubbo.config.annotation.DubboReference
    org.apache.dubbo.config.annotation.DubboService
    

    2.注解的升级

    2.1 @Reference

    @Reference 相关注解用来引用服务

    2.1.1 Alibaba @Reference -> Apache @Reference

    2.1.1.1 注解升级

    新增注解,路径从com.alibaba变成org.apache,旧注解打上@Deprecated

    2.1.1.2 属性增加

    2.7.0的Apache版本,比Alibaba的@Reference注解多了protocol、tags、methods、id五个属性,这次升级后,开发者可以做通过protocol指定协议等操作。
    在这里插入图片描述

    2.1.2 @Reference -> @DubboReference

    2.1.2.1 注解升级

    2.2.7版本,主要是新注解名称加上Dubbo前缀,显得更直观,旧注解打上@Deprecated
    在这里插入图片描述

    2.1.2.2 属性增加

    同时增加了merger、services属性
    在这里插入图片描述

    2.2 @Service

    @Service 相关注解用来暴露服务

    2.2.1 Alibaba @Service -> Apache @Service

    2.2.1.1 注解升级

    新增注解,路径从com.alibaba变成org.apache,旧注解打上@Deprecated

    2.2.1.2 属性修改与增加

    2.7.0的Apache版本,
    将export、register的默认值从false改为true,
    将回调callbacks默认值从空改为1,
    将重试次数retries默认值从空改为2
    将负载均衡loadbalance默认值从空改为rodom随机
    增加了methods、id两个属性
    在这里插入图片描述

    2.2.2 @Service -> @DubboService

    2.2.1.1 注解升级

    2.2.7版本,主要是新注解名称加上Dubbo前缀,显得更直观,旧注解打上@Deprecated,属性一点没改,改名的目的很单纯

    3.注解在源码中的整合

    首先不用多想,dubbo应该支持这三种注解,在老项目升级后也应该兼容老注解,那到底是不是这样,有两种验证方式:源码分析或使用新注解验证实际效果

    3.1 源码解析

    3.1.1 @Reference家族

    查看@DubboReference被使用的地方,除了测试类,只在ReferenceAnnotationBeanPostProcessor中出现,可以看出,此@Reference家族的三个注解都在ReferenceAnnotationBeanPostProcessor的构造方法中,被传入此类继承的AbstractAnnotationBeanPostProcessor构造方法中,所以这三个注解是被一视同仁的,在Spring项目中,不论使用三个之中哪种注解,都归ReferenceAnnotationBeanPostProcessor管,都会被一视同仁。
    在这里插入图片描述

    	//ReferenceAnnotationBeanPostProcessor:
    	/**
         * {@link com.alibaba.dubbo.config.annotation.Reference @com.alibaba.dubbo.config.annotation.Reference} has been supported since 2.7.3
         * <p>
         * {@link DubboReference @DubboReference} has been supported since 2.7.7
         */
        public ReferenceAnnotationBeanPostProcessor() {
        	//直接传入父构造器
            super(DubboReference.class, Reference.class, com.alibaba.dubbo.config.annotation.Reference.class);
        }
        
        //AbstractAnnotationBeanPostProcessor:
    	/**
         * @param annotationTypes the multiple types of {@link Annotation annotations}
         */
        public AbstractAnnotationBeanPostProcessor(Class<? extends Annotation>... annotationTypes) {
            Assert.notEmpty(annotationTypes, "The argument of annotations' types must not empty");
            //三个注解都放在annotationTypes中
            this.annotationTypes = annotationTypes;
        }
    
    	//annotationTypes三种类型再其他地方被如下逻辑挨个被使用
    	for (Class<? extends Annotation> annotationType : getAnnotationTypes()) {
    
                        AnnotationAttributes attributes = getAnnotationAttributes(bridgedMethod, annotationType, getEnvironment(), true, true);
        // ******
        }
    
    

    ReferenceAnnotationBeanPostProcessor就不展开了,说跑偏了。
    在这里插入图片描述

    3.1.2 @Service家族

    @Service家族分别在ServiceAnnotationResolver和ServiceClassPostProcessor中被使用,三者被一视同仁,查看源码的逻辑参考上一个@Reference家族的讲解

    public class ServiceAnnotationResolver {
    
        /**
         * The annotation {@link Class classes} of Dubbo Service (read-only)
         *
         * @since 2.7.9
         */
        public static List<Class<? extends Annotation>> SERVICE_ANNOTATION_CLASSES = unmodifiableList(asList(DubboService.class, Service.class, com.alibaba.dubbo.config.annotation.Service.class));
        // ******
    }
    public class ServiceClassPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware,
            ResourceLoaderAware, BeanClassLoaderAware {
    
        private final static List<Class<? extends Annotation>> serviceAnnotationTypes = asList(
                // @since 2.7.7 Add the @DubboService , the issue : https://github.com/apache/dubbo/issues/6007
                DubboService.class,
                // @since 2.7.0 the substitute @com.alibaba.dubbo.config.annotation.Service
                Service.class,
                // @since 2.7.3 Add the compatibility for legacy Dubbo's @Service , the issue : https://github.com/apache/dubbo/issues/4330
                com.alibaba.dubbo.config.annotation.Service.class
        );
        //******
    }
    

    3.2 使用方式

    源码自带使用方式

    3.2.1 @DubboReference 引用服务

    package org.apache.dubbo.demo.consumer.comp;
    
    import org.apache.dubbo.config.annotation.DubboReference;
    import org.apache.dubbo.demo.DemoService;
    
    import org.springframework.stereotype.Component;
    
    import java.util.concurrent.CompletableFuture;
    
    @Component("demoServiceComponent")
    public class DemoServiceComponent implements DemoService {
        @DubboReference
        private DemoService demoService;
    
        @Override
        public String sayHello(String name) {
            return demoService.sayHello(name);
        }
    
        @Override
        public CompletableFuture<String> sayHelloAsync(String name) {
            return null;
        }
    }
    
    

    3.2.2 @DubboService 暴露服务

    package org.apache.dubbo.demo.provider;
    
    import org.apache.dubbo.config.annotation.DubboService;
    import org.apache.dubbo.demo.DemoService;
    import org.apache.dubbo.rpc.RpcContext;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.concurrent.CompletableFuture;
    
    @DubboService
    public class DemoServiceImpl implements DemoService {
        private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);
    
        @Override
        public String sayHello(String name) {
            logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
            return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
        }
    
        @Override
        public CompletableFuture<String> sayHelloAsync(String name) {
            return null;
        }
    
    }
    
    

    4.总结

    总之来说,@DubboService与@Service、@DubboReference与@Referenc的关系就是更新换代,在使用方式和功能上基本一样,最新的注解是加Dubbo前缀的,使用起来更直观一些

    展开全文
  • @Component @Service @Controller @Repository
  • @Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容器中,不需要再在applicationContext.xml文件定义bean了。 用法如下: 在调用该service的时候只需要将该类注入接口...
  • @Bean和@Service

    千次阅读 2019-10-17 14:40:19
    @Configuration和@Bean的组合来创建Bean还是直接使用 @Service @Service public class JSR250WayService {} 方法里还要注入,@autowire @Autowired FunctionService functionService; 而使用@Bean @...
  • @Component @Controller @Service @Repository的作用 1、@controller 控制器(注入服务) 2、@service 服务(注入dao) 3、@repository dao(实现dao访问) 4、@component (把普通pojo实例化到spring容器中,相当...
  • @Repository、@Service、@Compent、@Controller与@Mapper、@MapperScan 一、@Repository、@Service、@Compent、@Controller区别 @Repository、@Service、@Compent、@Controller这四个注解标签都是Spring注解,都是...
  • 本篇文章主要介绍了Spring @Bean vs @Service注解区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 快速访问@Resource+@Service:@Autowired+@Service:@Autowired+@Component: @Resource+@Service: @Resource(name = &quot;captchaService&quot;) private CaptchaService captchaService; @Service(&...
  • @Component大致可以分为... @service服务(注入dao),用于标注业务层组件 @repository dao(实现dao访问),用于标注数据访问组件,即DAO组件 @component (把普通pojo实例化到spring容器中,相当于配置文件中的<bea...
  • @Component、@Repository @Service、@Controller 看字面含义,很容易却别出其中三个: @Controller 控制层,就是我们的action层 @Service 业务逻辑层,就是我们的service或者manager层 @Repository 持久层,就 ...
  • @Component为@Service、@Controller、@Repository的元注解,四个实现功能是一样的 不同点为区分业务层: @Component 业务特殊组件层,如handler类 @Controller 业务控制层 @Service 业务逻辑层 @Repository 业务...
  • @Service和@Autowired

    2019-09-21 05:18:54
    也可以手动指定@Service(“abc”)或@Service(value = “abc”) @Autowired优先根据属性类型匹配,根据属性类型只匹配到一个时,则直接使用,不再比较属性值;当匹配到多个时再根据属性名称匹配 @Autowired可以用在...
  • 解释: ...@Service 声明Service组件 @Service("myMovieLister") @Repository 声明Dao组件 @Autowired 用于注入 配置方位: @Repository ->(XXDaoImpl) , @Service("UserSer...
  • @Service 是springboot纳入容器管理的注解, 要在其他类中注入必须要@Repository、@Service 和 @Controller @Component这些注解,否则就只是一个普通的类。 @Service @Repository @Controller @Component ...
  • Spring @Component,@ Service,@ Repository,@ Controller差异 Spring @Component,@ Service,@ Repository和@Controller注释用于在Spring框架中扫描指定路径的类注册为bean。 @Component是一个通用注释。 @ ...
  • getBean的默认名称是类名(头字母小写),如果想自定义,可以@Service(“aaaaa”)这样来指定, 这种bean默认是单例的,如果想改变,可以使用@Service(“beanName”) @Scope(“prototype”)来改变。 可以使用以下...
  • @component是通用性的注解,@...所以@component可以替换为@service和@repository,但是为了规范,服务层bean用@service,dao层用@repository。就好比代码规范,变量、方法命名一样。还有一点,正如文档描述那样: @
  • 2、@service 服务(注入dao) 3、@repository dao(实现dao访问) 4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的) @Component,@Service,@Controller,@Repository注解的类...
  • Spring注解@Component、@Repository、@Service、@Controller区别

    万次阅读 多人点赞 2011-09-17 20:42:38
    很长时间没做web项目都把以前学的那点框架知识忘光了,今天把以前做的一个项目翻出来看一下发现用·@Component标记一个组件,而网上有的用@Service标记组件,我晕就查了一下资料: Spring 2.5 中除了提供 @Component...
  • Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。 在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的...
  • 2、@service 服务(注入dao) 3、@repository dao(实现dao访问) 4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的)  @Component,@Service,@Controller,@Repository注解的类,并把这些...
  • 1、@Controller、@Service、@Repository、@Component 注解的类会纳入 Spring 容器中进行管理,在需要使用的时候,只需要注入即可。 2、@Controller 用于标注控制层组件;@Service 用于标注业务层组件;@Repository ...
  • 引入了更多的Spring类注解:@Component,@Service,@Controller。 @Component是一个通用的Spring容器管理的单例bean组件。 而@Repository, @Service, @Controller就是针对不同的使用场景所采取的特定功能化的注解组件...
  • Spring Boot 项目中,我们有时候希望在 Interceptor 中注入的 @Service 组件,例如本人在后管项目中使用 Spring MVC Interceptor 做权限控制,此时 Interceptor 中需要使用 Service 中的方法读取用户权限信息,再...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,579
精华内容 17,031
关键字:

@service