Spring入门1. IoC入门实例

Reference:Java EE轻量级解决方案——S2SH

前言:

之前学习过关于Spring的一点知识,曾经因为配置出现问题,而总是被迫放弃学习这些框架技术,现在我们使用Eclipse+Tomcat来配置,结合框架的包,而不使用MyEclipse,来系统的学习Spring框架技术。Spring框架中最为重要的量中技术:IoC和AOP,之前的学习都是针对IoC,减少类之间的依赖关系。

其实Spring是一个非常包容性的框架,也可以集成很多其他的框架技术,所以我们首先开始学习Spring框架技术。

本章学习的主要内容是 Spring体系结构、BeanFactory和ApplicationContext的使用方法、Bean生命周期、掌握IoC容器中装配Bean的各种方式、掌握依赖注入的不同方式、掌握注入参数的不同类型、掌握Bean的不同作用域类型、掌握IoC容器中对于Bean进行自动装配的不同类型、依赖检查的几种方式。

1.Spring概述

1.1Spring全方位的解决方案,主要功能如下:

基于IoC的核心机制

         声明式的面相切面编程(AOP)支持

         可以和多种技术整合的包容性框架

         优秀的WebMVC框架技术

其中的IoC容器降低了业务对象替换的复杂性,降低了组件之间的耦合度;AOP允许容器将一些通用的任务进行集中的处理,比如安全检查、事物、日志等等;Spring的ORM和DAO支持提供了于第三方持久层框架技术的良好整合,简化了数据库的访问。

Spring的一些模块:

Spring Core:最为基础的模块,他提供IoC功能,将类之间的依赖关系从代码中脱离出来,使用配置的方式进行依赖描述,由IoC容器负责依赖之间的创建、连接、管理和获取。

AOP模块:提供面相切面编程的实现,例如拦截器、事物管理。

DAO模块:提供了JDBC的抽象,消除了冗余的JDBC编码,并能够提供解析数据库厂商的错误代码;

ORM模块:提供了ORM框架的整合支持,比如Hibernate、JPA、JDO、iBatis

Web模块:Spring的MVC机制

JEE模块:提供对于JavaEE的支持,JMS、JMX、JCA、EJB、Email等

2.IOC容器机制

Spring中的IoC是Spring框架的基础,AOP、声明事物等功能都是基于此功能实现的。使用Spring之后,可以暂时忽略SpringIoC容器的运行机制,容器会中对被管理对象进行初始化,并且完成对象之间依赖关系的维护。

Spring IoC机制主要依赖两个访问接口:

BeanFactory:位于org.springframework.beans.factory,借助于配置文件实现对于JavaBean的配置和管理;

ApplicationContext:位于org.springframework.context,ApplicationContext构建在BeanFactory基础之上,还有其他的功能。

2.1BeanFactory

位于org.springframework.beans.factory.BeanFactory是IOC容器的核心接口,其职责是实例化定位、配置应用程序中的对象以及建立这些对象之间的依赖关系。其实BeanFactory就是一个类工厂,但是与其他的类工厂不同的是,他是一个通用的类工厂,可以创建并且管理各种类的对象,而且这些被创建和管理的对象本身就是简单的POJO。

BeanFactory接口中常见的方法以及功能:

boolean containBean(String name);

Object getBean(String name); return bean

Object getBean(String name, Class requireType); 指定类型的Bean

Class getType(String name); return bean type

针对BeanFactory接口,他有很多中实现版本。最常用的是XmlBeanFactory。他是以XML方式描述的应用的对象之间的依赖关系。XmlBeanFactory类将根据XML配置元数据构建一个完全可配置的系统。

其中BeanFactory加载XMLBean配置信息,在Factory装在对象

首先是Model层面,建立Customer对象:

public class Customer {

private String userName;

private String password;

private int age;

public void setUserName(String name){

this.userName = name;

}

public String getUserName(){

return this.userName;

}

public void setPassword(String pwd){

this.password = pwd;

}

public String getPassword(){

return this.password;

}

public void setAge(int age){

this.age = age;

}

public int getAge(){

return this.age;

}

@Override

public String toString(){

return "Name:"+this.userName + "\nPassword:" + this.password + "\nAge:" + this.age;

}

}

配置bean 信息:

<?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:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

