发表于: 2017-08-19 23:08:37

1 1115


一、今日完成

1、提交task1,向辅导师兄汇报学习成果,除使用mybatis配置数据库和使用自定义域名并通过配置本地Host来配置DB连接文件这两点未完成外,其他验收标准基本达到,最终通过审核。

2、学习@Override的用法

java.lang.Override是一个marker annotation类型,用作标注;它声明被标注的方法重载父类的方法,同时也起断言的作用。如果使用@Override标注一个没有覆盖父类方法的方法时,java编译器会警示一个编译错误。 编译器也可以检测出子类方法与父类方法写法不一致的错误。

3、学习Java.util集合类

java.util包中提供的集合类常称为容器,常用的集合有List、Set和Map,其中List和Set继承了Collection接口。Collection接口是层次结构的根接口,不能直接使用但是提供了添加元素、删除元素、管理数据的方法(如add(E e), remove(Object o), isEmpty(), iterator(), size()等)。

这个经典的遍历集合用法,在操作数据库可用来输出当前表中部分或全部记录。

关于List、Set和Map三种集合的接口与实现的用法计划明天花半小时学习,并且编写代码块。

4、学习配置和使用Spring容器

1)使用基于Java的配置创建和使用Spring容器

public class AccountDaoInMemoryImpl implements AccountDao {

private Map<Long,Account> accountsMap = new HashMap<>();
 
  {
Account account1 = new Account();
     account1.setId(1L);
     account1.setOwnerName("John");
     account1.setBalance(10.0);
     
     Account account2 = new Account();
     account2.setId(2L);
     account2.setOwnerName("Mary");
     account2.setBalance(20.0);
     
     accountsMap.put(account1.getId(), account1);
     accountsMap.put(account2.getId(), account2);
     
  }

@Override
  public void insert(Account account) {
accountsMap.put(account.getId(), account);
  }

@Override
  public void update(Account account) {
accountsMap.put(account.getId(), account);
  }

@Override
  public void update(List<Account> accounts) {
for(Account account:accounts) {
update(account);
     }
}

@Override
  public void delete(long accountId) {
accountsMap.remove(accountId);
  }

@Override
  public Account find(long accountId) {
return accountsMap.get(accountId);
  }

@Override
  public List<Account> find(List<Long> accountIds) {
List<Account> accounts = new ArrayList<>();
     for(Long id:accountIds) {
accounts.add(accountsMap.get(id));
     }
return accounts;
  }

@Override
  public List<Account> find(String ownerName) {
List<Account> accounts = new ArrayList<>();
     for(Account account:accountsMap.values()) {
if(ownerName.equals(account.getOwnerName())) {
accounts.add(account);
        }
}
return accounts;
  }

@Override
  public List<Account> find(boolean locked) {
List<Account> accounts = new ArrayList<>();
     for(Account account:accountsMap.values()) {
if(locked == account.isLocked()) {
accounts.add(account);
        }
}
return accounts;
  }

}
public interface AccountService {
public void transferMoney(long sourceAccountId, long targetAccountId, double amount);
  public void depositMoney(long accountId, double amount) throws Exception;
  public Account getAccount(long accountId);
}
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;

  public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
  }

@Override
  public void transferMoney(long sourceAccountId, long targetAccountId, double amount) {
Account sourceAccount = accountDao.find(sourceAccountId);
     Account targetAccount = accountDao.find(targetAccountId);
     sourceAccount.setBalance(sourceAccount.getBalance() - amount);
     targetAccount.setBalance(targetAccount.getBalance() + amount);
     accountDao.update(sourceAccount);
     accountDao.update(targetAccount);
  }

@Override
  public void depositMoney(long accountId, double amount) throws Exception {
Account account = accountDao.find(accountId);
     account.setBalance(account.getBalance() + amount);
     accountDao.update(account);
  }

创建基于Java的Bean定义类

@Configuration
public class Ch2BeanConfiguration {

@Bean
  public AccountService accountService() {
AccountServiceImpl bean = new AccountServiceImpl();
     bean.setAccountDao(accountDao());
     return bean;
  }

@Bean
  public AccountDao accountDao() {
AccountDaoInMemoryImpl bean = new AccountDaoInMemoryImpl();
     //depedencies of accountDao bean will be injected here...
     return bean;
  }
}

创建main类,实例化Spring容器,在容器内部访问accountService Bean

public class Main {

public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Ch2BeanConfiguration.class);
     AccountService accountService = applicationContext.getBean("accountService", AccountService.class);

     System.out.println("Before money transfer");
     System.out.println("Account 1 balance :" + accountService.getAccount(1).getBalance());
     System.out.println("Account 2 balance :" + accountService.getAccount(2).getBalance());    
     
     accountService.transferMoney(1, 2, 5.0);
     
     System.out.println("After money transfer");
     System.out.println("Account 1 balance :" + accountService.getAccount(1).getBalance());
     System.out.println("Account 2 balance :" + accountService.getAccount(2).getBalance());
  }

}

2)另外还可以通过使用基于XML的配置以及使用基于Java注解的配置来创建和使用Spring容器;放在明天的日报中贴出来,然后分析三种方法的区别和联系。

二、明日计划

1.学习依赖注入的方法——Setter注入和构造函数注入的原理与代码;

2.做task2,学习Rest接口定义,创建一个简单的Maven web项目雏形。

三、遇到的问题

在贴出的代码里,AccountService Bean的AccountDao依赖是通过AccountService()方法中的accountDao()方法获取的,如果多次调用accountDao()方法是否会产生多个Bean实例?

四、今日收获

学会三种Spring IoC容器的配置和使用方法。


返回列表 返回列表
评论

    分享到