Java step by step (1) : simple Spring IoC container
2011-07-28 16:24
836 查看
Spring框架中很重要的一部分是关于IoC的,Spring提供了ApplicaitonContext这样一个接口 (bean factory),通过它来创建bean。除了这个接口,Spring提供了一些具体的context实现类,包括ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, XmlWebApplicationContext 和 XmlPortletApplicationContext。
通过创建一个简单的例子来看一下Spring IoC是怎么使用的。
首先在Eclipse里面创建一个Java Project, 目录结构如下,这里面主要包括两个Java 文件
1) SequenceGenerator.java
一个简单的bean
2) Main.java
包含main方法,用来创建SequenceGenerator.
3) Spring-Config.xml
Bean 的配置文件, Spring通过这个XML文件来实例化bean.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/02/2d013b9be9c94ca45cc6de44989d55e5.png)
Class SequenceGeneror
Class Main
Xml 文件
代码都很简单,不过需要注意的是关于这个配置文件。这里面既设置了constructor injection 又设置了 setter injection方式。 那么Spring会如何执行呢?
首先,因为这里面设置了<constuctor-arg>, Spring首先会调用对应的构造方法来初始化对象(如果没有设置constructor-arg, 那么会调用无参的构造方法)。
然后,因为设置了<property>,那么Spring会接着调用Setter方法来对成员变量来赋值 (如果设置了property,但是没有对应的setter方法,会报错的), 因此如果既设置了constructor-arg, 又设置了property的话,通过构造方法设置的成员变量的值会被Setter复写的。
-------------------------------------------------------------------
这个例子很简单,不过在运行的时候还是遇到了些问题,刚开始没有把com.springsource.org.apache.commons.logging.jar放到build path中,结果显示了一些错误信息... Spring在执行的时候需要写日志,如果没有这个jar包的话,会报找不到LogFactory这个类。
通过创建一个简单的例子来看一下Spring IoC是怎么使用的。
首先在Eclipse里面创建一个Java Project, 目录结构如下,这里面主要包括两个Java 文件
1) SequenceGenerator.java
一个简单的bean
2) Main.java
包含main方法,用来创建SequenceGenerator.
3) Spring-Config.xml
Bean 的配置文件, Spring通过这个XML文件来实例化bean.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/02/2d013b9be9c94ca45cc6de44989d55e5.png)
Class SequenceGeneror
public class SequenceGenerator { private String prefix; private String suffix; private int initial; private int counter; public SequenceGenerator(){ // } public SequenceGenerator(final String prefix, final String suffix, final int initial) { this.prefix = prefix; this.suffix = suffix; this.initial = initial; } public void setPrefix(final String prefix) { this.prefix = prefix; } public void setSuffix(final String suffix) { this.suffix = suffix; } public void setInitial(final int initial) { this.initial = initial; }
public synchronized String getSequence() {
StringBuffer sb = new StringBuffer(); sb.append(prefix); sb.append(initial + counter++); sb.append(suffix); return sb.toString(); } }
Class Main
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("/META-INF/spring/spring-config.xml"); SequenceGenerator generator = (SequenceGenerator)context.getBean("sequenceGenerator"); System.out.println(generator.getSequence()); } }
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.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="sequenceGenerator" class="com.moodys.demo.model.SequenceGenerator"> <constructor-arg value="40"/> <constructor-arg value="B"/> <constructor-arg value="100"/> <property name="prefix" value="30"/> <property name="suffix" value="A"/> <property name="initial" value="100000"/> </bean> </beans>
代码都很简单,不过需要注意的是关于这个配置文件。这里面既设置了constructor injection 又设置了 setter injection方式。 那么Spring会如何执行呢?
首先,因为这里面设置了<constuctor-arg>, Spring首先会调用对应的构造方法来初始化对象(如果没有设置constructor-arg, 那么会调用无参的构造方法)。
然后,因为设置了<property>,那么Spring会接着调用Setter方法来对成员变量来赋值 (如果设置了property,但是没有对应的setter方法,会报错的), 因此如果既设置了constructor-arg, 又设置了property的话,通过构造方法设置的成员变量的值会被Setter复写的。
-------------------------------------------------------------------
这个例子很简单,不过在运行的时候还是遇到了些问题,刚开始没有把com.springsource.org.apache.commons.logging.jar放到build path中,结果显示了一些错误信息... Spring在执行的时候需要写日志,如果没有这个jar包的话,会报找不到LogFactory这个类。
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:160) at org.springframework.context.support.AbstractRefreshableApplicationContext.<init>(AbstractRefreshableApplicationContext.java:89) at org.springframework.context.support.AbstractRefreshableConfigApplicationContext.<init>(AbstractRefreshableConfigApplicationContext.java:59) at org.springframework.context.support.AbstractXmlApplicationContext.<init>(AbstractXmlApplicationContext.java:61) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:136) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at com.moodys.demo.Main.main(Main.java:28)
相关文章推荐
- Spring.net step by step——依赖注入(DI)和控制反转(IOC)
- 【Java.Spring.Core】【IoC】IoC容器 - Container
- 理解Java Spring核心功能之一:控制反转容器(IOC Container)
- Step by Step into Spring(IOC)
- 使用Spring.Net 1.3.2实现Container(IoC)(二)ASP.NET MVC、ControllerFactory
- Step By Step(Java 网络篇)
- 【Java.Spring.Core】【IoC】Beans
- IoC Container Benchmark - Unity, Windsor, StructureMap and Spring.NET
- Step By Step(Java JDBC篇)
- 【Java.Spring.Core】【IoC】Bean 作用域 - Scopes
- JAVA Spring中的IOC和AOP概念
- Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer错误解决办法
- 【Java.Spring.Core】【IoC】使用Classpath扫描向容器注册beans/components
- Java Spring IOC用法
- Spring Aop Step-By-Step 学习笔记(下)
- 如何在java服务器上部署Rational PurifyPlus(Step by Step)
- spring整合jbpm Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
- 使用DOM和java反射实现简单的SpringIOC
- Java面试之springIOC
- 使用Spring.Net 1.3.2实现Container(IoC)(一)IoC、DI、Spring.NET、Ioc Container、 ClassicContainer