JavaNote_1.0.2_Spring

Spring框架定义

Spring Framework:
Spring 最初的项目,包括六大模块:DAO、ORM、AOP、JEE、WEB、CORE。控制反转和面向切面编程是它的核心功能。
Spring Boot:
一套全新的基础框架,用来快速搭建Spring应用,简化其配置和开发过程。
Spring Cloud:
Spring Cloud 是一系列分布式组件的集成框架。它基于Spring Boot为我们快速集成、搭建和部署分布式系统提供支持,包括服务发现与注册、配置管理、负载均衡、消息总线、服务熔断、服务监控等一系列组件功能。
Spring Cloud Data Flow:
基于Spring Cloud的大数据处理开发框架,为基于微服务的分布式流处理和批处理数据通道开发提供了一系列编程模型和最佳实践。
Spring Data:
Spring Data包含若干子项目,其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。
Spring Batch:
这是一个轻量级的批处理应用框架。其提供了大量可重用的组件,包括日志、追踪、事务、任务作业统计、任务重启、跳过、重复、资源管理等。

IoC(inverse of control:) 这是一种设计思想,我们需要自己定义对象,而是把对象的定义权交给容器,让容器管理对象之间的依赖关系。能够实现对象的创建和管理,并提供依赖注入功能的容器就是IoC容器

Spring中的Bean:
Spring要使用IoC容器来管理对象,那么其对象必然就要符合Bean规范。Bean的id只能设置一个,name可以设置多个,除了第一个名字以外都是别名alias

Bean的三类配置方式
XML配置方式
使用来定义。

注解的配置方式
Spring通过了一套注解来标注类,支持用注解的方式来配置bean。但是需要引入spring-context包。
这些注解的定义几乎完全一样,仅仅用于标识当前类的分类和用途。
@Component或者@Component(“demo1”)
标识当前类是一个普通的组件
@Repository或者@Repository(“demo1”)
标识当前类是一个MVC设计模式中持久层的组件。
@Service
主要用于标识当前类是一个MVC设计模式中业务逻辑层的组件。
@Controller
主要用于标识当前类是一个MVC设计模式中控制层的组件

通过Java类的方式来配置:
链接
使用@Configuration注解来标注Java类,并且使用@Bean注解来标注此类的方法。通过这种方式可以将此类转换成一个Bean配置类。配置包扫描后,Spring便可以通过调用这些被@Bean注解的方法,完成Bean的初始化与依赖关系。

BeanFactory 和 FactoryBean

Spring中的BeanFactory是一个接口,其定义了Spring IoC容器最基本的功能,即创建和管理Bean的最基本的方法。

Object getBean(String name) throws BeanException 根据名字或者ID查找bean定义,并且创建新的bean实例且返回其引用,或者返回已创建的bean实例(单例模式)的引用。若找不到则抛出异常。
boolean containsBean(String name) 判断容器中是否有指定名称或ID的bean配置,而非实例。
boolean isSingleton(String name) throws NoSuchBeanDefinitionException 判断指定名称或ID的bean配置是否使用单例模式
boolean isTypeMatch(String name, Class<?> targetType) 判断bean是否是targetType的子类或者实现类。 Class<?> getType(String name) 获取指定名称或ID的Bean配置类型

BeanFactory的衍生家族十分庞大,其中,DefaultListableBeanFactory是它最重要的实现类,也是最基本的、可独立使用的IoC容器,并且是大多数IoC容器的始祖。

FactoryBean是工厂类接口,用于定义如何生产一个Bean。一般情况Spring通过反射技术创建bean,并完成初始化。

ApplicationContext 与 ApplicationContextAware

ApplicationContext接口扩展自BeanFactory接口,该接口实现了BeanFactory的所有功能,并添加了事件传播、国际化、资源文件处理等功能。ClassPathXmlApplicationContext类是它的主要实现类之一,也是最常用的IoC容器之一。它通过从应用的类路径装载并解析XML配置文件来创建IoC容器。
链接

ApplicationContextAware接口用于向Spring容器中的bean注入当前容器的引用。让需要引用当前容器的bean实现此接口即可。容器会检查所有实现了ApplicationContextAware接口的bean,并调用其setApplicationContext()方法,将自己注入给他。

动态注册bean配置

ClassPathXmlApplicationContext等容器类的getBeanFactory()方法,用来返回定义在其内部的DefaultListableBeanFactory的实例。该对象可以实现bean的动态注册。除了直接调用容器的getBeanFactory()方法外,还可以让我们的bean实现BeanFactoryAware接口,让容器将DefaultListableBeanFactory对象注入给我们。

