2015-09-25 95 views
0

如何寫一個完全基於註解配置春天註解基地配置

@Component 
public class MessageServiceHelper { 
    @Autowired 
    @Qualifier("emailService") 
    private MessageService messageService; 

    public MessageService getMessageService() { 
     return messageService; 
    } 

    public void setMessageService(MessageService messageService) { 
     this.messageService = messageService; 
    } 

    public boolean sendMessage(String message){ 
     return this.messageService.sendMessage(message); 
    } 


@Component 
@Qualifier("emailService") 
public class EmailServiceImpl implements MessageService { 

    @Override 
    public boolean sendMessage(String message) { 
     System.out.println("EmailServiceImpl.sendMessage " + message); 
     return true; 
    } 
} 


@Component 
public interface MessageService { 
    boolean sendMessage(String message); 
} 

@Component 
public class SmsServiceImpl implements MessageService { 
    @Override 
    public boolean sendMessage(String message) { 
     System.out.println("SmsServiceImpl.sendMessage " + message); 
     return true; 
    } 
} 

public class Application { 
    @Autowired 
    MessageServiceHelper messageServiceHelper; 

    @Autowired 
    public Application application; 
    public static void main(String[] args) { 
     //How can I get messageservicehelper here and call the method. 

    } 
} 

所以基本上的事情是我不想在我的任何配置XML文件,我怎麼能做到這一點?

更新

我不想使用javabased配置是它可以配置Spring沒有配置在XML什麼?

+0

您已經使用基於Java的配置,因爲你有一個'@ Configuration'類... –

+0

所以你不想使用註釋或XML配置? –

+0

@ M.Deinum我已刪除@配置 – eatSleepCode

回答

2

首先對清理你的代碼放在註釋一個接口不會工作。接下來@Configuration@Component,那麼這個類配置或者一個組件不會嘗試這兩者。通常是一個糟糕的主意

您正在使用字段級註釋,因此您的getter和setter不添加任何內容,只添加未使用的代碼。我也建議使用構造函數注入而不是setter或field注入。 (關於爲什麼野外注射是邪惡的閱讀this post)。

所有這些應用會導致下面的代碼。

MessageServiceHelper用構造函數而不是setter或field注入。

@Component 
public class MessageServiceHelper { 
    private final MessageService messageService; 

    @Autowired 
    public MessageServiceHelper(@Qualifier("emailService") MessageService messageService) { 
     this.messageService=messageService; 
    } 

    public boolean sendMessage(String message){ 
     return this.messageService.sendMessage(message); 
    } 
} 

MessageService及其實現。

public interface MessageService { 
    boolean sendMessage(String message); 
} 

EmailServiceImpl

@Component 
@Qualifier("emailService") 
public class EmailServiceImpl implements MessageService { 

    @Override 
    public boolean sendMessage(String message) { 
     System.out.println("EmailServiceImpl.sendMessage " + message); 
     return true; 
    } 
} 

SmsServiceImpl

@Configuration

@Configuration 
@ComponentScan(basePackages = "demo.di") 
public class ApplicationConfiguration {} 

而且該應用程序的啓動器。

public class Application 

    public static void main(String[] args) { 
     ApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfiguration.class); 
     MessageHelper helper = ctx.getBean(MessageHelper.class); 
     helper.sendMessage("Hello World!"); 
    } 
} 

如果你不想使用@Configuration(最終你會當你想使用類似交易的事情,AOP等,它們)的使用,這需要String...的構造,並通過demo.di,而不是類的。這將從該包開始掃描所有@Component s。

public class Application 

    public static void main(String[] args) { 
     ApplicationContext ctx = new AnnotationConfigApplicationContext("demo.di"); 
     MessageHelper helper = ctx.getBean(MessageHelper.class); 
     helper.sendMessage("Hello World!"); 
    } 
} 
-1

有4種方式,你可以配置Spring上下文:

  1. XML配置
  2. 註解爲基礎的配置
  3. 基於Java的配置
  4. Groovy的配置文件

在每你必須告訴spring哪裏可以找到spring bean的定義。

與基於Java的配置的情況下,你可以嘗試這樣的事情來引導Spring上下文:

AnnotationConfigApplicationContext context = 
    new AnnotationConfigApplicationContext (Application.class); 
MessageServiceHelper helper= context.getBean(MessageServiceHelper.class); 

參考Spring Docs更多信息

+0

這是舊的,很舊,不再維護。那是Spring的java配置項目,現在(大部分)已經融入了Spring的核心。 –

+0

@ M.Deinum真。編輯我的答案 – pomkine