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 ...
随机推荐
- 【SSM 7】Mybatis底层封装思路
一.基本概述 在前面的博客中介绍到Mybatis的逆向生成工具,为我们生成了每个实体的基本增删改查的代码,那么每个实体都是那么多的代码,我们很容易的发现,有很大的相似性.对于这部分代码,应该予以抽象封 ...
- NHibernate系列文章二十七:NHibernate Mapping之Fluent Mapping基础(附程序下载)
摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早 ...
- subline text3 删除行 快捷键设置
打开 首选项-->按键绑定 { "keys": ["ctrl+shift+k"], "command": "run_macr ...
- 获取View到顶部的高度
tv_title.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener ...
- C--变量的命名规则
规则1.标识符最好采用英文单词或其组合,不允许使用拼音. 规则3.当标识符由多个词组成时,每个词的第1个字母大写,其余全部小写: int CurrentVal; 规则5.对在多个文件之间共同使用的 ...
- 让ztree树默认是关闭的
只需要在ztree的回调函数中加 var treeObj = $.fn.zTree.getZTreeObj("zTreeContent");treeObj.expandAll(tr ...
- GridView 使用方法总结
http://www.cnblogs.com/sufei/archive/2010/03/27/1698590.html 地址
- 【转载】 Android PullToRefresh (ListView GridView 下拉刷新) 使用详解
Android下拉刷新pullToRefreshListViewGridView 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/3 ...
- select 多表查询
连接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征. select 表1.字段名1,表2.字段名2,... from 表1,表2 where 连接条件 连接查询分 ...
- JS里面利用random()实现随机颜色更换
首先你需要一个div <div id="box"></div> 然后给这个div加入CSS属性 #box{width:500px;height:500px; ...