PS: Spring-beans-2.5.xsd (为使在Beans.xml操作顺畅) Perferences--->MyEclipse--->Files and Editors---->XML--->XML Catalog--->add User Specified Entries
代码实现:
PersonServiceImpl.java
/**实现类**/ package cn.itcast.service.impl; import cn.itcast.dao.PersonDao; import cn.itcast.service.PersonService; public class PersonServiceImpl implements PersonService { public void add(){ System.out.println("This is a add()"); } }
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-2.5.xsd"> <!-- 构造器实例对象 !--> <bean id="personService" class="cn.itcast.service.impl.PersonServiceImpl" scope="prototype"/> </beans>
SpringTest.java测试类(用JUNIT框架测试)
package cn.itcast.test; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.itcast.dao.PersonDao; import cn.itcast.mycontext.MyClassPathXmlApplicationContext; import cn.itcast.service.PersonService; public class SpringTest { @Test public void instaceBean() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); PersonService serviceBean = (PersonService)context.getBean("personService"); serviceBean.add(); } } //output: This is a add() //~
PS:可以通过Spring Framework 开发参考手册或者自带API学习.
BeanDefinition.java 配置Beans.xml文件中相对应的元素
package cn.itcast.mycontext; public class BeanDefinition { private String id; private String className; public BeanDefinition(String id, String clazz) { this.id=id; this.className = clazz; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } }
MyClassPathXmlApplicationContext.java 读取Beans.xml
package cn.itcast.mycontext; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.XPath; import org.dom4j.io.SAXReader; public class MyClassPathXmlApplicationContext { private List<BeanDefinition> BeanDefinitions = new ArrayList<BeanDefinition>(); /**Key:id Value:instaceBean **/ private Map<String,Object> sigletons = new HashMap<String,Object>(); public MyClassPathXmlApplicationContext(String filename){ this.readXml(filename); this.instaceBeans(); } /** * 实例化Bean */ private void instaceBeans() { for(BeanDefinition beanDefinition:BeanDefinitions){ if(beanDefinition.getClassName()!=null && beanDefinition.getClassName().trim()!=""){ try { sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance()); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } } } } /** * 读取配置Bean的XML文件 * dom4j-1.6.1.jar,jaxen-1.1-beta-6.jar * @param filename */ private void readXml(String filename) { SAXReader reader = new SAXReader(); Document document = null; try{ URL url = this.getClass().getClassLoader().getResource(filename); document = reader.read(url); Map<String,String> nsMap = new HashMap<String,String>(); nsMap.put("ns","http://www.springframework.org/schema/beans"); XPath xsub = document.createXPath("//ns:beans/ns:bean"); xsub.setNamespaceURIs(nsMap); @SuppressWarnings("unchecked") List<Element> elements = xsub.selectNodes(document); /**dom4j相关知识**/ for(Element element : elements){ String id = element.attributeValue("id"); //获取id元素对应值 String clazz = element.attributeValue("class"); //获取class元素对应值 BeanDefinition beanDfine = new BeanDefinition(id,clazz); BeanDefinitions.add(beanDfine); } }catch (Exception e) { e.printStackTrace(); } } /** * 获取Bean实例 * @param beanName * @return */ public Object getBean(String beanName){ return this.sigletons.get(beanName); } }
当采用构造器来创建bean实例时,Spring对class并没有特殊的要求, 我们通常使用的class都适用。也就是说,被创建的类并不需要实现任何特定的 接口,或以特定的方式编码,只要指定bean的class属性即可。不过根据所采用 的IoC类型,class可能需要一个默认的空构造器。
此外,IoC容器不仅限于管理JavaBean,它可以管理任意 的类。不过大多数使用Spring的人喜欢使用实际的JavaBean(具有默认的(无参)构造器 及setter和getter方法),但在容器中使用非bean形式(non-bean style)的类也是可 以的。比如遗留系统中的连接池,很显然它与JavaBean规范不符,但Spring也能管理它。
当使用基于XML的元数据配置文件,可以这样来指定bean类:
<!-- id值特殊字符集不能使用 !--> <bean id="exampleBean" class="examples.ExampleBean"/> <bean name="anotherExample" class="examples.ExampleBeanTwo"/> <bean id="personService" class="cn.itcast.service.impl.PersonServiceImpl" scope="prototype"/>
给构造函数指定参数以及为bean实例设置属性将在随后的 部分中谈及。
当采用静态工厂方法创建bean时,除了需要指定class
属性外,还需要通过factory-method
属性来指定创建bean实例 的工厂方法。Spring将调用此方法(其可选参数接下来介绍)返回实例对象,就此而言, 跟通过普通构造器创建类实例没什么两样。
下面的bean定义展示了如何通过工厂方法来创建bean实例。注意,此定义并 未指定返回对象的类型,仅指定该类包含的工厂方法。在此例中, createInstance()
必须是一个static方法。
<bean id="exampleBean" class="examples.ExampleBean2" factory-method="createInstance"/> <bean id="personServiceFactory" class="cn.itcast.service.impl.PersonServiceImplFactory" factory-method="getPersonServiceImpl"/>
给工厂方法指定参数以及为bean实例设置属性将在随后的部份中谈及。
与 使用静态工厂方法实例化类似,用来进行实例化的非静态实例工厂方法位 于另外一个bean中,容器将调用该bean的工厂方法来创建一个新的bean实例。为使 用此机制,class
属性必须为空,而factory-bean
属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该 工厂bean的工厂方法本身必须通过factory-method
属性来设定。
<!-- the factory bean, which contains a method called createInstance() --> <bean id="serviceLocator" class="com.foo.DefaultServiceLocator"> <!-- inject any dependencies required by this locator bean --> </bean> <!-- the bean to be created via the factory bean --> <bean id="exampleBean" factory-bean="serviceLocator" factory-method="createInstance"/> <!-- MyDemo --> <bean id="personServiceFactory2" class="cn.itcast.service.impl.PersonServiceImplFactory"/> <bean id="personServiceFactory3" factory-bean="personServiceFactory2" factory-method="getPersonServiceImpl2"/>
虽然设置bean属性 的机制仍然在这里被提及,但隐式的做法是由工厂bean自己来管理以及通过依 赖注入(DI)来进行配置。