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

spring 分层 哪几层是必不可少的 spring各层顺序_自动装配

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种配置方式

  1. 基于XML的配置
  2. 基于注解的配置
  3. 基于Java的配置

2.配置Bean

  1. 配置形式:基于XML文件的方式,基于注解的方式
  2. Bean的配置方式:通过反射,通过工厂方法,FactoryBean
  3. 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)方法组成

  1. 初始化之后调用的回调方法。
  2. 销毁之前调用的回调方法。 
  • Spring容器 从XML 文件中读取bean的定义,并实例化bean。
  • Spring根据bean的定义填充所有的属性。
  • 调用Bean的初始化方法。
  • bean就可以使用了
  • 当容器关闭时,调用Bean的销毁方法
  • 在Bean的声明里设置init-method和destroy-method属性,为Bean指定初始化和销毁方法。