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指定初始化和销毁方法。