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) 领域对象
- package com.znker.spring.IoC;
- public class Account {
- private long id;
- private String owerName;
- private double balance;
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public String getOwerName() {
- return owerName;
- }
- public void setOwerName(String owerName) {
- this.owerName = owerName;
- }
- public double getBalance() {
- return balance;
- }
- public void setBalance(double balance) {
- this.balance = balance;
- }
- }
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的更多相关文章
- Spring学习笔记1——IOC: 尽量使用注解以及java代码(转)
在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IO ...
- Spring学习笔记1——IOC: 尽量使用注解以及java代码
在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IO ...
- spring学习笔记之---IOC和DI
IOC和DI (一)IOC (1) 概念 IOC (Inverse of Control) 反转控制,就是将原本在程序中手动创建对象的控制权,交给spring框架管理.简单的说,就是创建对象控制权被反 ...
- Spring学习笔记2——表单数据验证、文件上传
在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...
- Spring Framework 学习笔记——核心技术之Spring IOC
Spring Framework 官网文档学习笔记--核心技术之Spring IOC 官方文档 spring-framework-5.3.9 1. Spring Framework 核心技术 1.1 ...
- Hello Spring Framework——依赖注入(DI)与控制翻转(IoC)
又到年关了,还有几天就是春节.趁最后还有些时间,复习一下Spring的官方文档. 写在前面的话: Spring是我首次开始尝试通过官方文档来学习的框架(以前学习Struts和Hibernate都大多是 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用spring framework的IoC容器功能----->方法一:使用XML文件定义beans之间的依赖注入关系
XML-based configuration metadata(使用XML文件定义beans之间的依赖注入关系) 第一部分 编程思路概述 step1,在XML文件中定义各个bean之间的依赖关系. ...
- 框架应用:Spring framework (一) - IoC技术
IoC概念以及目标 IoC就是让原本你自己管理的对象交由容器来进行管理,其主要的目的是松耦合. IoC发展史 既然IoC的目标是为了松耦合,那它怎么做到的? 最后目标:降低对象之间的耦合度,IoC技术 ...
- Spring笔记:IOC基础
Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...
随机推荐
- 施耐德Sepam 40系列备自投逻辑
1# 主供: VL1= NOT PVTS_1_3 V1 = VL1 AND P59_1_7 AND P59_1_8 AND P59_1_9VL2 = VL1 AND I12 AND I21 AND I ...
- iOS平台使用陀螺仪传感器
在移动端开发过程中,有时候会用到陀螺仪传感器获取当前手机的姿态,下面给出iOS端如何获取陀螺仪姿态数据的代码: //根据陀螺仪的四元数转换为矩阵 + (GLKMatrix4)calculateMatr ...
- spring3 项目更新
列志华 (组长) http://www.cnblogs.com/liezhihua/ 团队guihub https://github.com/LWHTF/OrderingFood 黄柏堂 http:/ ...
- hibernate的环境配置
1,首先把跟Hibernate相关的jar包导入到lib目录下: 2,写Javabean类 package chen.can.Dao; public class TRegister implement ...
- <读书笔记>软件调试之道 :问题的核心-诊断
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 不要急于动手! 尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智 ...
- 让window.close不提示:您查看的网页正在试图关闭窗口。是否关闭此窗口?
正常来说,当我们调用window.close来关闭从地址栏中打开的窗口时,IE会弹出提示说:您查看的网页正在试图关闭窗口,是否关闭此窗口? 你可以将window.close替换成下边的脚本,然后再测试 ...
- Python: 列表的基本用法
列表是可变的,可以改变的序列,它能够保存任何数据类型. >>> list = [] #定义一个空列表>>> list.append(1) ...
- Entity Framework技术导游系列 开篇 (转)
在微软平台写程序有年头了,随着微软数据存取技术的持续演化,我在程序中先后使用过ODBC.DAO.ADO.ADO.NET.LINQ to SQL. Entity Framework这些技术. 近几年来, ...
- kafka生产消息的速度跟什么有关?
kafka的吞吐量很大,在保证带宽的情况下,网上的一些测试表明3台broker,没有replication,6个partition的情况下,一般的写入速度可以达到300MB/s.参考:kakfa测试 ...
- [Altera]PLL仿真
EDA Tools: 1.Quartus II 13.1(64-bit) 2.Modelsim SE-64 10.1c Time: 2016.05.05 ----------------------- ...