文章目录
  1. 1. 高内聚、低耦合
  2. 2. 面向接口编程
  3. 3. IOC容器
  4. 4. Spring 的注入方式
  5. 5. bean : IOC容器中的对象
  6. 6. AOP :面向切面编程

高内聚、低耦合

  • 内聚性:指一个模块内各元素之间紧密结合的程度
    一个模块内各元素之间联系得越紧密,内聚性越高
  • 低耦合:指一个系统中各模块之间紧密需要的程度
    各模块间的联系越紧密,其耦合性越强,独立性越差

面向接口编程

  • 在结构设计中的层次及调用关系:
    每层只向外(上层)提供一组功能接口,各层之间仅依赖接口,而非依赖于接口的具体实现类
  • 要求接口实现的变动不影响各层之间的调用
  • 用接口定义对象,new它的实体类
    1
    OneInterface one = new OneInterfaceImpl;

IOC容器

  • IOC :控制反转
    指控制权的转移,使获得依赖对象的过程被反转(由自身管理变成了IOC容器的主动注入)
  • DI :依赖注入
    IOC的实现方法,指在程序运行期间,动态地将某种依赖关系注入到容器当中
  • 跟房屋中介的对比嘿嘿

Spring 的注入方式

  • Spring 注入是指在启动 Spring 容器加载 bean 配置的时候,就完成对变量的赋值的行为
  • 设值注入 :对应 set 方法

    即 injectionService 中有一个 injectionDAO 的属性,然后当你有一个 setInjectionDAO 的方法时,spring 就会自动帮你把 injectionDAO 的值注入进去啦
  • 构造注入 :对应构造器

    同上,但此时要求 InjectionSercive 这个类里面要有一个参数为 injectionDAO(大小写必须完全一致)的构造器
  • 注意注意:
    property 中的 name 对应 injectionService 中该属性的名称;其 ref 对应该属性的类型在 bean 中的 id
  • 最后附上两种构造方式对应的java代码 :

bean : IOC容器中的对象

  • bean 的配置项
    • id :在整个IOC容器中bean的唯一标识
    • class :具体要实例化bean的那个类
    • scope :bean的范围,即作用域
    • constructor argument :构造器参数
    • properties :该个bean中所包含的属性
    • autowiring mode :自动装载模式
    • lazy-initialization mode :懒加载模式
    • initialization method :初始化方式
    • destruction method :销毁方式
  • bean 的作用域
    • singleton :单例,指一个bean容器中只存在一份该bean
    • prototype :每次请求(使用)都会创建新的实例
    • request / session :每次http请求都创建一个新实例,且仅在当前 request / session 内有效
  • bean 的生命周期
    • 定义 :在xml中配置的bean
    • 初始化 :生成bean的实例
    • 使用 :从bean容器中取出实例并使用
    • 销毁 :销毁当前实例
    • 注 :可以直接配置全局的初始化 & 销毁方法

      别忘了在xml中配置完成之后还要写对应java代码中的方法哟
    • 注2 :实现 InitialMethod 和 DestroyMethod 接口时,此间指定的方法要先于我们自己在 xml 中为个体 bean 配置的 init-method 和 destroy-method 执行;且均会覆盖全局性的默认方法
  • bean 的自动装配
    此时则不需要使用property或constructor-arg啦
    • no :不做任何操作
    • byName :当将 auto-wire 属性设置为 byName 时,Spring 将尝试将该属性与配置文件中具有相同 id 的 beans 进行匹配和连接。若找到匹配项,则注入该 bean;反之,则抛出异常
    • byType :跟 byName 差不多,只是将要查找的匹配的对象的范围从名称变成了类型(可以理解为从对应的 id 变成了 class )
  • 类的自动检测及 bean 的注册
    • 类的自动检测 :
    • 使用过滤器进行自定义扫描 :

      注:include-filter :”包含”过滤器;
        exclude-filter :”排除”过滤器;
    • 使用注解定义 bean :
  • 使用 @Autowired 注解
    • @Required 注解 :适用于 bean 属性的 setter 方法,该注解表示受影响的 bean 属性必须在配置时就被填充,即通过 bean 定义或通过自动装配得到一个明确的属性值
    • @Autowired 注解 :
      • 既可以用在 setter 方法上,又可以用在构造器上;
      • 默认情况下若找不到合适的 bean,将会导致自动装配失败,抛出异常;
      • 可以通过将其 required 属性标注为 false 来避免;
      • 每个类只能有一个构造器被标记为 required=true,故想要装配的必要属性建议使用 @Required 注解(别了)
    • 对 List/Set 使用 @Autowired :

      即将该接口的全部具体实现类依次装载进list
      注:若希望数组有序,可使用 @Order(int) 注解
    • 对 Map 使用 @Autowired :

      key、value分别对应类的实例和该具体的类
  • 终于到了 @Bean 注解
    • 就和 < bean >< / bean > 是一样的
    • @Bean(name=”xx”) 即对应 xml 配置中的 id
    • 可以使用 @Scope 设置bean的作用范围
    • @Configuration 标注在类上,相当于把该类作为 xml 配置文件中的
    • @Bean 标注在方法上(但要注意是某个返回实例的方法),等价于 xml 配置中的 < bean >

      或者参考这个来进行理解:
      https://blog.csdn.net/javaloveiphone/article/details/52182899
    • 当然啦,既然 @Bean 的作用是注册 bean 对象,那么完全可以使用 @Component、 @Controller、 @Service、 @Ripository 等注解,注意要配置 @ComponentScan 进行自动扫描
  • spring 中的资源文件
    • 首先来放一张图

      property-placeholder : 对应一个资源文件
      location : 对应资源文件的具体位置
      整体作用 :即是用来加载资源文件的啦
    • 这是使用配置文件的情况
    • 这是使用注解的情况

