Spring 基础知识学习

Spring 总结

在Spring框架的发布版本中,共包含了20个不一样的模块,能够划分为6类不一样的功能。java

Spring总体架构图

为了下降Java开发的复杂性,Spring采起了如下4种关键策略:spring

  • 基于POJO的轻量级和最小侵入性编程;
  • 经过依赖注入和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 经过切面和模板减小样板式代码。

依赖注入 DI

建立应用对象之间协做关系的行为一般称为装配(wiring),这也是依赖注入(DI)的本质。编程

当描述bean如何进行装配时,Spring具备很是大的灵活性,它提供了三种主要的装配机制:安全

  • 在XML中进行显式配置。
  • 在Java中进行显式配置。
  • 隐式的bean发现机制和自动装配。

自动化装配bean

Spring从两个角度来实现自动化装配:架构

  • 组件扫描(component scanning):Spring会自动发现应用上下文中所建立的bean。
  • 自动装配(autowiring):Spring自动知足bean之间的依赖。
    组件扫描和自动装配组合在一块儿就能发挥出强大的威力,它们可以将你的显式配置下降到最少。

@Component注解代表该类会做为组件类,并告知Spring要为这个类建立bean
@ComponentScan注解启用组件扫描
@Autowired注解实现自动装配框架

经过Java代码装配bean

@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。3d

经过XML装配bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="knight" class="com.fiberhome.tongl.knight.BraveKnight">
        <constructor-arg ref="quest" />
    </bean>

    <bean id="quest" class="com.fiberhome.tongl.knight.SlayDragonQuest">
        <constructor-arg value="#{T(System).out}" />
    </bean>
</beans>

在XML中声明DI时,会有多种可选的配置方案和风格。具体到构造器注入,有两种基本的配置方案可供选择:代理

  • 元素
  • 使用Spring 3.0所引入的c-命名空间

属性注入,也有两种基本的配置方案可供选择:code

  • 元素
  • p-命名空间

三种Spring的配置使用总结

尽量地使用自动配置的机制。显式配置越少越好,以免显式配置所带来的维护成本。当你必需要显式配置bean的时候(好比,有些源码不是由你来维护的,而当你须要为这些代码配置bean的时候),应该优先选择基于Java的配置,它比基于XML的配置更增强大、类型安全而且易于重构。最后,只有当你想要使用便利的XML命名空间,而且在JavaConfig中没有一样的实现时,才应该使用XML。component

bean的做用域

Spring定义了多种做用域,能够基于这些做用域建立bean,包括:

  • 单例(Singleton):在整个应用中,只建立bean的一个实例。
  • 原型(Prototype):每次注入或者经过Spring应用上下文获取的时候,都会建立一个新的bean实例。
  • 会话(Session):在Web应用中,为每一个会话建立一个bean实例。
  • 请求(Rquest):在Web应用中,为每一个请求建立一个bean实例。

单例是默认的做用域,可是正如以前所述,对于易变的类型,这并不合适。若是选择其余的做用域,要使用@Scope注解,它能够与@Component或@Bean一块儿使用。

注入外部的值

在Spring中,处理外部值的最简单方式就是声明属性源并经过Spring的Environment来检索属性。

@PropertySource引用类路径中.properties的文件。
@Value 属性占位符(配置PropertySourcesPlaceholderConfigurer bean)

面向切面编程(aspect-oriented programming,AOP)

DI有助于应用对象之间的解耦,而AOP能够实现横切关注点与它们所影响的对象之间的解耦。

切点表达式

 

使用注解建立切面

@AspectJ注解解代表类不单单是一个POJO,仍是一个切面

@EnableAspectJAutoProxy注解启用自动代理功能

AspectJ提供了五个注解来定义通知

  • @After 通知方法会在目标方法返回或抛出异常后调用
  • @AfterReturning 通知方法会在目标方法返回后调用
  • @AfterThrowing 通知方法会在目标方法抛出异常后调用
  • @Around 通知方法会将目标方法封装起来
  • @Before 通知方法会在目标方法调用以前执行

Reference

  • 《Spring 实战(第四版)》
相关文章
相关标签/搜索