Spring
- 分层:
- web层: struts,springmvc
- service层:spring
- dao层:hibernate,mybatis,jdbcTemplate,spring-data
<!--more-->
1.什么是Spring
- spring是一个基于IOC和APO的结构的J2EE系统的轻量级框架,Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情 ,它的核心主要是ioc和aop。
- IOC(Inversion Of Control)反转控制是spring的基础,简单地说就是创造对象由以前的程序员自己new构造方法来调用,变成了交由spring创建对象。
- DI依赖注入(Dependency Inject),简单地说就是拿到对象的属性,已经被注入好相关值了,直接使用即可。
2.IOC思想:
其思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为应答,容器适时的返回资源,而应用了IOC后,**则是容器主动的将资源推送给它所在的管理组件,组件所要做的仅是选择一种合适的方式来接受资源**,这种行为也被称为查找的被动形式。
- IOC(Inversion Of Control)反转控制是spring的基础,简单地说就是创造对象由以前的程序员自己new构造方法来调用,变成了交由spring创建对象。
- Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:
●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。 - AOP(Aspect Oriented Programming )面向切面,AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果 ,通俗点讲就是提供一个为一个业务实现提供切面注入的机制,通过这种方式,在业务运行中将定义好的切面通过切入点绑定到业务中,以实现将一些特殊的逻辑绑定到此业务中 。
- 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能
- 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
- 所谓的周边功能,比如性能统计,日志,事务管理等等
- 周边功能在Spring的面向切面编程AOP思想里,即被定义为切面
- 在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP
- 核心容器:bean,core,context,expression
3.Spring的优点
- 方便解耦,简化开发(高内聚低耦合)
Spring就是一个大工厂(容器),可以将所有的对象创建和依赖关系维护,交给Spring管理 spring工厂是用于生成bean 。 - AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能 - 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程 - 方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序 - 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持 - 降低JavaEE API的使用难度
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
4.Spring的3种配置方式
- 基于XML的配置
- 基于注解的配置
- 基于Java的配置
2.配置Bean
- 配置形式:基于XML文件的方式,基于注解的方式
- Bean的配置方式:通过反射,通过工厂方法,FactoryBean
- IOC容器
1.Spring容器
- 在SpringIOC容器读取Bean配置创建Bean实例之前必须对他进行实例化,只有容器实例化后,才可以从IOC容器里获取Bean实例并使用。
- Spring提供两种类型的IOC容器实现
- BeanFactory:IOC容器的基本实现
- ApplicationContext:提供更多高级的特性,是BeanFactory的子接口
- BeanFactory是Spring框架的基础设施,面向spring本身,ApplicationContext面向Spring框架的开发者,几乎所有的应用场合直接都用ApplicationContext而非BeanFactory。
- 无论什么方式,配置文件相同
//1.创建Spring的IOC容器对象
//ApplicationContext 代表容器
//ClassPathXmlApplicationContext 是 ApplicationContext 接口的实现类:从类路径加载配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.从IOC容器中获取bean实例
//利用id定位到IOC容器中的Bean
HelloWorld helloWorld = (HelloWorld) ctx.getBean("helloworld");
2.依赖注入的方式
1,setter注入
- 属性注入即通过setter方法注入Bean的属性值或依赖的对象
- 属性注入使用property元素,使用name属性指定Bean的属性名称,value属性指定属性值
- 属性注入是最常用的注入方式
<bean id="helloworld" class="com.HelloWorld">
<property name="name2" value="Spring"></property>
</bean>
2,构造器注入
- 通过构造方法注入Bean的属性值或依赖的对象,它保证了Bean实例在实例化后就可以使用。
- 构造器注入<construct-arg>元素声明属性
3,工厂方法注入
4,Bean之间的引用
- 在Bean配置文件中,通过< ref >元素或ref属性为Bean的属性指定对Bean的引用
- 内部Bean
- 在Bean引用时在自己内部构建一个Bean
- 不能被外部Bean引用
- 级联属性赋值:
- 集合属性配置(list和map集合和Properties)
- 使用Utility scheme 定义集合(外部bean可用)
- 通过p 命名空间为Bean的属性赋值
3.自动装配
1.XML配置的Bean自动装配
- Spring IOC容器可以自动装配Bean,需要做的就是仅仅在<bean>的autowire属性里指定自动装配的模式
- byType(根据类型自动装配):若IOC容器中有多个与目标Bean类型一致的Bean,在这种情况下,Spring将无法判哪个合适,所以不能自动装配。
- byName(根据名称自动装配):必须将目标Bean的名称和属性名设置完全相同
<!--自动匹配装配autowire-->
<bean id="person" class="out.Person"
p:name="小哥" autowire="byType">
2.继承Bean配置
- 子Bean可以覆盖从父Bean继承过来的配置
- 并不是《bean》元素里的所有属性都会被继承
- 3.Bean之间的依赖
4.Bean的作用域
- 定义一个作用域
- 当定义一个<bean> 在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean 定义中的scope属性来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope 属性 必须设为 singleton。
- Spring支持的几种bean的作用域
- singleton : bean在每个Spring ioc 容器中只有一个实例
- prototype:一个bean的定义可以有多个实例
- request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
- session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
- global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效
5.Bean的生命周期
Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。
Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成
- 初始化之后调用的回调方法。
- 销毁之前调用的回调方法。
- Spring容器 从XML 文件中读取bean的定义,并实例化bean。
- Spring根据bean的定义填充所有的属性。
- 调用Bean的初始化方法。
- bean就可以使用了
- 当容器关闭时,调用Bean的销毁方法
- 在Bean的声明里设置init-method和destroy-method属性,为Bean指定初始化和销毁方法。