[Study] Spring Framework

来源:互联网 发布:淘宝在那里投诉卖家 编辑:程序博客网 时间:2024/05/19 06:15

package main.springframework;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import main.springframework.repository.AccountRepository;
import main.springframework.repository.InMemoryAccountRepository;
import main.springframework.service.TransferService;
import main.springframework.service.TransferServiceImpl;

@Configuration
public class AppConfig {


public @Bean TransferService transferService() {
return new TransferServiceImpl(accountRepository());
}


public @Bean AccountRepository accountRepository() {
return new InMemoryAccountRepository();
}


}


====================================================================


package main.springframework.domain;


import static java.lang.String.format;

public class Account {


private final String id;
private double balance;


public Account(String id, double initialBalance) {
this.id = id;
this.balance = initialBalance;
}


public String getId() {
return id;
}


public double getBalance() {
return balance;
}


public void debit(double amount) {
balance -= amount;
}


public void credit(double amount) {
balance += amount;
}


public static Account copy(Account src) {
return new Account(src.getId(), src.getBalance());
}


@Override
public String toString() {
return format("Account: id=%s, balance=%.2f", getId(), getBalance());
}


}


==============================================================


package main.springframework.repository;


import java.util.Set;


import main.springframework.domain.Account;


public interface AccountRepository {


Account findById(String acctId);


void update(Account account);


void add(Account account);


Set<Account> findAll();


}


package main.springframework.repository;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import main.springframework.domain.Account;

public class InMemoryAccountRepository implements AccountRepository {


private final Map<String, Account> accountsById = new HashMap<String, Account>();


public Account findById(String acctId) {
return Account.copy(accountsById.get(acctId));
}


public void update(Account account) {
if (!accountsById.containsKey(account.getId()))
throw new IllegalArgumentException("account [" + account.getId() + "] not found");
accountsById.put(account.getId(), Account.copy(account));
}


public void add(Account account) {
if (accountsById.containsKey(account.getId()))
throw new IllegalArgumentException("account [" + account.getId() + "] already exists");

accountsById.put(account.getId(), Account.copy(account));
}


public Set<Account> findAll() {
HashSet<Account> allAccounts = new HashSet<Account>();
for (Account account : accountsById.values())
allAccounts.add(Account.copy(account));
return allAccounts;
}


}


======================================================================


package main.springframework.service;

public interface TransferService {


void transfer(double amount, String srcAcctId, String destAcctId);

}


package main.springframework.service;

import main.springframework.domain.Account;
import main.springframework.repository.AccountRepository;

public class TransferServiceImpl implements TransferService {

private final AccountRepository accountRepository;


public TransferServiceImpl(AccountRepository accountRepository) {
this.accountRepository = accountRepository;
}


public void transfer(double amount, String srcAcctId, String destAcctId) {
Account srcAcct = accountRepository.findById(srcAcctId);
Account destAcct = accountRepository.findById(destAcctId);


srcAcct.debit(amount);
destAcct.credit(amount);


accountRepository.update(srcAcct);
accountRepository.update(destAcct);
}
}


======================================================================


package test.springframework;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import main.springframework.AppConfig;
import main.springframework.domain.Account;
import main.springframework.repository.AccountRepository;
import main.springframework.service.TransferService;

public class TransferServiceTest {

@Test
public void transfer100Dollars() {
// create the spring container using the AppConfig @Configuration class
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);


// retrieve the beans we'll use during testing
AccountRepository accountRepository = ctx.getBean(AccountRepository.class);
TransferService transferService = ctx.getBean(TransferService.class);


// create accounts to test against
accountRepository.add(new Account("A123", 1000.00));
accountRepository.add(new Account("C456", 0.00));


// check account balances before transfer
assertThat(accountRepository.findById("A123").getBalance(), equalTo(1000.00));
assertThat(accountRepository.findById("C456").getBalance(), equalTo(0.00));


// perform transfer
transferService.transfer(100.00, "A123", "C456");


// check account balances after transfer
assertThat(accountRepository.findById("A123").getBalance(), equalTo(900.00));
assertThat(accountRepository.findById("C456").getBalance(), equalTo(100.00));
}
}


原创粉丝点击