Spring_11_基于注解配置

Spring 基于注解配置

 从Spring2.5开始就可以使用注解来配置依赖注入.而不是采用xml来表述一个bean.你可以使用相关类,方法或字段声明的注解,将bean配置移动到组件类本身。

注解连线在默认情况下Spring容器不打开,因此,在可以使用基于注解的连线之前,我们将需要再我们的Spring配置文件中启用它.所以如果你项在Spring应用程序中使用任何注解,可以考虑到下面的配置.

代码:






注解 描述
@Required 此注解应用与bean属性的setter方法.
@Autowired 此注解可以应用到bean属性的setter方法,非setter方法,构造函数和属性.
@Qualifier 通过指定确切的将被连线的bean@Autowired 和@Qualifier注解可以用来删除混乱
JSR-250 Annotations Spring 支持 JSR-250 的基础的注解,其中包括了 @Resource,@PostConstruct 和 @PreDestroy 注解。

Spring @Required 注释

@Required 注释应用与bean属性的setter方法,表明受影响的bean属性配置时必须放在XML配置文件中,否则容器就会抛出一个BeanInitializationException 异常,下面显示的是一个使用@Required 注释的示例.

示例:

步骤 描述
1 创建一个名为 SpringExample 的项目,并且在所创建项目的 c src 文件夹下创建一个名为 com.tutorialspoint的包
2 使用 Add External JARs 选项添加所需的 Spring 库文件,就如在 Spring Hello World Example 章节中解释的那样。
3 在 com.tutorialspoint 包下创建 Java 类 Student 和 MainApp.
4 在src 文件夹下创建 Beans 配置文件 Beans.xml 。
5 最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并且按如下解释的那样运行应用程序。

Student.java

package com.tutorialspoint;

import org.springframework.beans.factory.annotation.Required;

public class Student {
    private Integer age;
    private String name;
    
    public Integer getAge() {
        return age;
    }
    @Required
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    @Required
    public void setName(String name) {
        this.name = name;
    }
    

}

MainApp.java

package com.tutorialspoint;

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");
        Student student = (Student) context.getBean("student");
        System.out.println("Name:" + student.getName());
        System.out.println("Age:" + student.getAge());
    }
}

Beans.xml




    

    
        
        
    


结果

Name:Zara
Age:11

个人小结:

刚加载Beans.xml的时候扫描bean实体并初始化,当获得bean对象的时候就已经赋值成功.

Spring @Autowired 注释

@Autowired 注释在哪里如何完成自动连接提供了更多的细微的控制.

@Autowired注释可以在setter方法中被用于自动连接bean,就像@Autowired注释,容器,一个属性或者任意命名的可能带有多个参数的方法.

Setter方法中的@AUTOwired

你可以在XML文件中的setter方法中使用@Autowired注释来除去元素.当Spring遇到一个在setter方法中使用@Autowired注释,它会在方法中试图执行byType自动连接.

示例:

步骤 描述
1 创建一个名为 SpringExample 的项目,并且在所创建项目的 c src 文件夹下创建一个名为 com.tutorialspoint的包
2 使用 Add External JARs 选项添加所需的 Spring 库文件,就如在 Spring Hello World Example 章节中解释的那样.
3 在 com.tutorialspoint 包下创建 Java 类 TextEditor , SpellChecker 和 MainApp.
4 在src 文件夹下创建 Beans 配置文件 Beans.xml 。
5 最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并且按如下解释的那样运行应用程序。

TextEditor.java

package com.tutorialspoint;

import org.springframework.beans.factory.annotation.Autowired;

public class TextEditor {
    private SpellChecker spellChecker;

    public SpellChecker getSpellChecker() {
        return spellChecker;
    }

    @Autowired
    public void setSpellChecker(SpellChecker spellChecker) {
        this.spellChecker = spellChecker;
    }
    public void spellCheck(){
        spellChecker.checkSpelling();
    }
    

}

SpellChecker.java

package com.tutorialspoint;

public class SpellChecker {

    public SpellChecker() {
        System.out.println(" SpellChecker     的 构造方法");
    }

