Spring IoC 容器使用简记

729 阅读2分钟

Spring IoC 容器

IoC容器是Spring框架的核心。该容器的工作职责包括对应用程序的对象进行实例化、初始化、装配以及在对象的整个生命周期中提供其他Spring功能。

基础配置

Spring容器会根据提供的相关信息,实例化Bean并制定如何装配这些Bean。

Spring容器装配

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入门经典