zoukankan      html  css  js  c++  java
  • 依赖注入模式【其他模式】

    @SuppressWarnings("boxing")
    public class DependencyInjection {
    	/**
    	 * Dependency Injection Pattern【依赖注入模式】:保持软件组件之间的松散耦合【低类间耦合】
    	 */
    	@Test
    	public void all() {
    		final Injector injector = Guice.createInjector(new UserModule());
    		final UserDao userDao = injector.getInstance(UserDao.class);
    		final long id = 1L;
    		final String name = "zxd";
    		userDao.add(User.of(id, name));
    		Optional<User> user = userDao.getById(1L);
    		assertTrue(user.isPresent());
    		assertEquals(name, user.get().getName());
    		userDao.remove(id);
    
    		user = userDao.getById(id);
    		assertFalse(user.isPresent());
    	}
    }
    
    @Value(staticConstructor = "of")
    class User {
    	private Long id;
    	private String name;
    }
    
    interface UserDao {
    	int add(User user);
    
    	Optional<User> getById(Long id);
    
    	int remove(Long id);
    }
    
    class DataStore {
    	private final ConcurrentMap<Long, User> USERS = new ConcurrentHashMap<>();
    
    	public User getById(Long id) {
    		return USERS.get(id);
    	}
    
    	public void persist(User user) {
    		USERS.put(user.getId(), user);
    	}
    
    	public void remove(Long id) {
    		USERS.remove(id);
    	}
    }
    
    class UserDaoImpl implements UserDao {
    	/**
    	 *	通过 Juice 的 @Inject 注解完成注入
    	 */
    	@Inject
    	private DataStore dataStore;
    
    	@Override
    	public int add(User user) {
    		dataStore.persist(user);
    		return 1;
    	}
    
    	@Override
    	public Optional<User> getById(Long id) {
    		return Optional.ofNullable(dataStore.getById(id));
    	}
    
    	@Override
    	public int remove(Long id) {
    		dataStore.remove(id);
    		return 1;
    	}
    }
    class UserModule extends AbstractModule {
    	@Override
    	protected void configure() {
    		// 配置绑定关系,用于创建实例和依赖注入
    		bind(DataStore.class).toInstance(new DataStore());
    		bind(UserDao.class).to(UserDaoImpl.class);
    	}
    }
    
  • 相关阅读:
    Python random() 生成随机数
    【centos7】添加开机启动服务/脚本
    SSH远程会话管理工具
    resolv.conf 的超时(timeout)与重试(attempts)机制
    Linux系统中sysctl命令详解
    NMI watchdog: BUG: soft lockup
    nginx实现最简单的直播
    Linux下编译PHP常见错误及解决方法
    zbb20180919 db 数据库的水平分割和垂直分割
    zbb20180918 java servlet 重定向与请求转发的区别
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10225973.html
Copyright © 2011-2022 走看看