close

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();
   }
}
arrow
arrow
    全站熱搜

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