Spring_11_基于注解配置

Spring 基于注解配置

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

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

代码:

<?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/>
<!-- bean definitions go here -->
</beans>
注解 描述
@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

<?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 />

    <bean id="student" class="com.tutorialspoint.Student">
        <property name="name" value="Zara"></property>
        <property name="age" value="11"></property>
    </bean>

</beans>

结果

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

<?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 />
    
    <bean id="textEditor" class="com.tutorialspoint.TextEditor"></bean>
    
    <bean id="aa" class="com.tutorialspoint.SpellChecker"></bean>
    
</beans>

个人小结:

在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

<?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 />

    <bean id="textEditor" class="com.tutorialspoint.TextEditor" />

    <bean id="aa" class="com.tutorialspoint.SpellChecker" />

</beans>

输出结果:

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

<?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 />

    <bean id="profile" class="com.tutorialspoint.Profile"/>
    
    <bean id="student1" class="com.tutorialspoint.Student">
        <property name="name" value="bean - student1 - name(value)"></property>
        <property name="age" value="11"></property>
    </bean>
    
    
    <bean id="student2" class="com.tutorialspoint.Student">
        <property name="name" value="bean - student2 - name(value)"></property>
        <property name="age" value="22"></property>
    </bean>
</beans>

输出结果:

Profile  类的空参构造     
Age:11
Name:bean - student1 - name(value)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 1.1 Spring IoC容器和bean简介 本章介绍了Spring Framework实现的控制反转(IoC)...
    起名真是难阅读 2,578评论 0 8
  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,707评论 2 22
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,796评论 6 342
  • 思你,年年空气发酵着的南国味道 念你,天天的朝暮与昏晓 经意或不经意,窗前短短的停留与路过 偷偷凝望彼此,也会引起...
    狗言残传阅读 204评论 0 0