AOP :面向切面编程

  • AOP 的相关概念
    • 切面(Aspect):
      一个关注点的模块化,可以横切多个对象
    • 连接点(Joinpoint):
      程序执行过程中某个特定的节点
    • 通知(Advice):
      在切面的某个特定连接点上执行的动作
    • 切入点(Pointcut):
      用来匹配具体的连接点
    • 引入(Introduction):
      在类的外部为类添加新的方法和属性
    • 目标对象(Target Object):
      被一个或多个切面所通知的对象
    • AOP代理(AOP Proxy):
      AOP框架创建的对象,用来实现切面契约
    • 切面契约(Aspect Contract):
      可以用来通知方法的执行等
    • 织入(Weaving):
      将切面与具体的应用程序类型或对象相连接,并创建一个被通知的对象;分为:编译时织入、类加载时织入、执行时织入
  • Advice(通知)的类型
    • 前置通知(Before advice):
      在某连接点之前执行的通知
    • 返回后通知(After returning advice):
      在某连接点正常完成后所执行的通知
    • 抛出异常后通知(After throwing advice):
      在方法抛出异常退出时所执行的通知
    • 后通知(After/Finally advice):
      当某连接点退出的时候执行的通知(不论该连接点是正常返回还是异常退出,均会执行后通知)
    • 环绕通知(Around advice):
      包围一个连接点(joinpoint)的通知
  • 配置切面 Aspect
    • Spring 中所有的切面和通知器都必须放在一个< aop:config > 里面(可以配置包含多个 < aop:config > 元素),每一个 < aop:config > 中可以包含 pointcut、advisor 和 aspect 元素,但要注意的是它们必须按照这个顺序进行声明
    • 比如这样子:
  • 配置切入点 Pointcut
    • 常用的切入点表达式:
    • 其他的可以在需要用到的时候再查文档嘛
  • Advice的综合应用
    • 前置通知的 xml 配置:

      该通知对应的具体动作:

      程序自然运行到切点处要执行的方法:

      最终运行的结果:
    • 其他的就跟前置通知操作过程差不多了啦
    • 啊对还有一个特殊的-Around advice :

      其中,”obj = pjp.proceed();” 代表程序自然运行到切点处要执行的方法,然后我们就可以在它周围进行环绕,比如这样:

      最后输出的结果为:
    • 另外还可以在通知里面使用参数
      https://www.jianshu.com/p/ff8d0cd69a7e
文章目录
  1. 1. 高内聚、低耦合
  2. 2. 面向接口编程
  3. 3. IOC容器
  4. 4. Spring 的注入方式
  5. 5. bean : IOC容器中的对象
  6. 6. AOP :面向切面编程