首页 > 代码库 > Spring Framework 笔记(一):IoC

Spring Framework 笔记(一):IoC

一:Spring中重要的概念

  1. 容器( container ) : spring容器( ApplicationContext )的工作原则是创建容器中的组件( instance ),处理组件之间的依赖关系,并将这些组件装配到一起。

  2. 控制反转( Inversion of Controll ) : 组件的依赖项由容器在运行时注入( injection ),而非组件自己实例化( new ),对依赖项的控制由组件转移到了容器。

 

二:依赖注入( dependency injection)

  1. Bean的定义:应用程序中由Spring容器进行管理的对象称为Bean

  2. IoC容器负责application中对象的实例化、初始化、装配和生命周期的管理。

 

三:IoC-demo

  1. 新建Java项目,添加工程Jar包

    1) spring核心包:org.springframework.beans、org.springframework.core、org.springframework.context

    2) Java日志包:commons.logging、org.apcha.log4j 和 Log4j.properties 配置文件

  2. demo代码

    1) 领域对象

  

 1 package com.znker.spring.IoC; 2  3 public class Account { 4      5     private long id; 6     private String owerName; 7     private double balance; 8      9     public long getId() {10         return id;11     }12     public void setId(long id) {13         this.id = id;14     }15     public String getOwerName() {16         return owerName;17     }18     public void setOwerName(String owerName) {19         this.owerName = owerName;20     }21     public double getBalance() {22         return balance;23     }24     public void setBalance(double balance) {25         this.balance = balance;26     }27 }

  2) AccoutDao接口与实现类

package com.znker.spring.IoC;import java.util.List;public interface AccountDao {    public void insert(Account account);    public void update(Account account);    /** update方法的重载 */    public void update(List<Account> accounts);    public void delete(long accountId);    public Account find(long accountId);    public List<Account> find(List<Long> accountIds);}
package com.znker.spring.IoC;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.springframework.stereotype.Repository;@Repository("accountDao")public class AccountDaoInMemoryImpl implements AccountDao {    /** HashMap 模拟数据库 */    private Map<Long, Account> accountsMap = new HashMap<>();    {        Account account1 = new Account();        account1.setId(1L);        account1.setOwerName("John");        account1.setBalance(10.0);        Account account2 = new Account();        account2.setId(2L);        account2.setOwerName("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) {            accountsMap.put(account.getId(), 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<Account>();        for (Long id : accountIds) {            accounts.add(accountsMap.get(id));        }        return accounts;    }}

  3) AccountService接口与实现类

package com.znker.spring.IoC;public interface AccountService {    /** 客户之间转账 */    public void transferMoney(long sourceAccountId, long targetAccountId, double amount);    /** 客户存款 */    public void depositMoney(long accountId, double amount);    public Account getAccount(long accountId);}
package com.znker.spring.IoC;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Service("accountService")public class AccountServiceImpl implements AccountService {    @Autowired    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);    }}

  4) 为spring 容器提供Bean实例化和装配所需的配置元数据(congfiguration metadata),配置元数据可以用XML文件或Java注解提供。

    XML文件版:xml-beans.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-3.2.xsd">        <bean id="accountService" class="com.znker.spring.IoC.AccountServiceImpl">        <!-- 依赖注入 accountDao -->        <property name="accountDao" ref="accountDao" />    </bean>    <bean id="accountDao" class="com.znker.spring.IoC.AccountDaoInMemoryImpl" /></beans>

    Java注解版:annotation-beans.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"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context-3.2.xsd">        <!-- 扫描类路径中存在的类,通过相关联的注解创建Bean并注入其依赖项中 -->    <context:component-scan base-package="com.znker.spring.IoC" />    </beans>

  5) 测试类代码

package com.znker.spring.IoC;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestMain {    public static void main(String[] args) {        /** 基于注解的spring容器对象实例化 */        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanConfiguration.class);        /** 基于XML文件的spring容器对象实例化 */        ApplicationContext ctx = new ClassPathXmlApplicationContext("com/znker/spring/IoC/beans.xml");                // 获取 AccountService Bean        AccountService accountService = ctx.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());            }}

 

Spring Framework 笔记(一):IoC