• Spring 基础知识学习


    Spring 总结

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

    Spring整体架构图

    为了降低Java开发的复杂性,Spring采取了以下4种关键策略:

    • 基于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。

    通过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-命名空间

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

    • 元素
    • p-命名空间

    三种Spring的配置使用总结

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

    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 实战(第四版)》
  • 相关阅读:
    Python实现栈、队列、双端队列
    Redis主从配置、数据持久化、集群
    Redis安装,数据类型及常用命令
    nginx+uwsgi环境部署
    Nginx负载均衡、location匹配
    Nginx安装、多域名访问
    Linux-mysql的备份与恢复
    Linux-mysql主从复制
    Python dumps()的使用
    Python rpush()函数
  • 原文地址:https://www.cnblogs.com/leton/p/11755192.html
Copyright © 2020-2023  润新知