Spring入门1. IoC入门实例
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、Spring简介及IOC入门案例
		
一.Spring框架介绍 1.介绍 Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务 ...
 - Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)
		
Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个 ...
 - 【Spring】---【IOC入门案例】
		
第一步:导入Jar包 第二步:创建类,在类里面创建方法 public class User { public void add(){ System.out.println("-------- ...
 - Spring初识及其IOC入门
		
一.框架 框架是一些类和接口的集合,它一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架时直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度. 二.Spri ...
 - Spring.Net的IOC入门
		
1.构造器注入 namespace Spring.Net { class Program { //构造器注入 static void Main(string[] args) { IApplicatio ...
 - Spring第一天——入门与IOC
		
大致内容 spring基本概念 IOC入门 [17.6.9更新],如何学习spring? 掌握用法 深入理解 不断实践 反复总结 再次深入理解与实践 一.Spring相关概念 1.概述: Sprin ...
 - Spring入门(二)—  IOC注解、Spring测试、AOP入门
		
一.Spring整合Servlet背后的细节 1. 为什么要在web.xml中配置listener <listener> <listener-class>org.springf ...
 - Spring入门2. IoC中装配Bean
		
Spring入门2. IoC中装配Bean 20131125 前言: 上一节学习了Spring在JavaProject中的配置,通过配置文件利用BeanFactory和ApplicationConte ...
 - Spring入门及IoC的概念
		
Spring入门 Spring是一个轻量级的Java开发框架,最早由Robd Johnson创建,目的为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题,它是一个分层的JavaSE/EE轻量级开源 ...
 
随机推荐
- playbook实现nginx安装
			
1. 先在一台机器上编译安装好nginx,然后打包 tar -zcvf nginx.tar.gz /usr/local/nginx --exclude=conf/nginx.conf --exclud ...
 - 【Thinking in Java, 4e】初始化与清理
			
[用构造器确保初始化] [方法重载] 涉及基本类型的重载 1.如果传入的数据类型小于方法中声明的形式参数类型:实际数据类型会被提升. 2.如果传入的数据类型大于方法中声明的形式参数类型:编译器报错,应 ...
 - 在python3下使用OpenCV 抓取摄像头图像提取蓝色
			
工作中需要对摄像头进行调试, Python平台大大提高调试效率. 从网找到段代码, 可以从摄像头图像中抠出蓝色. import cv2 import numpy as np cap = cv2.Vi ...
 - 一键安装lnmp(1)
			
#!/bin/bash#author:zhaocl#Software directory:$pathpath=`pwd`cd $path. $path/cacti.sh. $path/nginx.sh ...
 - goland 使用简单配置-不断更新
			
1.格式化代码 Ctrl+Alt+L 格式化代码 2.快捷键可能被占用 用tools-file watchers file->setting->tools->file watche ...
 - VisualStudio下如何编译和使用最新版本的OpenCV(修正版)
			
OpenCV是托管于GitHub的开源项目,本文具体解决一个问题,就是“获取最新版本的OpenCV,并且在自己的项目中使用起来" 最新版本 2017年3月31日 BY:jsxyhelu ...
 - git分支合并脚本
			
为什么要写这个脚本 工作中经常会有合并分支的操作,一开始也不以为然,后来发现如果更新频繁的话,根本就停不下来,昨天上午正好有空,就完成了下面的这个初版 可能存在的问题 一般的应用场景都是:从maste ...
 - ScriptToApp FAQ
			
Q: What should i do when the system alert is displayed ? A: To make the generated app work, you ne ...
 - ubuntu下源码安装wget
			
1.背景 ubuntu18.04 64bit 2.安装方法如下: 2.1.获取源码 curl -o wget-1.20.tar.gz ftp://ftp.gnu.org/gnu/wget/wget-1 ...
 - 使用commons-pool2改造APNs连接池
			
最近公司很多人反应apns推送的消息很慢,有时候需要5.6分钟才收到消息,我检查了下日志发现确实存在这个问题. 我们使用的是 https://github.com/relayrides/pushy 这 ...