• Spring @Autowired 注释


    @Autowired 注释可以在 setter 方法中被用于自动连接 bean。

    你可以在 XML 文件中的 setter 方法中使用 @Autowired 注释来除去 元素。

    当 Spring遇到一个在 setter 方法中使用的 @Autowired 注释,它会在方法中执行 byType 自动连接。

    一个示例

    • 新建Spring项目

    • 创建 Java 类 TextEditor, SpellChecker 和 MainApp

    这里是 TextEditor.java 文件的内容:

    package hello;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class TextEditor {
        private SpellChecker spellChecker;
    
        @Autowired
        public void setSpellChecker(SpellChecker spellChecker){
            System.out.println("Inside setSpellChecker.");
            this.spellChecker = spellChecker;
        }
        // a getter method to return spellChecker
        public SpellChecker getSpellChecker(){
            return spellChecker;
        }
    
        public void spellCheck(){
            spellChecker.checkSpelling();
        }
    }
    

    下面是另一个依赖的类文件 SpellChecker.java 的内容:

    package hello;
    
    public class SpellChecker {
        public SpellChecker(){
            System.out.println("Inside SpellChecker constructor");
        }
        public void checkSpelling(){
            System.out.println("Inside checkSpelling.");
        }
    }
    

    下面是 MainApp.java 文件的内容:

    package hello;
    //import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MainApp {
        public static void main(String[] args) {
            ApplicationContext context =
                    new ClassPathXmlApplicationContext("Beans.xml");
            TextEditor te = (TextEditor) context.getBean("textEditor");
            te.spellCheck();
        }
    }
    

    下面是配置文件 Beans.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
           <context:annotation-config/>
    
        <!-- Definition for textEditor bean without constructor-arg  -->
        <bean id="textEditor" class="hello.TextEditor" >
        </bean>
    
        <!-- Definition for spellChecker bean -->
        <bean id="spellChecker" class="hello.SpellChecker">
    
        </bean>
    
    </beans>
    

    运行结果如下:

    Inside SpellChecker constructor
    Inside setSpellChecker.
    Inside checkSpelling.
    

    属性中的 @Autowired

    你可以在属性中使用 @Autowired 注释来除去 setter 方法。

    当时使用 为自动连接属性传递的时候,Spring 会将这些传递过来的值或者引用自动分配给那些属性。

    利用在属性中 @Autowired 的用法,你的 TextEditor.java 文件将变成如下所示:

    package hello;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class TextEditor {
        @Autowired
        private SpellChecker spellChecker;
        public TextEditor(){
            System.out.println("Inside TextEditor constructor");
        }
        // a getter method to return spellChecker
        public SpellChecker getSpellChecker(){
            return spellChecker;
        }
    
        public void spellCheck(){
            spellChecker.checkSpelling();
        }
    }
    

    下面是配置文件 Beans.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
           <context:annotation-config/>
    
        <!-- Definition for textEditor bean   -->
        <bean id="textEditor" class="hello.TextEditor" >
        </bean>
    
        <!-- Definition for spellChecker bean -->
        <bean id="spellChecker" class="hello.SpellChecker">
    
        </bean>
    
    </beans>
    

    运行结果如下

    Inside TextEditor constructor
    Inside SpellChecker constructor
    Inside checkSpelling.
    

    构造函数中的 @Autowired

    也可以在构造函数中使用 @Autowired。

    一个构造函数 @Autowired 说明当创建 bean 时,即使在 XML 文件中没有使用 元素配置 bean ,构造函数也会被自动连接。

    下面的示例。

    这里是 TextEditor.java 文件的内容:

    package hello;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class TextEditor {
        private SpellChecker spellChecker;
        @Autowired
        public TextEditor(SpellChecker spellChecker){
            System.out.println("Inside TextEditor constructor");
            this.spellChecker = spellChecker;
        }
    
        public void spellCheck(){
            spellChecker.checkSpelling();
        }
    }
    

    下面是配置文件 Beans.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
           <context:annotation-config/>
    
        <!-- Definition for textEditor bean without constructor-arg  -->
        <bean id="textEditor" class="hello.TextEditor" >
        </bean>
    
        <!-- Definition for spellChecker bean -->
        <bean id="spellChecker" class="hello.SpellChecker">
    
        </bean>
    
    </beans>
    

    运行结果如下

    Inside SpellChecker constructor
    Inside TextEditor constructor
    Inside checkSpelling.
    

    @Autowired 的(required=false)选项

    默认情况下,@Autowired 注释意味着依赖是必须的,它类似于 @Required 注释,然而,你可以使用 @Autowired 的 (required=false) 选项关闭默认行为。

    即使你不为 age 属性传递任何参数,下面的示例也会成功运行,但是对于 name 属性则需要一个参数。

    你可以自己尝试一下这个示例,因为除了只有 Student.java 文件被修改以外,它和 @Required 注释示例是相似的。

    Student.java 文件内容:

    package hello;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class Student {
        private int age;
        String name;
        @Autowired(required = false)
        public void setAge(int age){
            this.age = age;
        }
        public int getAge(){
            return age;
        }
        @Autowired
        public void setName(String name){
            this.name = name;
        }
        public String getName(){
            return name;
        }
    
    }
    

    其中,setAge()方法使用 @Autowired 的 (required=false) 选项关闭默认行为。

    配置文件 Beans.xml如下

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
           <context:annotation-config/>
    
        <!-- Definition for textEditor bean without constructor-arg  -->
        <bean id="student" class="hello.Student" >
            <property name="name" value="番茄"></property>
        </bean>
    
    </beans>
    

    这里,,没有XML文件中设置属性age的值,仍能正确运行该程序,结果如下:

    name: 番茄
    age: 0
    

    每天学习一点点,每天进步一点点。

  • 相关阅读:
    ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)
    ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务
    电子模块 001 --- 遥杆 JoyStick
    ROS Learning-011 beginner_Tutorials (编程) 编写 ROS 话题版的 Hello World 程序(Python版)
    STM32 C++编程 002 GPIO类
    Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识
    STM32 C++编程 001 工程模板
    ROS Learning-010 beginner_Tutorials 编写简单的启动脚本文件(.launch 文件)
    Python 网络爬虫 001 (科普) 网络爬虫简介
    Python 黑客 --- 002 入门级 ZIP压缩文件口令暴力破解机
  • 原文地址:https://www.cnblogs.com/youcoding/p/12785410.html
Copyright © 2020-2023  润新知