微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring(七)之基于注解配置

基于注解的配置

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

在 XML 注入之前进行注解注入,因此后者的配置将通过两种方式的属性连线被前者重写。

 

一、@required注解

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

(1)编写Student.java

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

 

(2)编写MainApp.java

 com.tutorialspoint;

 org.springframework.context.ApplicationContext;
 org.springframework.context.support.ClasspathXmlApplicationContext;

 MainApp {
    static  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() );
       }}

 

(3)编写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-4.0.xsd
    http:www.springframework.org/schema/context
    http:www.springframework.org/schema/context/spring-context-4.0.xsd">


  <context:annotation-config/>

   <!-- DeFinition for student bean -->
   <bean id="student" class="com.tutorialspoint.Student">
      <property name="name"  value="Zara" />

      <!-- try without passing age and check the result -->
      <property name="age"  value="11"/>
   </bean>
   
</beans>

(4)运行MainApp.java中的main方法

如图:

 

这是正常流程

 

异常流程只需将Beans.xml改成如下,再运行main方法:

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"www.springframework.org/schema/context/spring-context-4.0.xsd">


 <context:annotation-config/>

   <!-- DeFinition try without passing age and check the result -->
      <!--<property name="age"  value="11"/>-->
   </bean>
   
</beans>

 

控制台最后的结果如下:

 

 我想大家应该明白了,@required注解的作用,其实这个注解与input中的required属性倒有其相同点,必填不能为空。

 

二、AutoWired注解

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

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

 

演示示例:

1.编写TextEditor.java

 org.springframework.beans.factory.annotation.Autowired;
 TextEditor {
    SpellChecker spellChecker;
   @Autowired
    setSpellChecker( SpellChecker spellChecker ){
      this.spellChecker = spellChecker;
   }
    SpellChecker getSpellChecker( ) {
       spellCheck() {
      spellChecker.checkSpelling();
   }
}

 

2.编写SpellChecker.java

 SpellChecker {
    SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
   }
    checkSpelling(){
      System.out.println("Inside checkSpelling." );
   }  
}

 

3.编写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-4.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd">


   context:annotation-config/>

   <!-- DeFinition for textEditor bean without constructor-arg  -->
   bean id="textEditor" class="com.tutorialspoint.TextEditor">
   </bean>

    DeFinition for spellChecker bean ="spellChecker"="com.tutorialspoint.SpellChecker">

   
beans>

4.编写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();
   }
}

5.运行MainApp.java中的main方法

结果如下:

@AutoWired 自动装配 它的一个属性required属性值是boolean类型,认为true,必须,也可以修改为false,非必须。

 

三、Qualifier注解

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

(1)编写Student.java

 String name;
    age;
   }   
    name;
   }  
    name;
   }
}

 

(2)编写Profile.java

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

 Profile {
       @Autowired
       @Qualifier("student1")
        Student student;
        Profile(){
          System.out.println("Inside Profile constructor." );
       }
        printAge() {
          System.out.println("Age : " + student.getAge() );
       }
        printName() {
          System.out.println("Name : " + student.getName() );
       }
}

 

(3)编写MainApp.java

 org.springframework.context.support.ClasspathXmlApplicationContext;
 MainApp {
     );
          Profile profile = (Profile) context.getBean("profile");
          profile.printAge();
          profile.printName();
       }
}

 

(4)编写Beans.xml

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"www.springframework.org/schema/context/spring-context-4.0.xsd">


   <context:annotation-config/>

   <!-- DeFinition for profile bean -->
   <bean id="profile" class="com.tutorialspoint.Profile">
   </bean>

   <!-- DeFinition for student1 bean -->
   <bean id="student1" class="com.tutorialspoint.Student">
      <property name="name"  value="Zara" />
      <property name="age"  value="11"/>
   </bean>

   <!-- DeFinition for student2 bean -->
   <bean id="student2" class="com.tutorialspoint.Student">
      <property name="name"  value="Nuha" />
      <property name="age"  value="2"/>
   </bean>

   
</beans>

 

(5)运行MainApp.java对应的main方法

 

四、Spring JSR-250 注释

Spring还使用基于 JSR-250 注释,它包括 @postconstruct, @PreDestroy 和 @Resource 注释。因为你已经有了其他的选择,尽管这些注释并不是真正所需要的,但是关于它们仍然让我给出一个简短的介绍。

 

@postconstruct 和 @PreDestroy 注释:

为了定义一个 bean 的安装和卸载,我们使用 init-method 和/或 destroy-method 参数简单的声明一下 。init-method 属性指定了一个方法,该方法在 bean 的实例化阶段会立即被调用。同样地,destroy-method 指定了一个方法,该方法只在一个 bean 从容器中删除之前被调用

你可以使用 @postconstruct 注释作为初始化回调函数一个替代,@PreDestroy 注释作为销毁回调函数一个替代,其解释如下示例所示。

 

演示示例:

(1)编写HelloWorld.java

import javax.annotation.*;
 HelloWorld {
    String message;
    setMessage(String message){
      this.message  = message;
   }
    String getMessage(){
      System.out.println("Your Message : " + message);
       message;
   }
   @postconstruct
    init(){
      System.out.println("Bean is going through init.");
   }
   @PreDestroy
    destroy(){
      System.out.println("Bean will destroy Now.");
   }
}

 

(2)编写Beans.xml

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"www.springframework.org/schema/context/spring-context-4.0.xsd">


   <context:annotation-config/>

   <bean id="helloWorld" 
       class="com.tutorialspoint.HelloWorld"
       init-method="init" destroy-method="destroy">
       <property name="message" value="Hello World!"/>
   </bean>

   
</beans>

 

(3)编写MainApp.java并运行对应的main方法

 org.springframework.context.support.AbstractApplicationContext;
 main(String[] args) {
          AbstractApplicationContext context = 
                              );
          HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
          obj.getMessage();
          context.registerShutdownHook();
       }
}

 

结果如图:

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