如何编写基于完全注释的配置
@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 :(得分:2)
首先清理代码,在界面上添加注释是不行的。下一个@Configuration
是@Component
,因此这个类配置或组件不会尝试同时执行这两个操作。一般来说是个坏主意。
您正在使用字段级注释,因此您的getter和setter不会添加任何内容,只会添加未使用的代码。我还建议使用构造函数注入而不是setter或field injection。 (关于为什么字段注入是邪恶的阅读this post)。
所有这些都会导致以下代码。
使用构造函数而不是setter或field injection的MessageServiceHelper
。
@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
。
@Component
public class SmsServiceImpl implements MessageService {
@Override
public boolean sendMessage(String message) {
System.out.println("SmsServiceImpl.sendMessage " + message);
return true;
}
}
@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 :(得分:-1)
您可以通过4种方式配置弹簧上下文:
在每个配置中,您必须告诉spring在哪里找到spring bean定义。
对于基于Java的配置,你可以尝试这样的东西来引导spring上下文:
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext (Application.class);
MessageServiceHelper helper= context.getBean(MessageServiceHelper.class);
有关详细信息,请参阅as Andrew pointed out