spring实战
需求来源
玩java不懂spring基本算废了
Spring核心
激发pojo潜能——简化java对象开发
- 拒绝侵入式编程
很多框架会强迫应用继承或实现它的类从而导致与框架绑死,而在spring应用中,一个普通的pojo也可以成为spring组件。
保持松散耦合:通过面向接口编程和依赖注入保持应用对象实现。
依赖注入——松散耦合,控制反转
- 高耦合
每个对象负责管理与自己协作的对象(即依赖对象)。 - 耦合的意义
一是紧密耦合的代码难以测试、复用、理解,二是一定的耦合又是必须的,没有对象协作完成不了任何业务需求。 - DI定义
对象的依赖关系由第三方组件在创建对象的时候设定,而对象无需创建或管理它的依赖关系,也就是说该第三方组件来负责系统中对象依赖关系。 - DI收益
如果一个对象只通过接口来表明依赖关系,那这种依赖可以在对象毫不知情的情况下,用不同的具体实现进行替换,实现松耦合。 - 装配定义
创建应用组件之间协作的行为通常称为装配。Spring有多种装配方式,有基于XML和基于java两种,是通过应用上下文实现的。 - 应用上下文
在基于Spring的应用中,应用对象生存于Spring容器内,由容器负责创建对象,装配对象,并配置对象的整个生命周期。Spring自带多种类型的应用上下文,web应用常用的有AnnotationConfigWebApplicationContext(从Java配置类加载)、XmlWebapplicationContext(从XML配置文件加载)。
应用切面——组件分离
- 横切关注点
系统由不同组件组成,每个组件负责一个特定功能,除了自身核心功能,还负责额外的公共服务职责,如日志、事物、安全等系统级服务。 - 面向切片编程(AOP)
把遍布应用各处的功能分离出来形成可重用的组件,让业务组件只需关注核心业务。Spring可以将一个普通的pojo声明为切面,环绕其他bean方法前后实现改变其行为。
使用模板消除样板式代码——关注核心逻辑
- 样板式代码
JDBC、JMS、JNDI、REST服务等涉及大量的重复代码 - Sring模板
JdbcTemplate、JmsTemplate等模板工具类,包装了大量重复代码,只需传入核心可变部分的参数,如jdbc的sql语句和resutlset包装结果映射,并捕获标准的异常,包装成颗粒度更细的非检查型异常。
装配Bean
Bean生命周期
传统java应用中,bean在Java关键字new后实例化使用,不再被使用则被自动垃圾回收。而Spring容器中就比较复杂,拓展了bean的生命周期
- Spring对bean进行实例化
- Spring对值和bean的引用注入到bean对应的属性中
- 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法
- 如果bean实现了BeanFactoryAware接口,Spring将调用setFactory()方法,将BeanFactory容器实例传入
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引入传入进来
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitilization()方法
- 如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertisesSet()方法,类似地,如果bean使用init-method声明了初始化方法,也会调用方法。
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitilization()方法
- 此时bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁
- 容器关闭时,如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用destory-method申明了销毁方法,该方法也会被调用。
装配类型
- 手动装配
javaConfig装配
@Bean public User getUser(){ return new User(); }
XML装配
<bean id=”user” ckass=”com.dahua.User”> <constructor-arg ref=”name”>//初始化注入其他bean <constructor-arg value=”Hello!lalala”>//注入字面量值 <property ref =”name”>//设置属性为其他bean </bean>
自动化装配
- 组件扫描(componet scanning)
spring自动发现上下文中的bean
将类申明为组件,注解可以是@componet,或@controller/service/respository等都属于组件
启用组件扫描,通过@ComponetScan注解,或xml内 自动装配(autowiring)
spring自动满足bean之间的依赖
注入使用,使用@AutoWired或@resouce注解,一个按类型属于spring的,一个按名称属于jdk的@Component public class user(){} <context:componet-san base-package="com.da"> @Configuration @ComponetScan public class config(){} @AutoWired private User user; public setUser(User user){ this.user = user; }
- 组件扫描(componet scanning)
配置文件加载
用法- 注入bean(PropertyPlaceholderConfigurer)
- 使用el获取值
- 继承PropertyPlaceholderConfigurer并重写setLoactions方法,可以实现加载文件时不存在的现象
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties" /> </bean> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>file:webapps-conf/emap/config.properties</value> <value>file:webapps-conf/jdbc.properties</value> </list> </property> </bean>
面向切面AOP
AOP定义
通知:方法调用时被监听后运行的消息传输
连接点:监听的方法终端
切点:连接点共有的决策通知的逻辑节点
切面:处理通知和指定切点的逻辑类
引入:保存类实例的引用,进而可以相互影响
织入:将切面应用到目标对象而创建新的代理对象的过程
java定义切面
@Aspect
public class User{
@Before()
public void do(){}
@AfterThrowing
@After
@AfterReturning
@Around
}
xml定义切面
<aop:config>
<aop:aspect ref=”user”>
<aop:before pointcut=”” method=”do”/>
<aop: after-throwing pointcut=”” method=”do”/>
<aop: after-around pointcut=”” method=”do”/>
<apo:aspect>
</aop:config>
SpringMVC/REST
spring请求过程
搭配mvc
- 启用Spring mvc,配置jsp视图解析器、参数验证、视图控制、数据转换器,完整xml配置如下:
<?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" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/sche