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)