发表于: 2017-08-19 23:08:37
1 1117
一、今日完成
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容器的配置和使用方法。
评论