Google Guice Provider Binding提供了更加灵活的依赖注入,根据用户特定需求绑定特定依赖实现,主要有两种方式,第一种是@Provides注解方式,第二种是自定义Provider实现Provider接口的方式。
一。ChatDao.java
package com.template.chat;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 8/4/11
* Time: 4:39 PM
* To change this template use File | Settings | File Templates.
*/
public interface ChatDao {
void send(String message);
String receive();
}
二。ChatDaoImpl.java
package com.template.chat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 8/4/11
* Time: 4:39 PM
* To change this template use File | Settings | File Templates.
*/
public class ChatDaoImpl implements ChatDao {
private Logger logger = LoggerFactory.getLogger(ChatDaoImpl.class);
@Override
public void send(String message) {
logger.info(message);
}
@Override
public String receive() {
return "receive message content!";
}
}
三。ChatService.java
package com.template.chat;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 8/4/11
* Time: 4:42 PM
* To change this template use File | Settings | File Templates.
*/
public interface ChatService {
void send(String message);
String receive();
}
四。ChatServiceImpl.java
package com.template.chat;
import com.google.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 8/4/11
* Time: 4:43 PM
* To change this template use File | Settings | File Templates.
*/
public class ChatServiceImpl implements ChatService {
private Logger logger = LoggerFactory.getLogger(ChatServiceImpl.class);
@Inject
private ChatDao chatDao;
@Override
public void send(String message) {
logger.info("Sending a message!");
chatDao.send(message);
logger.info("Sended a message!");
}
@Override
public String receive() {
logger.info("Received a message!");
return chatDao.receive();
}
}
五。Main.java
package com.template.chat;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 8/4/11
* Time: 4:59 PM
* To change this template use File | Settings | File Templates.
*/
public class Main {
private static Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
Module module = new ChatModule();
Injector injector = Guice.createInjector(module);
ChatService chatService = injector.getInstance(ChatService.class);
chatService.send("Hello,my name is Zhong Gang!");
String receive = chatService.receive();
logger.info(receive);
}
}
六。@Provides注解实现方式
package com.template.chat;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 8/4/11
* Time: 4:53 PM
* To change this template use File | Settings | File Templates.
*/
public class ChatModule extends AbstractModule {
@Override
protected void configure() {
bind(ChatService.class).to(ChatServiceImpl.class);
}
@Provides
protected ChatDao provideChatDao() {
ChatDao chatDao = new ChatDaoImpl();
return chatDao;
}
}
七。自定义Provider实现方式
ChatDaoProvider.java
package com.template.chat;
import com.google.inject.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 8/4/11
* Time: 5:18 PM
* To change this template use File | Settings | File Templates.
*/
public class ChatDaoProvider implements Provider<ChatDao> {
private Logger logger = LoggerFactory.getLogger(ChatDaoProvider.class);
@Override
public ChatDao get() {
logger.info("ChatDaoProvider is customize provider!");
return new ChatDaoImpl();
}
}
ChatModule.java
package com.template.chat;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 8/4/11
* Time: 4:53 PM
* To change this template use File | Settings | File Templates.
*/
public class ChatModule extends AbstractModule {
@Override
protected void configure() {
bind(ChatService.class).to(ChatServiceImpl.class);
bind(ChatDao.class).toProvider(ChatDaoProvider.class);
}
}