Spring学习笔记1-简介

1. Spring是什么

Spring是分层的Java SE/EE应用的full-stack级开发框架

IoC(Inversion of Control)AOP(Aspect Oriented Programming)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及义务层事务管理等众多的企业级应用技术.

还能整合开源世界众多注明的第三方框架和类库. 逐渐成为使用最多的Java EE企业应用开源框架

2. Spring的优势

  • 方便解耦,简化开发
    通过Spring提供的IoC容器, 可以将对象间的依赖关系交由Spring进行控制,避免硬编码缩成的国过度程序耦合

用户也不必再为单例模式型, 属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用

  • AOP编程的支持
    通过Spring的AOP功能, 方便进行面向切面的编程, 许多不容易使用的传统OOP实现的功能可以通过AOP轻松应付

  • 声明事务式的支持
    可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理

  • 方便程序的测试
    可以用非容器依赖的编程方式进行几乎所有的测试工作, 测试不再是昂贵的操作,而是随手可做的事情’

  • 方便集成各种优秀的框架
    Spring可以降低各种框架的使用难度, 提供对各种优秀框架(Struts, Hibernate, Hessian, Quartz等)的直接支持

  • 降低Java EE API的使用难度
    Spring对Java EE(如JDBC, Java Mail, 远程调用等)进行了薄薄的封装, 是这些API使用难度大为降低

  • Java源码是经典的学习范例
    Spring的源代码设计精妙, 结构清晰, 匠心使用, 处处体现着大师对Java设计模式灵活运用及对Java技术的高深造诣. 它的源代码无意是Java技术的最佳实践的翻译

3.Spring的体系结构

Spring Framework Runtime

3.1 耦合和解耦

  • 耦合—程序间的依赖关系
    包括:

    • 类之间的依赖
    • 方法间的依赖
  • 解耦—降低程序间的依赖关系
    实际开发中应该做到编译器不依赖, 运行时才依赖

解耦思路(JDBC解耦):

  1. 使用反射来创建对象, 避免使用new关键字
  2. 通过读取配置文件来获取要创建的对象全限定类名

3.2 控制反转(IoC)

把创建对象的权利交给框架,是框架的重要特征, 并非面向对象编程的专用技术.它包括依赖注入(Dependency Injection--DI)和依赖查找(Dependency Lookup)

IoC的作用:
削减计算机程序的耦合(解除我们代码中的依赖关系)

4. ApplicationContext的三个常用实现类

  • ClassPathXMLApplication
    它可以加载类路径下的配置文件, 要求配置文件必须在类路径下,不在的话,加载不了
  • FileSystemApplicationContext
    它可以加载磁盘任意路径下的配置文件(必须有访问权限)
  • AnnotationConfigApplicationContext
    它是用于读取注解常见容器的

核心容器的两个接口引发出的问题

  • ApplicationContext—Spring在构建核心容器时, 创建对象采取的策略是采用立即加载的方式.也就是说, 只要一读取完配置文件马上就创建配置文件中配置的对象(单例对象使用)
  • BeanFactory—它在构建容器时, 常见对象采取的策略是延迟加载的方式, 也就是说, 什么时候根据id获取对象了, 什么时候才真正的创建对象(多例对象使用)

5. Spring对bean的管理方式

5.1 创建Bean的三种方式

  1. 使用默认构造函数创建
    在Spring配置文件中使用bean标签, 配以id和class属性之后, 且没有其他属性和标签时,采取的就是默认构造函数创建Bean对象, 此时如果类中没有默认构造函数, 则对象无法创
<bean id="service" class="com.test.ServiceImpl" />
  1. 使用普通工厂中的方法创建对象(使用某个类中方法创建, 并存入Spring容器)
<bean id="factory" class="com.test.Factory" />
<bean id="service" factory-bean="factory" factory-method="getService"/>
  1. 使用静态工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入Spring容器)
<bean id="service" factory-bean="com.test.Factory" factory-method="getService"/>

5.2 bean对象的作用范围

