Spting2.5後就可以使用Annotation的部分,在使用上面(較容易)可以取代原先XML的設定,但若是遇上Annotation和XML衝突的時候,則會以XML為主。

  • Required (可使用在setter上)

Customer.java

package com.example ;

import org.springframework.beans.factory.annotation.Required;

public class Customer {

private String name ;
private int age ;
public String getName() {
return name;
}
@Required
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}

@Required
public void setAge(int age) {
this.age = age;
} 
}

Main.java

package com.example ;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Main {

public static void main(String[] args) {
ApplicationContext context = 
 new ClassPathXmlApplicationContext("Beans.xml");

Customer cust = (Customer) context.getBean("Customer");
System.out.println("name:"+cust.getName()) ;
System.out.println("age:"+cust.getAge()) ;

}

}

設定檔必需加入<context:annotation-config/>,在Annotation有Required設定的情況下,若設定檔無設定的情況會造成BeanInitializationException: Property 'age' is required for bean 'Customer'

Beans.xml

<context:annotation-config/> 
<!-- Definition for Customer bean -->
<bean id="Customer" class="com.example.Customer" >
<property name="name" value="Paul"/>
<!-- <property name="age" value="31"/> --> 
</bean>
  • Autowired (可使用在setter、constructor和property上)

1.setter

Customer.java

package com.example1;

import org.springframework.beans.factory.annotation.Autowired;

 
public class Customer 
{
private Address address;

public Address getAddress() {
return address;
}
@Autowired
public void setAddress(Address address) {
this.address = address;
}

@Override
public String toString() {
return "Customer [address=" + address + "]";
}

}

Address.java

package com.example1;
 
public class Address 
{
private String fulladdress;

public String getFulladdress() {
return fulladdress;
}

public void setFulladdress(String fulladdress) {
this.fulladdress = fulladdress;
}

@Override
public String toString() {
return "Address [fulladdress=" + fulladdress + "]";
}

}

Main.java

package com.example1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"Beans1.xml");

Customer cust = (Customer) context.getBean("customer");
System.out.println(cust);
}
}

Beans1.xml

<context:annotation-config/> 
<bean id="customer" class="com.example1.Customer" />
<bean id="address" class="com.example1.Address" >
 <property name="fulladdress" value="Taipei, TW" />
</bean>

結果顯示如下所示:

Customer [address=Address [fulladdress=Taipei, TW]]

2.constructor

Developer.java

package com.example2;
import org.springframework.beans.factory.annotation.Autowired;

public class Developer {
private Language language;

@Autowired
public Developer(Language language) {
this.language = language;
}

@Override
public String toString() {
return "Developer [language=" + language + "]";
}

}

Language.java

package com.example2;

public class Language {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "Language [name=" + name + "]";
}

}

Main.java

package com.example2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"Beans2.xml");

Developer developer = (Developer) context.getBean("developer");
System.out.println(developer);
}
}

Beans2.xml

<context:annotation-config/> 
<bean id="developer" class="com.example2.Developer"/>
<bean id="language" class="com.example2.Language" >
 <property name="name" value="Java" />
</bean>

結果顯示如下所示:

Developer [language=Language [name=Java]]

3.property

Person.java

package com.example3;

import org.springframework.beans.factory.annotation.Autowired;
 
public class Person 
{
@Autowired
private Ability ability;

public Ability getAbility() {
return ability;
}

public void setAbility(Ability ability) {
this.ability = ability;
}

@Override
public String toString() {
return "Person [ability=" + ability + "]";
}

}

Ability.java

package com.example3;
 
public class Ability 
{
private String skill;

public String getSkill() {
return skill;
}

public void setSkill(String skill) {
this.skill = skill;
}

@Override
public String toString() {
return "Ability [skill=" + skill + "]";
}

}

Main.java

package com.example3;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"Beans3.xml");

Person person = (Person) context.getBean("person");
System.out.println(person);
}
}

Beans3.xml

<context:annotation-config/> 
<bean id="person" class="com.example3.Person" />

<bean id="invisible" class="com.example3.Ability" >
 <property name="skill" value="Invisible" />
</bean>

結果顯示如下所示:

Person [ability=Ability [skill=Invisible]]

另外,@Autowired(required=false)的設定會使得抓到參數的值為default值。

Customer.java

package com.example ;

import org.springframework.beans.factory.annotation.Required;
import org.springframework.beans.factory.annotation.Autowired;

public class Customer {

private String name ;
private int age ;
public String getName() {
return name;
}
@Required
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}

@Autowired(required=false)
public void setAge(int age) {
this.age = age;
} 
}

Main.java

package com.example ;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Main {

public static void main(String[] args) {
ApplicationContext context = 
 new ClassPathXmlApplicationContext("Beans.xml");

Customer cust = (Customer) context.getBean("Customer");
System.out.println("name:"+cust.getName()) ;
System.out.println("age:"+cust.getAge()) ;

}

}

Beans.xml

<context:annotation-config/> 
<!-- Definition for Customer bean -->
<bean id="Customer" class="com.example.Customer" >
<property name="name" value="Paul"/>
<!-- <property name="age" value="31"/> --> 
</bean>