<bean id="customer" class = "com.yang.model.Customer">

        <property name="userName" value="杨腾飞"/>

        <property name="password" value="12345"/>

        <property name="age" value = "21"/>

    </bean>

</beans>

在Main中加载XML配置文件到Factory中便可以实例化。

Resource is = new ClassPathResource("bean.xml");

BeanFactory factory = new XmlBeanFactory(is);

Customer customer = (Customer) factory.getBean("customer");

System.out.println(customer);

2.2使用ApplicationContext

ApplicationContext接口是由Beanfactory派生而来的,它增强了BeanFactory的功能,提供了更多的面向实际应用的方法,如添加了Bean生命周期的控制、框架事件体系、国际化支持、资源加载透明化等等多项功能。这样使用ApplicationContext中可以通过配置的方式实现在BeanFactory使用代码编写的功能,所以大多数的开发人员不使用BeanFactory而是使用ApplicationContext作为Spring的容器。

ApplicationContext除了BeanFactory的功能之外,还通过其他的接口扩展了一些功能:

MessageSource: ApplicationContext扩展了这一个接口,为应用提供了语言信息的国家化访问功能;

ResourceLoader: 提供资源(URL文件系统等等)的访问支持,根据资源的地址判断资源的类型,并且返回对应的Resource实现类;

ApplicationEventPublisher:引入事件机制,包括启动事件、关闭事件,这样让容器在上下文中提供了对应用时间的支持。

LifeCycle:提供了start() and stop() 方法的支持,用于控制一部处理请求的过程,已达到管理和控制任务调度的目的。

ApplicationContext的实现类有ClassPathXmlApplicationContext & FileSystemXmlApplicationContext.

ClassPathXmlApplicationContext: 从类路径加载配置文件

FileSystemXmlApplicationContext: 从文件系统中装载配置文件。

使用ApplicationContext加载实例:

ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

Customer customer = (Customer) context.getBean("customer");

System.out.println(customer);

2.3Bean生命周期

Bean和Servlet一样拥有明确的生命周期,Spring容器中的Bean也有自己的生命周期。Bean生命周期有特定的生命阶段组成,每一个生命阶段都提供不同的方法,对于Bean进行控制。

实例化、

设置属性值、

调用BeanFactoryAware的setBeanFactory()方法、

调用ApplicationContextAware的setApplicationContext()、

调用BeanPostProcessor中的postProcessBeforeInitialization()方法、

调用InitializingBean的afterPropertiesSet()方法

通过init-method属性配置的初始化方法调用BeanPostProcessor中的postProcessBeforeInitialization()方法、

Spring缓冲池中准备就绪的Bean,将准备就绪的Bean交给调用者

调用DisposableBean中的afterProtertiesSet()方法

通过destroy-method属性配置的销毁方法

Bean生命周期中从Spring容器开始实例化Bean,到最终销毁Bean,经历的关键点,每一个关键点都涉及特定的方法调用:

Bean自身方法调用:调用Bean构造方法实例化Ben啊,然后就是setter设置Bean的属性,以及通过<bean>元素的init-method和destroy-method属性所指定的方法

Bean级生命周期接口方法:如BeanNameAware, BeanFactoryAware, InitializingBean和DisposableBean,这些接口由Bean实现。

容器级生命周期方法调用:如BeanPostProcessor接口,其实现类为“后处理器”,它们独立于Bean,以容器附加装置的形式注册到Spring容器中,当Spring容器创建Bean时,这些后处理器都会发生作用。

问题解决:

初步学习Spring,实际编程中,最困难的是配置环境的问题,总是出现各种莫名其妙的错误,主要原因是我们程序中缺少包。在官方网站上下载的Spring包是不全的,对然代码中没有什么错误,但是代码运行的时候,就会各种报错,因为缺少一些包,最常见的就是common包,同时访问数据库的时候,还有mysql的包.官方网站上下载的Spring只是包含Spring中的模块,对于一些其他的包,比如数据库访问的,common-logging, common-pool等等在Spring运行的时候是需要的,需要我们自己添加。

为了便于在其他的项目中使用这些Jar,我们将他们整理为一些library:Spring3 common 等等。

对于Bean的配置文件,标准的文件名是applicationContext.xml,其实文件名称没有什么,只是一种规范。同时在这里介绍,最外边的标签<beans>对,其中的那些东西我不知道有什么作用,反正都加上了这些东西,同时最后一句是让容器对于Bean延迟初始化,当需要的时候在初始化生成响应的Bean对象,而不是在程序启动的时候就开始初始化容器中的所有生命的Bean。

