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 ...
随机推荐
- linux命令小常识
作为一个tester我们必须要会linux,也许你会说不用也可以.那么我想问,你部署测试环境在哪里,你下载war包并部署war包呢,你看日志在哪里? 基于测试需要用到liunx,我这里只针对需要用到的 ...
- sass安装与使用
安装: 1.安装ruby 2.安装Koala,用于sass编译 3.gem install sass(mac电脑安装如果安装报错,一般是权限问题,没有权限安装到ruby下面,因此可以尝试sudo ge ...
- C语言编程技巧-signal(信号)[转]
自 http://www.uml.org.cn/c++/200812083.asp 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用 ...
- JS 取得一个区间的随机整数
function rnd(n, m){ var random = Math.floor(Math.random()*(m-n+1)+n); return random; ...
- Tengine
Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性. 外文名 Tengine 发起单位 淘宝网 基 础 Nginx 目 ...
- 【Shell脚本】怎样表示一个for循环
[Shell脚本]怎样表示一个for循环 在此说一下我常用的两个结构: 1. for i in $(seq 1 100); do echo $i done 2. for (( i = ...
- Tomcat 实现双向SSL认证
大概思路: 使用openssl生产CA证书,使用keytool生产密钥库 实验环境:RHEL6.4+Tomcat8 一.生成CA根证书,并自签名 1.生成CA密钥 # genrsa [产生密钥命令] ...
- Winform 中DataGridView控件添加行标题
有很多种方法. 1.可以在DataGridView控件中的RowStateChanged事件改变行标题单元格的值(Row.HeaderCell.Value) /// <summary> / ...
- PLSQL登录数据库 报ORA -12154的诡异问题
https://q.cnblogs.com/q/89420/ 现象: 1.机器上先后安装了oracle两个版本的client.在装第一个client后,plsql可以顺利连接数据库a并登录. 2.安装 ...
- HTML5新增标签(新增27个标签,废弃16个标签)
1>结构性标签:负责web上下文结构的定义 article:文章主题内容 header:标记头部区域内容 footer:标记脚部区域内容 section:区域章节表述 nav:菜单导航,链接导航 ...