1.搭建工程:
(1).Spring所需的jar:

(2).编写XXX.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-2.5.xsd">
<bean id="personService" class="com.gaoyuan.service.impl.PersonServiceImpl"/>
</beans>
(3).实例化spring容器

Java代码:

通过以上几步,就简单的将bean对象实例化了通过spring容器,从而在java代码中省略了new来实例化对象。
(4).编码剖析Spring管理Bean的原理
BeanDefinition.java
package com.gaoyuan.junit.test;
/**
* 存放xml文件中配置的bean
* @author G_yuan
*
*/
public class BeanDefinition {
private String id;
private String clazz;
public BeanDefinition(String id, String clazz) {
this.id = id;
this.clazz = clazz;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
}
ClassPathXMLApplicationContext.java
/**
* 模拟spring是如何读取beans.xml文件的
* @author G_yuan
*/
package com.gaoyuan.junit.test;
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;
/**
* 模拟spring是如何读取beans.xml文件的
* @author G_yuan
*
*/
public class ClassPathXMLApplicationContext {
List<BeanDefinition> beanDefins = new ArrayList<BeanDefinition>();
Map<String,Object> sigletons = new HashMap<String,Object>();
/**
* 完成bean的实例化
* @param fileName
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws Exception
*/
private void instanceBean() throws Exception{
for(BeanDefinition be :beanDefins){
if(be.getClazz()!=null && !"".equals(be.getClazz().trim()) ){
sigletons.put(be.getId(), Class.forName(be.getClazz()).newInstance());
}
}
}
/**
* 类初始化时的要加载xml文件和实例化xml文件中配置的bean
* @param fileName
* @throws Exception
*/
public ClassPathXMLApplicationContext(String fileName) throws Exception{
this.readXML(fileName);
this.instanceBean();
}
/**
* 读取xxxBean.xml文件
* @param fileName
*/
private void readXML(String fileName) {
SAXReader saxReader = new SAXReader();
Document document = null;
try {
URL xmlPath = this.getClass().getClassLoader().getResource(fileName);
document = saxReader.read(xmlPath);
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");//创建beans/bean的查询路径
xsub.setNamespaceURIs(nsMap);//设置命名空间
List<Element> beans = xsub.selectNodes(document); //获取文档下的所有bean节点
for(Element element : beans){
String id = element.attributeValue("id");
String clazz = element.attributeValue("class");
BeanDefinition beanDefinition = new BeanDefinition(id, clazz);
beanDefins.add(beanDefinition);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 模拟ClassPathXmlApplicationContext中的getBean()方法。
* @param beanName
* @return
*/
public Object getBean(String beanName){
return this.sigletons.get(beanName);
}
}
以上是一种获取bean的方法,并且也是常用的获取bean的方法,spring中有三种获取bean的方法,如:

(5).Bean的作用域

通过上面的方法获取bean时,获取的bean是同一个对象,如果想获取新的实例,需要在xml文件中配置 scope="prototype",如下:
<bean id="personService" class="com.gaoyuan.service.impl.PersonServiceImpl" scope="prototype"/>

(6).想要在bean实例化之前和在销毁的时候,做点事情的话,进行下面的操作:
1.首先需要在bean.xml中的bean标签中如图配置init-method="init"属性和destroy-method="destroy"属性。
2.在对应的XXXXServiceImpl.java中编写对应的init方法和destroy方法。
3.在执行destroy方法时,需要用到AbstractApplicationContext抽象类中的close()方法,才可以调用XXXXServiceImpl.java中的destroy方法


网友评论