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(); } } ? 结果如图: ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |