spring入门 spring是一个轻量级控制反转IOC和面向切面AOP的容器框架 目的:解决企业应用开发的复杂性 功能:使用基本的JavaBean代替EJB 范围任何的java应用 spring给开发带来的好处: 可以有效组织中间层对象 使用用同意的配置文件 促进良好的变成习惯,减少变成代价 易于单元测试 使EJB成为一种备选 为数据存储了一只的框架 方便解耦,简化开发 降低JavvaEEAPI的使用难度
Spring源码的研究可以迅速提高java技术
Spring核心模块 核心容器Spring Core 应用上下文Spring Context AOP模块 Spring AOP JDBC和DAO模块(Spring DAO) 对象实体映射(Spring ORM) Web模块(Spring Web) MVC模块(Spring Web MVC)
注意由于大量的使用反射所以对于高并发的应用要谨慎使用,影响性能
浅析IOC Inversion of Control控制反转是spring的核心,贯穿始终,所谓IOC对于spring框架来说就是由Springle来负责控制对象的生命周期和对象之间的关系 传统开发模式:对象之间相互依赖,通过内部手动找对象来完成开发,对象之间直接接触耦合度较高,扩展性较低, IOC开发模式:由中间容器IOC安排对象之间的依赖,通过容器来安排对象之间耦合相互调用,对象相互分离,耦合度较低,相互之间改变影响较低,扩展性较高。 所谓控制反转就是对象之间由原先的主动结合变为被动结合,对象之间的集合过程被反转了。 IOC另外的名字叫做依赖注入,所谓的依赖注入,就是由IOC容器在运行期间,动态的讲某种依赖关系注入到对象之中。所以,依赖驻日DI和控制反转IOC是从不同的角度描述同一件事情,就是指通过引入IOC的容器,利用依赖关系注入的方式,事先对象之间的解耦。 IOC控制反转说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你的xml文件控制,侧重于实现逻辑原理 DI依赖注入说的是创建对象实例时,为这个对象注入属性值或对象实例,侧重于实现具体的事例
AOP 专门用于处理系统中分布于各个模块中的交叉关注点的问题,在javaee应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理,安全检查,缓存,对象池管理等,AOP已经成为一种非常常用的解决方案 AOP代理原理框架动态生成的一个对象,该对象可作为目标对象调用,AOP代理所包含的方法是由被代理对象的方法和增强处理方法组成,在具体的AOP开发中主要分为三个部分一个是基本的业务组件,一个是切入点,一个是增强处理。 关键概念 切面 链接点 通知 切入点 引入 目标对象 AOP代理 织入 通俗理解一个组件A,不关心其他常用的服务组件B,但是这个组件A使用组件B的时候不是组件A自身去调用,而是通过配置等其他方式,比如Spring中可以通过xml'配置文件,这样就使得A不需要知道组件B是怎么样实现的,A只关心自己的业务逻辑,具体使用B的时候由配置文件去完成,与A自身无关。
spring实例 helloworld小例子
第一步首先搭建spring的开发环境加载所需要的开发包
第二步,创建HelloMessage业务接口
public interface HelloMessage{ public String sayHello(); }
第二步创建接口的实现类
该业务面向国内与国外有两种实现方式 public class HelloWorld implements HelloMessage{ @Override public String sayHello(){ return "hello world"; } } public class HelloChina implements HelloMessage{ @Override public String sayHello(){ return "你好"; } }
第三步创建Person JavaBean
public class Person{ private HelloMessage message; public void setMessage(HelloMessage message){ this.messsage=message; } public String getMessage(){ return this.message; } public String sayHello(){ return this.message.sayHello(); } }
第四部创建main主程序入口
public class Main{ public static void main(String[]args){ Resource res=new FileSystemResource("HelloMessage.xml"); //加载配置文件启动IOC容器 BeanFactory f=new xmlBeanFactory(res); Person person=(Person)f.getBean("Person"); String s=person.sayHello();
System.out.println(s); } }
第五步创建spring的xml配置文件
HelloMessage.xml <头信息省略> <Beans> <Bean id="HelloWorld" class="com.ss.springtest.HelloWorld"></Bean> <Bean id="HelloChina" class="com.ss.springtest.HelloChina"></Bean> <Bean id="Person" class="com.ss.springtest.Person"> <property name="HelloMessage" ref="HelloChina">//为Person类配置关联业务接口及其实现类,更改此配置信息来实现调用不同的业务实现。 </Bean> </Beans>
Spring IOC容器深入理解
IOC核心就是控制反转,DI是让调用类对某一接口实现类的依赖关系由第三方注入,以溢出调用类对某一接口实现类的依赖。
IOC注入类型
注入的方式都是在第三方中实现,将对象的实例化过程由第三方完成。是由面向对象所演变过来的。
构造函数注入
通过调用类的构造函数,将接口实现类通过构造函数变量传入
属性注入
通过Setter方法完成调用类所须依赖的注入,更加灵活方便
接口注入
将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法。
Spring作为一个第三方容器,通过配置文件或者注解描述类和类之间的依赖关系,自动完成类的创实话和依赖注入的工作
<bean id="" class="">实现类的实例化
<bean id="" class="" ref="">建立依赖关系,
spring能够通过配置文件就在内部完成类的实例化以及调用是通过反射机制来完成的。
Java语言允许通过程序化的方式间接对Class的对象实例操作,Class文件由类装在器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息,如构造函数,属性和方法等。
类装载器ClassLoader
类装在其就是寻找类的字节码文件并构造出类在在JVM内部表示的对象组件,主要工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件它负责在运行时查找和装入Class字节码文件
工作机制:
1,装载:查找和导入Class文件
2,链接,执行校验,准备和解析步骤
3,初始化:对类的静态变量,静态代码块执行初始化工作
Java反射机制,反射对象描述类语义结构,可以从Class对象中获取构造函数,成员变量,方法等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象在java.reflect包中定义。
Spring中,通过IOC可以将实现类,参数信息等配置在其对应的配置文件中,那么当需要更改实现类或参数信息时,只需要更改配置文件即可,我们还可以对某对象所需要的其他对象进行注入,这种注入都是都是在配置文件中做的。
Spring IOC的实现原理就是Java的反射机制,Spring的工厂类会帮我们完成配置文件的读取,利用反射机制注入对象等工作,我们可以通过bean的名称获取对应的对象。
资源放问工具类
JDK所提供的访问资源的类并不能很好的满足各种底层资源的访问需求,因此,Spring设计了一个Resource接口,它为应用提供了更强大的访问底层资源的能力。
主要方法
boolean exists()
boolean isOpen()
URL getURL()
File getFile()
InputStream getInputStream();
具体实现类,不同的位置资源使用不同的实现类
ByteArrayResource
ClassPathResource
FileSystemResource
InputStreamResource
ServletContextResource
UrlResource
为了访问不同类型的资源,必须使用相应的Resource实现类,这是比较麻烦的,Spring提供了一个强大的加载资源的机制,能够识别不同的资源类型
资源类型前缀
classpath classpath:com/jike/bean.xml
File file:/com/jike/bean.xml
http:// http://www.jike.com/bena.xml
ftp ftp://www.jike.com/bean.xml
无前缀 com/jike/bean.xml
Ant风格的匹配符
?:匹配文件名的一个字符
*:匹配文件名中的任意字符
**:匹配多层路径
Spring定义一套资源加载接口,并提供了实现类
BeanFactory和ApplicationContext的介绍
BeanFactory是Spring框架最核心的接口它提供了高级IOC的配置机制
ApplicationContext建立在BeanFactory基础之上,提供了更多冥想应用的功能,它提供了国际化支持和框架事件体系,更易于创建实际应用一般称BeanFactory为IOC容器,而成ApplicationContext为应用上下文,前者是面向spring底层的,后者是面向开发者的,所以后者的使用频率较高。
BeanFactory是一个类工厂,可以创建并管理各种类的对象,Spring称这些创建和管理的Java对象为Bean。在Spring中Java对象的范围更加广泛。
类体系结构
XmlBeanFactory
ListableBeanFactory
HierhicalBeanFactory
ConfigurableBeanFactory
AutowireCappleBeanFactory
SingletoBeanFactory
BeanDefinitionRegistry
初始化顺序
1,创建配置文件
2,装载配置文件
3,启动IOC容器
4,获取Bean实例
对于单实例的bean对象他的初始化是在第一次被调用的时候,之后就会缓存在IOC容器中可以直接被调用,另外初始化时需要配置日志文件才不会报错
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能,在BeanFactory中很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置方式实现,
具体实现类
ClassPathApplicationContext
FileSystemApplicationContext
ConfigurableApplication
初始化根据配置文件的不同可以选择不同实现类加载
Bean生命周期
Spring容器中的Bean拥有明确的声明周期。
BeanFactory中的Bean的声明周期
ApplicationContext中的Bean声明周期
Spring配置文件
一般结构
<beans>
<import resource="resource1.xml"/>//用于导入其他配置文件对bena的定义
<bean id="bean1" class=""></bean>//id与name没有太大的区别,id更规范一些
<bean name="bean2" class=""></bean>
<alias alias="bean3" name="bean2"/>//alias是用来定义别名的
</beans>
Spring容器启动的基本条件
Spring的框架类包
Bean的配置信息
Bean的实现类
Bean的元数据信息
Bean的实现类
Bean的属性信息
Bean的依赖关系
Bean的行为配置
Bean的创建方式
Bean id的命名方式
每个Bean可以有一个或者多个id,我们把第一个id成为标识符,其余id叫做别名,这些id在IOC容器中必须唯一,Bean id的命名方式和命名约定如下
1,配置全限定类名,唯一
2,指定id,唯一
3,指定name,唯一
4,指定id和name
5,指定多个name
Spring Bean实例化的方式
1,根据构造器实例化Bean
2,使用静态工厂方式实例化Bean
3,使用实例工厂方法实例化Bean
Spring Bean作用域
Spring Bean中所说的作用域,在配置文件中及时“Scope”,在面向对象程序设计中一般指对象或者变量之间的可见范围,而在Spring 容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。
在Spring容器中一共提供了5种作用域类型,在配置文件中通过属性scope来设置bean的作用域范围
Singleton,单例作用域,是缺省作用域,定义成该作用域则只会存在一个全局共享的bean实例
prototype,定义为该作用域,则每次对其bean进行请求的时候都会创建一个新的bean,有状态的bean常会设置该作用域
request,定义为该作用域,则只会针对每一次http请求,创建一个新的bean,该bean实例也只会在该请求中有效
session,同上针对某个http session会话有效。
global session,全局session作用域。