2019独角兽企业重金招聘Python工程师标准>>>

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/beanshttp://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 {@Testpublic 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(控制反转)容器

转载于:https://my.oschina.net/codeWatching/blog/206618

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

  1. spring框架学习 - 使用 Spring 的面向切面编程补充

    接上一篇博客:https://blog.csdn.net/qq_43605444/article/details/122047698?spm=1001.2014.3001.5502 4.4 声明通知 ...

  2. spring框架学习 - 使用 Spring 的面向切面编程 补充1

    接上一篇博客:https://blog.csdn.net/qq_43605444/article/details/122050740?spm=1001.2014.3001.5502 6.选择要使用的 ...

  3. spring框架学习 - 使用 Spring 的面向切面编程

    接上一篇博客:https://blog.csdn.net/qq_43605444/article/details/122029896?spm=1001.2014.3001.5502 七.使用 Spri ...

  4. spring boot 学习(二)spring boot 框架整合 thymeleaf

    spring boot 框架整合 thymeleaf spring boot 的官方文档中建议开发者使用模板引擎,避免使用 JSP.因为若一定要使用 JSP 将无法使用. 注意:本文主要参考学习了大神 ...

  5. 【Spring MVC学习】spring mvc入门示例

    之前进公司就直接使用spring mvc做项目了,并没有系统学习过,后来再回头去总结的时候发现我只是在项目中会使用,但是有关spring mvc的配置,还有注解什么的想起来会感觉很混乱,趁着这几天不忙 ...

  6. Spring Boot学习笔记——Spring Boot与ActiveMQ的集成

    Spring Boot对JMS(Java Message Service,Java消息服务)也提供了自动配置的支持,其主要支持的JMS实现有ActiveMQ.Artemis等.这里以ActiveMQ为 ...

  7. [Spring入门学习笔记][Spring的AOP原理]

    AOP是什么? 面向切面编程 软件工程有一个基本原则叫做"关注点分离"(Concern Separation),通俗的理解就是不同的问题交给不同的部分去解决,每部分专注于解决自己的 ...

  8. Spring 系统学习:Spring的事务管理---事务回顾

    1.事务:逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败. 2.事务的特性: 原子性:事务不可分割: 一致性:事务执行前后,数据的完整性保持一致: 隔离性:一个事务的执行不应该受 ...

  9. Spring Cloud学习 之 Spring Cloud Hystrix(断路器原理)

    断路器定义: public interface HystrixCircuitBreaker {// 每个Hystrix都通过它判断是否被执行public boolean allowRequest(); ...

最新文章

  1. 从零入门 Serverless | 函数计算的可观测性
  2. mysql主从同步_utf8_MySQL主从同步
  3. AI面试必备!你不可不知的10个深度学习方法
  4. Java IdentityHashMap values()方法与示例
  5. java对字符串归一化_搜索引擎中的字符串归一化 | 学步园
  6. 8.霍夫变换:线条——动手编码、霍夫演示_4
  7. 建议收藏!前端工程师一线大厂面试2021总结篇(50个JS常问知识点)
  8. 用户环境变量_linux 初级3 环境变量命令env、set、export、declare的区别
  9. Navicat for MySQ破译版
  10. pgAdmin4数据库备份还原
  11. 遍历获取文件夹下的所有文件
  12. delln4030安装固态硬盘_戴尔灵越怎么更换固态硬盘
  13. 企业微信url及生成授权链接
  14. TCC(TinyC)编译器汉化(中文编译器、汉语编程)之五:语法分析下
  15. 崔羚:乳品行业后道包装及物流解决方案
  16. 关于c基础实现简易计算器的代码(加减乘除)
  17. 计算机系统1 实验 LC-3 Nim游戏 子程序
  18. MonoRail学习笔记十六:AJax在MonoRail中的使用
  19. 门户通专访学生站长杨瑨:做站要有超前思维
  20. 为Dynamics 365 USD设置打开调试面板的自定义快捷键

热门文章

  1. VTK:可视化算法之MarchingCases
  2. VTK:可视化之Legend
  3. VTK:模型之FinanceFieldData
  4. C语言quick sort快速排序的算法(附完整源码)
  5. QT的QPen类的使用
  6. QT的QNdefFilter类的使用
  7. C/C++人机猜拳游戏
  8. insert into 时间_2021国家公务员考试报名时间_国考什么时候报名
  9. 04_Pytorch生态、PyTorch能做什么、PyTorch之Autograd、autograd案例、GPU加速案例
  10. JMeter入门,测试计划编写(http请求)