    public void checkSpelling() {
        System.out.println("SpellChecker 中的  checkSpelling() 方法");
    }

}

MainApp.java

package com.tutorialspoint;

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




    
    
    
    
    
    

个人小结:

在setter方法上加入@Autowired , 会去找setter方法中参数的类型,再去bean中去找匹配的类型.

属性中的@Autowired

你可以在属性中使用@Autowired注释来除去setter方法.当时使用为自动连接属性传递的时候,Spring会将这些传递过来的值或者引用自动分配给那些属性.所以利用在属性中的@Autowired 的用法,你的TextEditor.java文件将变成如下所示

TextEditor.java

package com.tutorialspoint;

import org.springframework.beans.factory.annotation.Autowired;

public class TextEditor {
    @Autowired
    private SpellChecker spellChecker;
    
    
    public TextEditor() {
        System.out.println("TextEditor 类  的    空参构造方法");
    }

    public void spellCheck(){
        spellChecker.checkSpelling();
    }
    

}

Beans.xml




    

    

    


输出结果:

TextEditor 类  的    空参构造方法
 SpellChecker     的 构造方法
SpellChecker 中的  checkSpelling() 方法

构造函数中的@Autowired

你也可以在构造函数中使用@Autowired . 一个构造函数@Autowired 说明当创建bean时,即使在XML文件中没有使用元素配置bean,构造函数也会被自动连接. 我们来修改下列示例

TextEditor.java

package com.tutorialspoint;

import org.springframework.beans.factory.annotation.Autowired;

public class TextEditor {
    
    private SpellChecker spellChecker;
        
    @Autowired
    public TextEditor(SpellChecker spellChecker) {
        System.out.println("TextEditor  类中的构造方法    参数 --spellChecker");
        this.spellChecker = spellChecker;
    }

    public void spellCheck(){
        spellChecker.checkSpelling();
    }
    

}

其他代码不变

结果:

 SpellChecker     的 构造方法
TextEditor  类中的构造方法    参数 --spellChecker
SpellChecker 中的  checkSpelling() 方法

@Autowired的(required=false)选项

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

即使你不为age属性传递任何参数,下面示例也会成功运行,但是对于name属性则需要一个参数.你可以自己尝试一下这个示例,因为除了只有Sutdent.java文件被修改外,它和@Required注释示例是相似的.

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

Spirng @Qualifile 注释

可能会有这样一种情况,当你创建多个具有相同类型的bean时,并且项要用一个属性为它们其中的一个进行装配,在这种情况下,你可以使用@Qualifiler注释和@Autowired注释通过指定哪一个真正的bean将会被装配来取消混乱.下面显示的是使用@Qualifiler 注释的一个示例.

示例:

步骤 描述
1 创建一个名为 SpringExample 的项目,并且在所创建项目的 c src 文件夹下创建一个名为 com.tutorialspoint 的包。
2 使用 Add External JARs 选项添加所需的 Spring 库文件,就如在 Spring Hello World Example 章节中解释的那样。
3 在 com.tutorialspoint 包下创建 Java 类 Student , Profile 和 MainApp 。
4 在src 文件夹下创建 Beans 配置文件 Beans.xml 。
5 最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并且按如下解释的那样运行应用程序。

Student.java

package com.tutorialspoint;

public class Student {
    private Integer age;
    private String name;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Profile.java

package com.tutorialspoint;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class Profile {

    @Autowired
    @Qualifier("student1")
    private Student student;

    public Profile() {
        System.out.println("Profile  类的空参构造     ");
    }

    public void printAge() {
        System.out.println("Age:" + student.getAge());
    }

    public void printName() {
        System.out.println("Name:" + student.getName());
    }

}

MainApp.java

package com.tutorialspoint;

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");
        Profile profile = (Profile) context.getBean("profile");
        profile.printAge();
        profile.printName();
    }
}

Beans.xml




    

    
    
    
        
        
    
    
    
    
        
        
    

输出结果:

Profile  类的空参构造     
Age:11
Name:bean - student1 - name(value)

你可能感兴趣的:(Spring_11_基于注解配置)