Spring之IOC详解
学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。本篇我们通过一个实例和大家简单分析一下Spring中IOC的原理,以便我们可以更好的理解Spring。
简单描述一下我们的场景,添加新用户到数据库,这里我们采用分层的方式,进行功能的实现,我们知道,开发程序一定要注意程序的可移植性,所以这里简单为大家介绍一下面向接口编程,面向接口编程就是面向抽象编程、面向规范编程,它带来的最大的好处便是解耦、增强扩展性、屏蔽变化。

好了下面我们开始我的业务实现,首先我们需要创建一个Model--UserDO.java
public class UserDO {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
有了我们的用户对象,下面我们开始创建Selvect类,Selvect我们知道,使用了接收用户请求的对象,这里因为我们只是为了方便大家理解,所以我们在Selvect中模拟收到用户请求后进行相关业务逻辑处理:
public class UserSelvect {
public static void main(String[] args) {
UserDO userDO = new UserDO();
BeanFactory beanFactory = new ClassPathXmlApplicationContext();//创建我们的Bean工厂
UserService userService = (UserService) beanFactory.getBean("userService");//通过类名来获得类对象
userService.add(userDO);//完成业务逻辑
}
}
一般我们的业务逻辑会放在Service层进行操作,所以我能先来看一下我们的Service对象:
public class UserService {
private UserDao userDao;//实例DAO对象
public UserDao getUserDao() {
return userDao;
}
//用于Bean工厂中进行DAO动态绑定
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
//用于Selvect对象调用,进行业务逻辑处理
public void add(User u){
userDao.add(u);
}
}
下面就是我们的DAO层的实现了,这里就要说明了,为了最大化提高程序的可移植性,接下来将采用接口编程的实现进行设计:
/**
* DAO类只有方法定义
* 从而减低程序直接的耦合
*/
public interface UserDao { public void add(User u);
}
既然是面向接口编程,就一定需要实现接口的类:
public class UserDaoImpl implements UserDao{
public void add(User u){
System.out.println("保存一个学生对象");
}
}
好了到这里我们的基本框架已经完成,接下来就要开始重点的内容了,首先我们需要先了解一些关于xml解析的知识,在之前的博客中已经为大家介绍了过一种方式:Jdom读取XML文件,不了解的小伙伴可以先移步简单查看一下,这样接下来的内容,你才不至于感到吃力。下面我们进行我们的这个Demo的设计,首先在src目录下添加一个Spring.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="userDao" class="com.manyiaby.daoimpl.UserDaoImpl"></bean> <bean id="userService" class="com.manyiaby.service.UserService">
<property name="userDao" bean="userDao"></property>
</bean>
</beans>
下面我们定义一个Bean工程对象,用来读取我们的Spring.xml文件,从而完成对象实例的创建,一便接下来的业务操作:
public interface BeanFactory {
public Object getBean(String className);
}
大家是不是发现我们的Bean工场也是采用接口编程的思想,接下来看一下我们的工场实现类:
public class ClassPathXmlApplicationContext implements BeanFactory{
private Map<String, Object> beanMap = new HashMap<String, Object>();//用来存配置文件中的类对象
public ClassPathXmlApplicationContext(){
try {
SAXBuilder saxBulder = new SAXBuilder();
Document doc = saxBulder.build(ClassPathXmlApplicationContext.class
.getClassLoader().getResourceAsStream("spring.xml"));
Element root = doc.getRootElement();//获取根元素
List<Element> list = root.getChildren("bean");
for (Element element : list) {
String id = element.getAttributeValue("id");//得到beanId
String className = element.getAttributeValue("class");//得到Bean的类名地址
System.out.println(className);
Object object = Class.forName(className).newInstance();
beanMap.put(id, object);
if (null != element.getChild("property")) {
Element property = element.getChild("property");
String name = property.getAttributeValue("name");
String beanId = property.getAttributeValue("bean");
Object beanObject = beanMap.get(beanId);//UserDaoImpl
String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);//setUserDao
System.out.println(methodName);
Method m = object.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);//UserService的SetUserDao()方法,接收的参数为UserDao接口类
m.invoke(object, beanObject);//调用UserService的SetUserDao()方法,传入UserDaoImpl
}
}
} catch (Exception e) {
System.out.println("" + e);
}
}
//用于类调用
@Override
public Object getBean(String className) {
return beanMap.get(className);
}
}
简单为大家介绍一下,我们通过beanMap将我们在Spring中配置的对象,通过反射机制拿到,然后放置于beanMap对象中,通过getBean方法,共外部类调用。
上面简单模拟了一下Spring中IOC的一些内容,下面咱们一起来看一下,如何通过Spring完成上面的操作,首先我们需要下载spring.jar,有了这个jar还不够,spring还依赖commons-logging.jar,好了将这两个jar包导入到我们的工程中,然后我们就来看一下如何实现使用:
public class UserSelvect {
public void main() {
UserDO userDO = new UserDO();
BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) beanFactory.getBean("userService");
//ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
//UserService userService = (UserService) context.getBean("userService");
userService.add(userDO);
}
}
其他不用修改,是不是很简单,好了,关于Spring的内容为大家介绍到这里。
Spring之IOC详解的更多相关文章
- Spring之IoC详解(非原创)
文章大纲 一.Spring介绍二.Spring的IoC实战三.IoC常见注解总结四.项目源码及参考资料下载五.参考文章 一.Spring介绍 1. 什么是Spring Spring是分层的Java ...
- 2、Spring的 IoC详解(第一个Spring程序)
Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.在这句话中重点有两个,一个是IoC,另一个是AOP.今天我们讲第一个IoC. IoC概念 ...
- Spring.Net —IOC详解
一. Spring.net中IOC介绍 1. 什么是IOC,控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中 ...
- (二)Spring 之IOC 详解
第一节:spring ioc 简介 IOC(控制反转:Inversion of Control),又称作依赖注入dependency injection( DI ),是一种重要的面向对象编程的法则来削 ...
- Spring IoC详解
Spring IoC详解 1. 控制反转 控制反转是一种通过描述(XML或者注解)并通过第三方去产生或获取特定对象的方式.在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Depend ...
- Spring jar包详解
Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...
- Spring——jar包详解(转)
Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...
- spring注入参数详解
spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...
- Spring4 IOC详解
Spring4 IOC详解 上一章对Spring做一个快速入门的教程,其中只是简单的提到了IOC的特性.本章便对Spring的IOC进行一个详解.主要从三个方面开始:基于xml文件的Bean配置,基于 ...
随机推荐
- Redis系列二(yum切换为网易163)
这个可能和Redis没有直接的关系... 是我在yum install的时候发现centos的yum实在是太慢,上网查了下.网易163有个yum镜像,为了让CentOS6使用速度更快的YUM更新源,可 ...
- Python实现字典的key和values的交换
#encoding=utf-8 #反转字典 即key和val互换 dict1={1:2,3:4,6:7,9:10} print '---生成器表达式' def invert_dict(d): retu ...
- .net 开发经理的月薪
因为各人的成长不一样,有人工作了5年,技术也只能当个高级程序员,有人工作了两年,就能带领一个团队,有人在初中时期就写了一个很牛X 的框架,而我工作也快5年,也努力奋斗了5年,我觉得自己有能力做开发经理 ...
- 使用VS Code从零开始开发调试.NET Core 1.1
使用VS Code 从零开始开发调试.NET Core 1.1.无需安装VS 2017 RC 即可开发.NET Core 1.1. .NET Core 1.1 发布也有一段时间了,最大的改动是从 pr ...
- ContextMenu控件引用以及不用v4包的方法
最近想撸个APP出来玩玩,本想用Yalantis出的SideMenu,结果因为依赖问题放弃了,改用他们家的ContextMenu. 如果你用了v4包 那么问题就比较简单了,直接打开项目中app中的bu ...
- maven 配置安装
1.下载maven http://maven.apache.org/ 2.windows安装maven 解压包后配置环境变量 PATH:%M2_HOME%\bin M2_HOME:D:\soft\ ...
- OOP面向对象三大特点
OOP面向对象三大特点 (一)封装:将现实中一个事物的属性和功能集中定义在一个对象中.(创建对象) 创建对象的3种方式: 1.直接量方式:(创建一个单独的对象) var obj={ 属性名:值, ...
- 在vi或者vim中显示行号
1. 为了显示行号,在vi/vim编辑器中执行一下命令中的一条 :set number 或者 :set nu 2. 为了关闭行号,在vi/vim编辑器中执行下面命令 :set nu! 如果你想要每次启 ...
- ORACLE-EXP和IMP方法介绍
说明: 之前经常有人询问数据库导出导入的方法,去百度查询,但是查询的结果却不是很尽如人意,所以在此做个基本的总结,包括 导出:(导出用户,导出表,导出表结构不带数据,QUERY参数),导入(导入数据文 ...
- Windows内存管理简介:
1:连续的内存空间分配: (1)单一连续分配:只能单作业,单任务运行: 分为系统和用户区:用户区是指除了系统需外左右的内存,由于单用户,单任务,要不都被占用,要不全空 (2):固定空间分配:固定分 ...