spring实战

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;
      }
      
  • 配置文件加载
    用法

    • 注入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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值