zoukankan      html  css  js  c++  java
  • @Autowired、@Resource、和@Service注解详解

    注解之前spring怎么装配bean

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事务。我们先看一个不使用注解的Spring示例,在这个示例的基础上,改成注解版本的,这样也能看出使用与不使用注解之间的区别,先定义一个老师:

    public class Teacher{
        private String teacherName = "TW";
        public String toString() {
            return "TeacherName:" + teacherName;
        }
    }
    复制代码

    再定义一个学生:

    public class Student{
        private String studentName = "SL";
        public String toString() {
            return "StudentName:" + studentName;
        }
    }
    复制代码

    然后定义一个学校:

    public class School{
        private Teacher teacher;
        private Student student;
        public void setTeacher(Teacher teacher){
            this.teacher = teacher;
        }
        public void setStudent(Student student){
            this.student = student;
        }
        public Teacher getTeacher(){
            return teacher;
        }
        public Student getStudent(){
            return student;
        }
        public String toString(){
            return teacher + "
    " + student;
        }
    }
    复制代码

    spring的配置文件这么写:

    <?xml version="1.0" encoding="UTF-8"?>
    <bean id="school" class="com.zxt.bean.School" >
        <property name="teacher" ref="teacher" />
        <property name="student" ref="student" />
    </bean>
    <bean id="teacher" class="com.zxt.uu.Teacher" />
    <bean id="student" class="com.zxt.uu.Student" />
    复制代码

    这是最初始的.xml配置,很显然这么做有两个缺点:

    1. 如果所有的内容都配置在.xml文件中,会导致.xml文件过大;如果按需求分开.xml文件,又会导致.xml文件过多。总之这会使得配置文件的可读性与可维护性变得很低。
    2. 开发中,在.java文件和.xml文件之间不断切换,是一件麻烦的事。同时这种思维上的不连贯也会降低开发的效率。

    为了解决这两个问题,Spring引入了注解,通过@注解名的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。

    @Autowired

    顾名思义,就是自动装配。其作用是替代Java代码里面的getter/setter与bean属性中的property。如果私有属性需要对外提供的话,getter应当予以保留。引入@Autowired注解,先看一下spring配置文件怎么写:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
     3     xmlns="http://www.springframework.org/schema/beans"  
     4     xmlns:context="http://www.springframework.org/schema/context"  
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
     7         http://www.springframework.org/schema/context
     8         http://www.springframework.org/schema/context/spring-context-4.2.xsd">
     9     
    10     <context:component-scan base-package="com.zxt" />
    11     
    12     <bean id="school"  class="com.zxt.bean.School" />
    13     <bean id="teacher" class="com.zxt.uu.Teacher" />
    14     <bean id="student" class="com.zxt.uu.Student" />
    15     
    16 </beans>
    复制代码

    注意第10行,为了实现bean的自动载入,必须配置spring的扫描器。

    在base-package指明一个包:

    <context:component-scan base-package=“com.zxt”/>
    复制代码

    表明com.zxt包及其子包中,如果某个类的头上带有特定的注解@Component@Repository@Service@Controller,就会将这个对象作为Bean注入进spring容器。

    看到第12行,原来school里面应当注入两个属性teacher、student,现在不需要注入了。再看下,School.java也很简练,把getter/setter都可以去掉:

    public class School{
        @Autowired
        private Teacher teacher;
        @Autowired
        private Student student;
        public String toString(){
            return teacher + "
    " + student;
        }
    }
    复制代码

    这里@Autowired注解的意思就是,当Spring发现@Autowired注解时,将自动在代码上下文中找到与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。

    @Resource

    @Resource注解作用与@Autowired非常相似。先看一下@Resource,直接写School.java了:

    public class School{
        @Resource(name = "teacher")
        private Teacher teacher;
        @Resource(type = Student.class)
        private Student student;
        public String toString(){
            return teacher + "
    " + student;
        }
    }
    复制代码

    这是详细一些的用法,说一下@Resource的装配顺序:

    1. @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配。
    2. 指定了name或者type则根据指定的类型去匹配bean。
    3. 指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都会报错。

    @Autowired和@Resource两个注解的区别:

    1. @Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
    2. @Autowired是Spring的注解,@Resource是J2EE的注解,根据导入注解的包名就可以知道。
    3. Spring属于第三方的,J2EE是Java自己的东西。因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

    @Service

    使用@Service,可以更加简化.xml文件配置。

    因为spring的配置文件里面还有12行~14行三个bean,应用spring配置文件里面一个自动扫描的标签,可以把这三个bean也给去掉,增强Java代码的内聚性并进一步减少配置文件。先看一下配置文件:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
     3     xmlns="http://www.springframework.org/schema/beans"  
     4     xmlns:context="http://www.springframework.org/schema/context"  
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
     7         http://www.springframework.org/schema/context
     8         http://www.springframework.org/schema/context/spring-context-4.2.xsd">
     9     
    10     <context:component-scan base-package="com.zxt" />
    11 </beans>
    复制代码

    配置文件看起来特别清爽。School.java,Teacher.java和Student.java分别做如下修改:

    @Service 
    public class School{ 
        @Autowired 
        private Teacher teacher; 
        @Autowired 
        private Student student; 
        public String toString(){ 
            return teacher + "
    " + student; 
        } 
    } 
    复制代码
    @Service 
    public class Teacher{
        private String teacherName = "TW";
        public String toString() {
            return "TeacherName:" + teacherName;
        }
    }
    复制代码
    @Service
    public class Student{
        private String studentName = "SL";
        public String toString() {
            return "StudentName:" + studentName;
        }
    }
    复制代码

    这样,School.java在Spring容器中存在的形式就是"school",即可以通过ApplicationContext的getBean("school")方法来得到School.java。

    @Service注解,其实做了两件事情:

    1. 声明School.java是一个bean。这点很重要,因为School.java是一个bean,其他的类才可以使用@Autowired将School作为一个成员变量自动注入。
    2. School.java在bean中的id是"school",即类名且首字母小写。


    作者:DC_er
    链接:https://juejin.cn/post/6844904020012711949
    来源:掘金

  • 相关阅读:
    Asp.Net Core- 配置组件详解
    ASP.Net Core-依赖注入IoC
    ASP.Net Core-TagHelpers
    Selenium-等待
    Selenium-js
    Selenium-actions
    Selenium-基础操作
    Selenium-简介
    装饰者模式
    设计模式-策略者模式
  • 原文地址:https://www.cnblogs.com/cbugs/p/14178909.html
Copyright © 2011-2022 走看看