Spring @Autowired 注释

本文内容纲要:

- 一个示例

- 属性中的 @Autowired

- 构造函数中的 @Autowired

- @Autowired 的(required=false)选项

@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

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

本文内容总结:一个示例,属性中的 @Autowired,构造函数中的 @Autowired,@Autowired 的(required=false)选项,

原文链接:https://www.cnblogs.com/youcoding/p/12785410.html

以上是 Spring @Autowired 注释 的全部内容, 来源链接: utcz.com/z/296293.html

回到顶部