文档章节

2014-03-09 Spring的学习(1)------Spring管理Bean(实例化Bean)

查封炉台
 查封炉台
发布于 2014/03/09 18:29
字数 1305
阅读 99
收藏 3

1.搭建与测试Spring的开发环境

 

      PS: Spring-beans-2.5.xsd  (为使在Beans.xml操作顺畅) Perferences--->MyEclipse--->Files and Editors---->XML--->XML Catalog--->add User Specified Entries

     

2.Spring管理Bean小试牛刀

    代码实现:

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学习.

3.手动编码完成部分实例化Bean的工作

 

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);
	}
}

4.Spring的三种实例化Bean的方式

    

 4.1. 用构造器来实例化

当采用构造器来创建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实例设置属性将在随后的 部分中谈及。

4.2. 使用静态工厂方法实例化

当采用静态工厂方法创建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实例设置属性将在随后的部份中谈及。

4.3. 使用实例工厂方法实例化

 使用静态工厂方法实例化类似,用来进行实例化的非静态实例工厂方法位 于另外一个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)来进行配置。

5.Bean的作用域以及Bean更多知识

   参考:Spring framework 2.5文档第三章Ioc(控制反转)容器


© 著作权归作者所有

共有 人打赏支持
查封炉台
粉丝 49
博文 56
码字总数 138491
作品 0
景德镇
程序员
day33_Spring学习笔记_01

零、蓦然回首 Struts2:web层,比较简单(难点:ValueStack值栈、拦截器) Hibernate:dao层,知识点杂(学了不用,默认设置够用了) Spring:service层,重要,(讲多少用多少) Spring课程...

黑泽明军
07/22
0
0
浅谈Spring设计分析_201800814

spring学习的思考与发现 1:spring中核心的几个部分 1:core : 工具类角色 2:beans : 各种实例化,被管理的对象与类 3:为整个spring容器提供维护,最基础的环境 2:IOC和AOP应该是在beans模块实现...

noteman
08/14
0
0
向Spring大佬低头——大量源码流出解析

用Spring框架做了几年的开发,只停留在会用的阶段上,然而Spring的设计思想和原理确实一个巨大的宝库。大部分人仅仅知道怎么去配,或着加上什么属性就能达到什么效果,这些东西都可以通过查文...

Java团长17
07/11
0
0
2014-03-10 Spring的学习(2)------依赖注入和自动扫描Bean

1.依赖注入(DI)的概念 所谓的依赖注入是指在运行期,由外部容器将依赖对象注入到组件中.依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作的其它对象).例如:Service业务层依赖D...

查封炉台
2014/03/10
0
0
【Spring实战】注入非Spring Bean对象

大家经常用到Spring IOC去管理对象之间的依赖关系,但一般情况下都有一个前提:这些Bean对象必须是通过Spring容器创建实例化的。 但实际上,项目中有可能会遇到这样的场景: 一个类不是通过S...

Carl_
2015/01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 使用parent方式引用时 获取值属性方式默认@

采用官网提供的 引入依赖时,application.properties中的值变量,无法通过${}获取,这是由于Spring Boot 已经将字符方式调整为 <resource.delimiter>@</resource.delimiter>。故如果在,工程中...

翱翔fly
14分钟前
1
0
HTTPS证书验证流程及SSL证书生成步骤【附nginx开启https配置】

------------------------------------------------------------ HTTPS证书验证流程(极简化版) 1.客户端向服务端请求证书(server.crt) 2.服务端下发证书(server.crt) 3.客户端用预制的...

xiaomin0322
15分钟前
1
0
预编译sql语句和参数化sql能有效防止——sql注入攻击——

预编译和参数化处理sql原理类似: 参数化处理sql 是将参数进行了字符串化处理,把参数中的单引号,井号#,等都做了转义处理,进而在执行sql语句时不会被当做sql中的定界符和指定符来执行。 ...

fang_faye
15分钟前
1
0
springboot最全配置解释

​​​​​​​# ----------------------------------------# 核心属性# ----------------------------------------# 文件编码banner.charset= UTF-8# 文件位置banner.locati...

废柴大叔
17分钟前
57
1
(大致了解下)从单机到2000万QPS: 知乎Redis平台发展与演进之路

导读:知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能。本文作者是是该系统的负责人,文...

Ocean_K
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部