**結果顯示如下所示:

name:Paul

age:0

  • Qualifier

使用上需和Autowired一起使用,主要是用來確認何種bean需要被注入。

Customer.java

package com.example4;

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

 
public class Customer 
{

@Autowired
@Qualifier("address1")
private Address address;

public Address getAddress() {
return address;
}


public void setAddress(Address address) {
this.address = address;
}

@Override
public String toString() {
return "Customer [address=" + address + "]";
}

}

Address.java

package com.example4;
 
public class Address 
{
private String fulladdress;

public String getFulladdress() {
return fulladdress;
}

public void setFulladdress(String fulladdress) {
this.fulladdress = fulladdress;
}

@Override
public String toString() {
return "Address [fulladdress=" + fulladdress + "]";
}

}

Main.java

package com.example4;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"Beans4.xml");

Customer cust = (Customer) context.getBean("customer");
System.out.println(cust);
}
}

Beans4.xml

<context:annotation-config/> 
<bean id="customer" class="com.example4.Customer" />
<bean id="address1" class="com.example4.Address" >
 <property name="fulladdress" value="Taipei, TW" />
</bean>
<bean id="address2" class="com.example4.Address" >
 <property name="fulladdress" value="New York, American" />
</bean>

結果顯示如下所示:

Customer [address=Address [fulladdress=Taipei, TW]]

  • PostConstruct and PreDestroy

可針對物件初始化和物件銷毀做annotation

HelloWorld.java

package com.example5 ;
import javax.annotation.*;

public class HelloWorld {
private String message ;
@PostConstruct
public void init(){
System.out.println("Initialization now") ;
}

public void getMessage(){
 System.out.println("Your Message : " + message);
}

public void setMessage(String message) {
this.message = message;
}
@PreDestroy
public void destroy(){
System.out.println("Destory now") ;
}

}

Main.java

package com.example5 ;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

public static void main(String[] args) {
AbstractApplicationContext context = 
 new ClassPathXmlApplicationContext("Beans5.xml");

 HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
 obj.getMessage();
 context.registerShutdownHook();
}
}

Beans5.xml

<context:annotation-config/> 
<bean id="helloWorld" class="com.example5.HelloWorld" init-method="init" destroy-method="destroy"> 
<property name="message" value="Hello World!"/>
</bean>

結果顯示如下所示:

Initialization now

Your Message : Hello World!

Destory now

  • Configuration and Bean

利用Configuration and Bean Annotation可以不需使用設定檔。

HelloWorldConfig.java

package com.example6 ;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HelloWorldConfig {

@Bean 
public HelloWorld helloWorld(){
 return new HelloWorld();
}
@Bean 
public HelloWorld1 helloWorld1(){
 return new HelloWorld1();
}
}

上述程式碼的設定等同於

<beans>
 <bean id="helloWorld" class="com.example6.HelloWorld" />
</beans>
<beans>
 <bean id="helloWorld1" class="com.example6.HelloWorld1" />
</beans>

HelloWorld.java

package com.example6 ;

public class HelloWorld {
 private String message;

 public void setMessage(String message){
 this.message = message;
 }

 public String getMessage(){
 return message ;
 }
}

HelloWorld1.java

package com.example6 ;

public class HelloWorld1 {
 private String message1;

 public void setMessage(String message1){
 this.message1 = message1;
 }

 public String getMessage(){
 return message1 ;
 }
}

Main.java

package com.example6 ;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class Main {

public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(HelloWorldConfig.class);

HelloWorld obj = (HelloWorld) ctx.getBean(HelloWorld.class);
obj.setMessage("Hello world");
 System.out.println(obj.getMessage()) ; 
 
 HelloWorld1 obj1 = (HelloWorld1) ctx.getBean(HelloWorld1.class);
 obj1.setMessage("Hello world1");
 System.out.println(obj1.getMessage()) ; 
 
}
}

結果顯示如下所示:

Hello world

Hello world1

  • import
@Configuration
public class ConfigA {
 @Bean
 public A a() {
 return new A(); 
 }
}
@Configuration
@Import(ConfigA.class)
public class ConfigB {
 @Bean
 public B a() {
 return new A(); 
 }
}
public static void main(String[] args) {
 ApplicationContext ctx = 
 new AnnotationConfigApplicationContext(ConfigB.class);
 A a = ctx.getBean(A.class);
 B b = ctx.getBean(B.class);
}
  • init-method and destroy-method
public class Foo {
 public void init() {
 // initialization logic
 }
 public void cleanup() {
 // destruction logic
 }
}

@Configuration
public class AppConfig {
 @Bean(initMethod = "init", destroyMethod = "cleanup" )
 public Foo foo() {
 return new Foo();
 }
}
  • scope
@Configuration
public class AppConfig {
 @Bean
 @Scope("prototype")
 public Foo foo() {
 return new Foo();
 }
}
文章標籤
全站熱搜
創作者介紹
創作者 Codeless 的頭像
Codeless

Codeless的部落格

Codeless 發表在 痞客邦 留言(0) 人氣(20)