BeanDefinitionBuilder的静态方法genericBeanDefinition()被用于创建bean配置。此方法生成并返回封装bean的配置的BeanDefinition对象。可以通过此对象的addPropertyValue()和addPropertyReference()方法为其添加属性注入配置项,调用addConstructorArg()等方法用于配置构造函数的参数注入。

ApplicationListener与容器事件

Spring的IoC容器运用观察者模式实现了容器范围内的事件机制。当一个容器事件产生时,所有实现了ApplicationListener接口,且泛型类型匹配的bean都将“收到通知”。这些bean的onApplicationEvent()方法都将被调用。
Spring 容器内置了以下4种事件和自定义事件

  1. ContextRefreshedEvent:容器装载完成事件
  2. ContextClosedEvent:容器关闭事件
  3. ContextStartedEvent:容器启动事件
  4. ContextStoppedEvent:容器停止事件

通过继承ApplicationEvent类可以定义自定义事件。调用容器对象(ApplicationContext)的publishEvent(ApplicationEvent event)方法可以发布容器事件。所有监听了对应类型事件或ApplicationEvent事件的bean都将触发onApplicationEvent()事件处理方法。

Bean的基本配置
Scope属性

Scope是bean的标签属性,用来配置bean的作用域。核心选项有两个。

  • singleton:默认值,表示当前bean为单例模式
  • prototype:表示当前bean配置为所有bean实例的原型。每次从容器中获取bean时,总是根据此原型产生一个新的实例。而且,spring在创建此实例、完成初始化动作和依赖注入后,就不再对其进行管理,也就是容器不会持有这些实例的引用。

Spring Framework的Web组件还提供了request、session、global session这三个选项,用于设置bean的生命周期范围,分别对应HTTP请求、会话和全局会话。
Spring还支持自定义bean的作用域,但并不是很实用。

parent和abstract

abstract属性是一个bool值,为true的时候,容器就不会去创建bean实例。类似于抽象类的概念。

parent属性用于指定要“继承”哪一个bean配置,这类似于继承的概念。

factory-bean 与 factory-method

在Spring中可以使用工厂模式完成bean的创建,分为静态工厂方法和非静态工厂方法两种方式。下面的配置等同于这样:TimeUnit.valueOf(“MILLISECONDS”)

<bean class="java.util.concurrent.TimeUnit" factory-method="valueOf">
    <constructor-arg value="MILLISECONDS">
</bean>

这是一个典型的静态工厂方法的形式。valueOf是静态方法,调用此方法返回TimeUnit.MILLISECONDS这一枚举值。
非静态方法则是通过调用工厂类的实例方法来创建bean的。链接

bean的初始化和释放

bean的init-method用于指定当前的bean初始化方法。容器会在创建bean实例后调用此方法。与之对应的是@PostConstruct
相反,destroy-method被用于指定当前bean的释放方法。容器会在释放当前bean实例,或者容器关闭的时候调用此方法。与之对应的是@PreDestroy

依赖注入

Spring支持多种形式的依赖注入,但是归纳起来可以分为属性注入参数注入(构造函数或初始化方法的参数)两种,其他形式都是两种注入的变种,工厂模式进行的注入是属性注入和FactoryBean的结合体。@Autowired的注解可以标注在成员变量上,也可以标注在setter方法上。

Setter注入:
要求被注入的属性必须有Setter方法。链接

工厂方式注入:
可以使用ListFactoryBean一工厂方式注入ArrayList和LinkedList等属性

构造器注入:
如果某个类有带参的构造函数,那么可以让spring通过调用这个构造函数来创造该类实例。

注解注入:
Spring提供了以下3个注解来实现依赖注入

@Autowired
默认根据当前属性的类型,从容器中查找匹配的bean注入。其required属性用于指定注入是不是必须的,在找不到匹配的bean时是否应抛出异常。

当用在成员变量的时候,容器可以自动为变量添加一个getter和setter。
用在setter或普通方法上时,如果该方法拥有多个入参,默认情况下,Spring会自动选择类型匹配的入参来进行注入。可以使用@Qualifier注解来标识某个入参,以用来指定要注入的bean标识符。

@Qualifier
此注解用于指定要引用的bean配置的标识符。

@Lazy
用于告诉Spring容器,首次用到对象时才“注入”,而非容器启动之时。

Spring也支持@Resource和@Inject注解来实现注入
但是 @Resource 并不是Spring注解,而是JDK自带的注解
@Autowired 只能根据类型自动匹配并且注入bean。@Resource默认按照bean标识符查找和注入。可以使用name和type属性

@Resource 只能声明在成员变量上,@Autowire也可以声明在其setter上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值