Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用。所谓IoC就是一个用XML来定义生成对象的模式,我们看看如果来使用的。
1、数据模型。
1、如下图所示有三个类,Human(人类)是接口,Chinese(中国人)是一个子类,American(美国人)是另外一个子类。
源代码如下:
package cn.com.chengang.spring;
public interface Human {
void eat();
void walk();
}
package cn.com.chengang.spring;
public class Chinese implements Human {
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#eat()
*/
public void eat() {
System.out.println("中国人对吃很有一套");
}
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#walk()
*/
public void walk() {
System.out.println("中国人行如飞");
}
}
package cn.com.chengang.spring;
public class American implements Human {
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#eat()
*/
public void eat() {
System.out.println("美国人主要以面包为主");
}
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#walk()
*/
public void walk() {
System.out.println("美国人以车代步,有四肢退化的趋势");
}
}
2、对以上对象采用工厂模式的用法如下
创建一个工厂类Factory,如下。这个工厂类里定义了两个字符串常量,所标识不同的人种。getHuman方法根据传入参数的字串,来判断要生成什么样的人种。
package cn.com.chengang.spring;
public class Factory {
public final static String CHINESE = "Chinese";
public final static String AMERICAN = "American";
public Human getHuman(String ethnic) {
if (ethnic.equals(CHINESE))
return new Chinese();
else if (ethnic.equals(AMERICAN))
return new American();
else
throw new IllegalArgumentException("参数(人种)错误");
}
}
下面是一个测试的程序,使用工厂方法来得到了不同的“人种对象”,并执行相应的方法。
package cn.com.chengang.spring;
public class ClientTest {
public static void main(String[] args) {
Human human = null;
human = new Factory().getHuman(Factory.CHINESE);
human.eat();
human.walk();
human = new Factory().getHuman(Factory.AMERICAN);
human.eat();
human.walk();
}
}
控制台的打印结果如下:
3、采用Spring的IoC的用法如下:
1、在项目根目录下创建一个bean.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>
<bean id="American" class="cn.com.chengang.spring.American"/>
</beans>
bean.xml的位置如下图,注意不要看花眼把它看成是lib目录下的了,它是在myspring目录下的。
2、修改ClientTest程序如下:
package cn.com.chengang.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class ClientTest {
public final static String CHINESE = "Chinese";
public final static String AMERICAN = "American";
public static void main(String[] args) {
// Human human = null;
// human = new Factory().getHuman(Factory.CHINESE);
// human.eat();
// human.walk();
// human = new Factory().getHuman(Factory.AMERICAN);
// human.eat();
// human.walk();
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
Human human = null;
human = (Human) ctx.getBean(CHINESE);
human.eat();
human.walk();
human = (Human) ctx.getBean(AMERICAN);
human.eat();
human.walk();
}
}
从这个程序可以看到,ctx就相当于原来的Factory工厂,原来的Factory就可以删除掉了。然后又把Factory里的两个常量移到了ClientTest类里,整个程序结构基本一样。
再回头看原来的bean.xml文件的这一句
<bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>
id就是ctx.getBean的参数值,一个字符串。class就是一个类(包名+类名)。然后在ClientTest类里获得Chinese对象就是这么一句
human = (Human) ctx.getBean(CHINESE);
因为getBean方法返回的是Object类型,所以前面要加一个类型转换。
4、总结
(1)也许有人说,IoC和工厂模式不是一样的作用吗,用IoC好象还麻烦一点。
举个例子,如果用户需求发生变化,要把Chinese类修改一下。那么前一种工厂模式,就要更改Factory类的方法,并且重新编译布署。而IoC只需要将class属性改变一下,并且由于IoC利用了Java反射机制,这些对象是动态生成的,这时我们就可以热插拨Chinese对象(不必把原程序停止下来重新编译布署)
(2)也许有人说,即然IoC这么好,那么我把系统所有对象都用IoC方式来生成。
注意,IoC的灵活性是有代价的:设置步骤麻烦、生成对象的方式不直观、反射比正常生成对象在效率上慢一点。因此使用IoC要看有没有必要,我认为比较通用的判断方式是:用到工厂模式的地方都可以考虑用IoC模式。
(3)在上面的IoC的方式里,还有一些可以变化的地方。比如,bean.xml不一定要放在项目录下,也可以放在其他地方,比如cn.com.chengang.spring包里。不过在使用时也要变化一下,如下所示:
new FileSystemXmlApplicationContext("src/cn/com/chengang/spring/bean.xml");
另外,bean.xml也可以改成其他名字。这样我们在系统中就可以分门别类的设置不同的bean.xml。
(4)关于IoC的低侵入性。 什么是低侵入性?如果你用过Struts或EJB就会发现,要继承一些接口或类,才能利用它们的框架开发。这样,系统就被绑定在Struts、EJB上了,对系统的可移植性产生不利的影响。如果代码中很少涉及某一个框架的代码,那么这个框架就可以称做是一个低侵入性的框架。
Spring的侵入性很低,Humen.java、Chinese.java等几个类都不必继承什么接口或类。但在ClientTest里还是有一些Spring的影子:FileSystemXmlApplicationContext类和ctx.getBean方式等。
现在,低侵入性似乎也成了判定一个框架的实现技术好坏的标准之一。
(5)关于bean.xml的用法
bean.xml的用法还有很多,其中内容是相当丰富的。假设Chinese类里有一个humenName属性(姓名),那么原的bean.xml修改如下。此后生成Chinese对象时,“陈刚”这个值将自动设置到Chinese类的humenName属性中。而且由于singleton为true这时生成Chinese对象将采用单例模式,系统仅存在一个Chinese对象实例。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="Chinese" class="cn.com.chengang.spring.Chinese" singleton="true">
<property name="humenName">
<value>陈刚</value>
</property>
</bean>
<bean id="American" class="cn.com.chengang.spring.American"/>
</beans>
关于bean.xml的其它用法,不再详细介绍了,大家自己拿Spring的文档一看就明白了
分享到:
相关推荐
在“Java进阶之SpringIoC应用共18页.pdf”文档中,可能会涵盖以下几个关键知识点: 1. **Spring容器初始化**:Spring容器的启动和初始化过程,包括如何通过XML配置文件或Java配置类加载bean定义。 2. **Bean的生命...
通过分析这些文件,你可以进一步学习如何在Spring 2.5.6中设置bean,以及如何利用IoC进行依赖注入。 总之,这个入门示例是学习Spring框架的很好起点,尤其是对于那些想了解Spring 2.5.6版本中注解和XML配置的初学者...
Spring框架是Java企业应用开发中不可或缺的一部分,它以轻量级的控制反转(IoC)和面向切面编程(AOP)为内核,提供了全面的编程和配置模型。在本篇文章中,我们将对Spring框架中经常遇到的面试题目进行深入分析。 ...
总的来说,"SpringIOCDemo1.zip"是一个很好的学习资源,涵盖了Spring的核心概念和基本用法,通过分析和实践这个示例,我们可以深入理解Spring框架的IoC和AOP机制,为实际项目开发打下坚实的基础。
在 Spring 中,IOC 的原理可以通过一个实例来简单分析。例如,添加新用户到数据库,我们可以采用分层的方式,进行功能的实现。首先,我们需要创建一个 Model -- UserDO,用于存储用户的信息。然后,我们需要创建一个...
本文将对比分析几种主流的.NET IOC框架:Spring.NET、StructMap、EntLib、Unity以及Ninject等,探讨它们各自的优点与不足。 #### Spring.NET - **初始化方式**:Spring.NET支持XML配置和代码初始化两种方式。早期...
在本示例中,我们将探讨四个常用的Flex IOC框架:Spring ActionScript、Parsley、Flicc和Swiz,通过比较它们的特性和使用方式,帮助你更好地理解和选择适合你的项目需求的框架。 1. Spring ActionScript: Spring是...
有关于Spring,我们最常用的两个功能就是IOC和AOP,前几篇文章从源码级别介绍了Spring容器如何为我们生成bean及bean之间的依赖关系 下面我们接着来看AOP的源码实现。 有关于AOP,我们在面试中也被无数次问到...
1. **IOC容器管理各层的组件**:Spring的IOC容器是Spring框架的核心功能之一,它负责管理应用程序中的对象及其依赖关系。开发者可以通过配置文件或者注解的方式定义组件,并由Spring容器进行管理。这种方式极大地...
在Java世界中,Spring框架是实现IOC的典型代表。Spring提供了两种主要的IOC实现方式:基于XML的配置和基于注解的配置。 ### **基于XML的配置** 在早期的Spring版本中,XML配置文件是定义bean和它们之间依赖关系的...
下面我们将对 Spring Boot 中的几种注入方法进行详细的介绍和分析。 1. @Autowired @Autowired 是 Spring 中最常用的注入方法之一,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。@Autowired ...
“比较简单容易理解”,暗示了这个框架的代码结构和逻辑应该是清晰明了的,适合初学者分析和学习。对于想要探究Spring底层原理的朋友们来说,这样的简化版框架是一个很好的起点,因为它可以帮助他们逐步拆解并理解...
本文将深入探讨原生Servlet与Spring Controller在性能方面的差异,并基于一个名为"AbTest"的Servlet项目源码进行分析。 首先,原生Servlet是Java EE规范的一部分,它提供了一个基础的接口,用于接收和响应HTTP请求...
在论文中,可以分析Spring在实际项目中的应用,对比不同框架的优劣,或者研究其新特性和未来发展趋势。 8. **学习资源与实践** 学习Spring框架,除了阅读文献和翻译,实践是必不可少的。可以创建一个简单的SSM项目...
Spring框架是Java开发中广泛应用的一个开源框架,以其依赖注入(Dependency Injection, DI)和面向切面编程(Aspect...通过分析和运行此案例,你可以深入理解Spring MVC的工作原理以及如何在实际项目中应用Spring框架。
在源码分析方面,我们可以深入理解Spring的IoC容器是如何管理对象的生命周期和依赖关系的。IoC容器通过XML配置或Java注解来定义bean及其依赖。此外,AOP的实现原理也是学习的重点,包括如何定义切面、通知类型以及...
Spring对事务管理的支持随着版本的升级而不断演进,作者回顾了这一发展历程,并详细比较了基于JDK动态代理和CGLIB动态代理实现的@Transactional注解管理事务的区别。 在Spring中,获取代理对象并访问目标对象是常见...
标题“spring_day02_spring_”和描述“heima spring source code day 02”表明这是一份关于Spring框架的深入学习资料,主要聚焦在源码分析上,特别是针对第一天学习后的第二天内容。标签“spring”进一步确认了讨论...
3. **Spring**:Spring框架的核心是IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)。在本项目中,Spring作为依赖注入容器,管理所有bean的生命周期,包括Spring MVC的...