<?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:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"

default-lazy-init="true">

<bean id="customer" class = "com.yang.model.Customer">

<property name="userName" value="杨腾飞"/>

<property name="password" value="12345"/>

<property name="age" value = "21"/>

</bean>

</beans>

YangTengfei

2013.11.24

Spring入门1. IoC入门实例的更多相关文章

  1. 1、Spring简介及IOC入门案例

    一.Spring框架介绍 1.介绍 Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务 ...

  2. Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)

    Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个 ...

  3. 【Spring】---【IOC入门案例】

    第一步:导入Jar包 第二步:创建类,在类里面创建方法 public class User { public void add(){ System.out.println("-------- ...

  4. Spring初识及其IOC入门

    一.框架 框架是一些类和接口的集合,它一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架时直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度. 二.Spri ...

  5. Spring.Net的IOC入门

    1.构造器注入 namespace Spring.Net { class Program { //构造器注入 static void Main(string[] args) { IApplicatio ...

  6. Spring第一天——入门与IOC

    大致内容 spring基本概念 IOC入门 [17.6.9更新],如何学习spring? 掌握用法 深入理解 不断实践 反复总结 再次深入理解与实践 一.Spring相关概念  1.概述: Sprin ...

  7. Spring入门(二)— IOC注解、Spring测试、AOP入门

    一.Spring整合Servlet背后的细节 1. 为什么要在web.xml中配置listener <listener> <listener-class>org.springf ...

  8. Spring入门2. IoC中装配Bean

    Spring入门2. IoC中装配Bean 20131125 前言: 上一节学习了Spring在JavaProject中的配置,通过配置文件利用BeanFactory和ApplicationConte ...

  9. Spring入门及IoC的概念

    Spring入门 Spring是一个轻量级的Java开发框架,最早由Robd Johnson创建,目的为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题,它是一个分层的JavaSE/EE轻量级开源 ...

随机推荐

  1. 2017 Multi-University Training Contest - Team 4 hdu6069 Counting Divisors

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6069 题目: Counting Divisors Time Limit: 10000/5000 ...

  2. Http:设置 浏览器中MIME 类型

    http://www.163ns.com/zixun/post/4602.html 自定义MIME类型支持FLV的相关设置 网络空间支持FLV的相关设置其实很简单,就是自定义一个MIME类型 一般虚拟 ...

  3. [Face++]Face初探——人脸检测

    经过了强烈的思想斗争才把自己拖到图书馆做毕设T^T anyway, 因为毕设里面有人脸识别的部分,所以就想找个现成的api先玩玩,于是就找到最近很火的face++:http://www.faceplu ...

  4. slf4j和log4j、logback

    现在主流java项目一般使用slf4j+log4j的日志方案,最近抽点时间扫了一下slf4j.log4j.logback的官方文档,做个笔记.这篇比较不打算描述具体的配置方法,因为官方文档已经讲得很清 ...

  5. Swift进阶之路(一)——单例模式、属性传值、代理传值、闭包传值

    一.单例模式 单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象. 关于单例,有三个重要的准则需要牢 ...

  6. [翻译]解读CSS中的长度单位

    测量,在WEB设计上是非常重要的.在CSS中有至少10种不同的测量单位.每种单位都有其独特的作用,使用它们,可以使页面,在各种设备上,很好的工作.一旦你熟悉了所有这些单位,你可以更准确地设定元素的大小 ...

  7. Fatal error compiling: java.lang.NoSuc hFieldError??

    用了两天时间,试了各种方法,问题最终解决.是JDK的版本问题:Maven3.5不支持jdk-9.0.1,最后退回:jdk1.8.0_151,问题圆满解决!! [ERROR] Failed to exe ...

  8. LeetCode——Nth Digit

    Question Find the nth digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... ...

  9. LeetCode——Unique Binary Search Trees II

    Question Given an integer n, generate all structurally unique BST's (binary search trees) that store ...

  10. Nginx+vsftpd搭建图片服务器

    安装Nginx 参考:http://www.cnblogs.com/idefav2010/p/nginx-concat.html Nginx配置文件 location ~ .*\.(gif|jpg|j ...