bean标签的scope范围

  • singleton—单例(默认值)
  • prototype—多例
  • request—作用与web应用的请求范围
  • session—作用于web应用的回话范围
  • global-session—作用于集群环境的会话范围(全局会话范围), 当不是集群时, 它就是session

5.3 bean对象的的生命周期

  • 单例对象
    • 初始化—当容器创建时
    • 存活—只要容器还在, 对象一置存活
    • 死亡—容器被销毁

总结: 单例对象的生命周期和容器相同

  • 多例对象
    • 初始化–当我们使用对象时
    • 存活—在调用过程中就一直存活
    • 死亡—当对象长时间不用且没有别的对象引用时,由GC负责回收

另外, 我们可以自定义Bean的初始化和销毁方法—容器在bean进行到当前声明周期的时候来调用我们自定义的初始化和销毁方法

  • 指定初始化和销毁方法
    通过@Bean指定init-methoddestory-method
  • 通过让bean实现InitializingBean(定义初始化逻辑)DisposableBean(定义销毁逻辑)
  • 可以使用PostConstruct—在bean创建完成并且属性赋值完成, 来执行初始化方法
    使用PreDestroy—在容器销毁bean之前通知我们进行清理工作

5.4 对象的依赖注入

在当前类需要用到其他类的对象, 由Spring为我们提供, 我们只需要在配置文件中说明依赖关系的维护—依赖注入

能注入的数据有三种

  • 基础类型和String
  • 其他bean类型(在配置文件中获取注解配置过的bean)
  • 复杂类型/集合模式

注入的方式

  • 使用构造函数提供
  • 使用set方法提供
  • 使用注解提供

6 Spring常用注解—bean操作相关

  • @Configuration— 告诉Spring这是一个配置类

  • @ComponentScan—包扫描

    • value—指定要扫描的包
    • excludeFilters={@Filter(type=FilterType, class={......})}—指点扫描的时候按照什么规则排查哪些组件
    • includeFilters={@Filter(type=FilterType, class={......})}, useDefaultFilters=false—指定扫描的时候只需要包含哪些组件
      • FilterType.ANNOTATION —按注解
      • FilterType.ASSIGNBLE_TYPE—按照指定的类型
      • FilterType.ASPECTJ—使用ASPECTJ表达式
      • FilterType.REGEX—使用正则表达式
      • FilterType.CUSTOM—使用自定义
  • @ComponentScans—多个包扫描

  • @Scope—指定bean的作用范围

  • @Lazy—懒加载,第一次使用(获取)Bean时创建对象,并初始化

  • @Condition{Condition}–按照一定的条件进行判断,满足条件给容器注册Bean

    • 该注解可作用于类和方法
  • 包扫描+组件标注注解(@Controller/@Service@Repository/@Component)

  • Bean—导入第三方包里面的组件

  • @Import—快速给容器中导入一个组件

    • @Import(要导入到容器中的组件)—容器中就会自动注册这个组件, id默认是全类名
    • ImportSelect—返回需要导入组件的全类名数组
    • ImportBeanDefinitionRegistry—把所有需要添加到容器中的bean,调用–BeanDefinitionRegistry.registerBeanDefinition手工注册进来,
      可以自定义bean名,Scope等信息
  • 使用Spring提供的FactoryBean(工厂Bean)

    • 默认获取到的是工厂Bean调用getObject创建的对象
    • 要获取工厂Bean本身,我们需要给id前面加一个"&"

8 BeanPostProcessor接口

接口BeanPostProcessor为Interface, 是bean的后置处理器

  • 在bean初始化前后进行一些处理工作
  • postProcessorBeforeInitialization—在初始化方法调用之前
  • postProcessorAfternitialization—在初始化方法调用之后
    执行顺序:
  1. 构造函数
  2. postProcessBeforeInitialization
  3. postConstruct
  4. init-method
  5. postProcessAfterInitialization
  6. preDestroy
  7. destroy-method

Spring对BeanPostProcessor的使用

  • bean赋值
  • 注入其他组件 @Autowried
  • 生命周期注解功能
  • @Async

9 属性赋值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值