Spring IoC 容器
IoC容器是Spring框架的核心。该容器的工作职责包括对应用程序的对象进行实例化、初始化、装配以及在对象的整个生命周期中提供其他Spring功能。
基础配置
Spring容器会根据提供的相关信息,实例化Bean并制定如何装配这些Bean。
Maven依赖配置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
POJO
public class Account {
private long id;
private String ownerName;
private double balance;
private Date accessTime;
}
Dao类
接口
public interface AccountDao {
void update(Account account);
Account find(long accountId);
}
实现类
public class AccountDaoInMemoryImpl implements AccountDao{
private Map accountMap=new HashMap();
{
Account sellerAccount=new Account();
sellerAccount.setId(1L);
sellerAccount.setOwnerName("Ted");
sellerAccount.setBalance(50.0);
Account buyerAccount=new Account();
buyerAccount.setId(2L);
buyerAccount.setOwnerName("Bobo");
buyerAccount.setBalance(100.0);
accountMap.put(sellerAccount.getId(),sellerAccount);
accountMap.put(buyerAccount.getId(),buyerAccount);
}
@Override
public void update(Account account){
accountMap.put(account.getId(),account);
}
@Override
public Account find(long accountId){
return accountMap.get(accountId);
}
}
Service类
接口
public interface AccountService {
void transferMoney(long sourceAccountId, long targetAccountId, double amount);
void depositMoney(long accountId, double amount);
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){
Account account=accountDao.find(accountId);
account.setBalance(account.getBalance() + amount);
accountDao.update(account);
}
@Override
public Account getAccount(long accountId){
return accountDao.find(accountId);
}
}
配置和使用容器
基于Java的配置创建和使用容器
配置类
@Configuration
public class BeanConfiguration {
@Bean
public AccountService accountService(){
AccountServiceImpl bean=new AccountServiceImpl();
bean.setAccountDao(accountDao());
return bean;
}
@Bean
public AccountDao accountDao(){
AccountDaoInMemoryImpl bean=new AccountDaoInMemoryImpl();
return bean;
}
}
业务类
public class Main {
public static void main(String[] args){
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(BeanConfiguration.class);
AccountService accountService=applicationContext.getBean("accountService",AccountService.class);
System.out.println("Before money transfer");
System.out.println("Seller balance :"+accountService.getAccount(1).getBalance());
System.out.println("Buyer balance :"+accountService.getAccount(2).getBalance());
accountService.transferMoney(2, 1, 10.0);
System.out.println("After money transfer");
System.out.println("Seller balance :"+accountService.getAccount(1).getBalance());
System.out.println("Buyer balance :" + accountService.getAccount(2).getBalance());
}
}
测试结果
Before money transfer
Seller balance :50.0
Buyer balance :100.0
After money transfer
Seller balance :60.0
Buyer balance :90.0
基于XML的配置创建和使用容器
配置文件
< ?xml version="1.0" encoding="UTF-8"?>
< beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
< bean id="accountService" class="com.zju.service.AccountServiceImpl">
< property name="accountDao" ref="accountDao"/>
< /bean>
< bean id="accountDao" class="com.zju.dao.AccountDaoInMemoryImpl">
< /bean>
< /beans>
业务类
public class Main {
public static void main(String[] args){
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:bean.xml");
AccountService accountService=applicationContext.getBean("accountService",AccountService.class);
System.out.println("Before money transfer");
System.out.println("Seller balance :"+accountService.getAccount(1).getBalance());
System.out.println("Buyer balance :"+accountService.getAccount(2).getBalance());
accountService.transferMoney(2, 1, 15.0);
System.out.println("After money transfer");
System.out.println("Seller balance :"+accountService.getAccount(1).getBalance());
System.out.println("Buyer balance :" + accountService.getAccount(2).getBalance());
}
}
测试结果
Before money transfer
Seller balance :50.0
Buyer balance :100.0
After money transfer
Seller balance :65.0
Buyer balance :85.0
基于Java注解配置创建和使用容器
配置文件
< ?xml version="1.0" encoding="UTF-8"?>
< beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
< context:component-scan base-package="com.zju"/>
< /beans>
Dao类修改
@Service
public class AccountDaoInMemoryImpl implements AccountDao{
...
}
Service类修改
@Service("accountService")
public class AccountServiceImpl implements AccountService {
...
}
业务类
public class Main {
public static void main(String[] args){
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:bean.xml");
AccountService accountService=applicationContext.getBean("accountService",AccountService.class);
System.out.println("Before money transfer");
System.out.println("Seller balance :"+accountService.getAccount(1).getBalance());
System.out.println("Buyer balance :"+accountService.getAccount(2).getBalance());
accountService.transferMoney(2, 1, 18.0);
System.out.println("After money transfer");
System.out.println("Seller balance :"+accountService.getAccount(1).getBalance());
System.out.println("Buyer balance :" + accountService.getAccount(2).getBalance());
}
}
测试结果
Before money transfer
Seller balance :50.0
Buyer balance :100.0
After money transfer
Seller balance :68.0
Buyer balance :82.0
参考文件
《Spring入门经典》
