文章目录
Spring
一、Spring特点
1、IOC(Inverse of Control)控制反转
作用
解耦合
Spring框架出现后, 对象的实例不再由调用者来创建,而是由Spring容器来创建。
IOC容器基于BeanFactory和ApplicationContext两个接口
BeanFactory
是一个管理Bean的工厂, 主要负责初始化各种Bean。
主要负责初始化各种Bean。BeanFactory接口有多个实现类,其中比较常用的是 org.springframework.beans.factory.xml.XmlBeanFactory, 该类会根据XML配置文件中的定义来装配 Bean(有关Bean的知识将在本书第3章讲解)。
ApplicationContext(BeanFactory的子接口)
ApplicationContext是BeanFactory的子接口,也称为应用上下文,由org.springframework.context.ApplicationContext接口定义。 ApplicationContext接口除了包含BeanFactory的所有功能以外,还添加了对国际化、资源访问、 事件传播等内容的支持。
1、通过ClassPathXmlApplicationContext创建
ClassPathXmlApplicationContext将从类路径目录(src根目录〉中寻找指定的XML配置文件
2、通过 FileSystemXmlApplicationContext创建
FileSystemXmlApplicationContext将从指定文件的绝对路径中寻找XML配置文件,找到井装载完成 ApplicationContext的实例化工作。
3、通过Web服务器实例化ApplicationContext容器
在 Web 服务器实例化ApplicationContext 容器时, 一般使用基于 org.springframework. web.context.ContextLoaderListener 的实现方式(需要将 spring-web-5.0.2.RELEASE.jar 复制 到 WEB-INF/lib目录中),此方法只需在 web.xml 中添加如下代码
2、DI(依赖注入,通过反射实现)
在Spring中实现IoC容器的方法是依赖注入,依赖注入的作用是在使用Spring框架创建对象时动态地将其所依赖的对象(例如属性值〉注入Bean组件中。
Spring 框架的依赖注入通常有两种实现方式:
- 一种是使用构造方法注入
- 另一种是使用属性的 setter 方法注入。
Spring 框架可 以采用 Java 的反射机制,通过构造方法完成依赖注入。
使用构造方法注入
在配置文件中,constructor-arg元素用于定义类构造方法的参数,index用于定义参数的位置,ref指定某个实例的引用。如果参数是常数值,ref由value代替
使用属性的setter方法注入
使用setter方法注入是Spring框架中最主流的注入方式,它利用JavaBean规范所定义的setter方法来完成注入,灵活且可读性高。对于setter方法注入,Spring框架也是使用Java的反射机制实现的
二、Spring框架的配置文件
没有规定,因为在BeanFactory读取的时候,需要传文件名称
Spring 可以看作一个大型工厂, 用于生产和管理 Spring 容器中的 Bean。 如果要使用这个工厂生产和管理 Bean, 需要开发者将 Bean 配置在 Spring 的配置文件中。 Spring 框架支持 XML 和 Properties 两种格式 的配置文件,在实际开发中常用 XML 格式的配置文件。
三、Bean的实例化对象
如果我们想要使用一个对象,就要实现实例化该对象,同样在Spring框架中,如果想要使用Spring容器中的Bean,也需要实例化Bean,Spring 框架实例化 Bean 有 3 种方式,即构造方法实例化、 静态工厂实例化和实例工厂实例化(其中,最常用的方法是构造方法实例化 )。
1、构造方法实例化
在 Spring 框架中,Spring容器可以调用 Bean 对应类中的无参数构造方法来实例化 Bean,这种方式称为构造方法实例化。
2、静态工厂实例化
在使用静态工厂实例化 Bean 时要求开发者在工厂类中创建一个静态方法来创建Bean的实例。在配置 Bean时, class属性指定静态工厂类,同时还需要使用 factory-method属性指定工厂类中的静态方法 。 下面通过 ch3 应用测试静态工厂实例化。
3、实例工厂实例化
在使用实例工厂实例化 Bean 时要求开发者在工厂类中创建一个实例方法来创建 Bean 的实例。在配置 Bean 时需要使用 factory-bean 属性指定配置的实例工厂,同时还需要使用 factory-method 属性指定实例工厂中的实例方法。
三、Bean的作用域
在Spring中不仅可以完成Bean 的实例化,还可以为 Bean指定作用域。在 Spring5.0 中为 Bean 的实例定义了如表 3.2所示的作用域。
singleton和 prototype是最常用的两种,后面4种作用域仅在 Web Spring应用程序上下文中使用
1、singleton作用域
当将 bean的 scope设置为 singleton时, SpringIoC容器仅生成和管理一个Bean实例。 在使用id或name获取Bean实例时,IoC容器将返回共享的Bean实例。
由于 singleton是 scope 的默认方式 ,因此有两种方式将 bean 的 scope 设置为 singleton。 配置文件示例代码如下:
2、prototype作用域
四、Bean的生命周期
一个对象的生命周期包括创建(实例化与初始化)、使用以及销毁等阶段,在 Spring 中,Bean对象周期也遵循这一过程,但是Spring提供了许多对外接口,允许开发者对3 个过程(实例化、初始化、销毁)的前后做一些操作。在 Spring Bean中,实例化是为 Bean 对象开辟空间,初始化则是对属性的初始化。
一个对象的生命周期包括创建(实例化与初始化)、使用以及销毁等阶段,在 Spring 中, Bean 对象周期也遵循这一过程,但是 Spring 提供了许多对外接口,允许开发者对 3 个过程(实例化、初始化、销毁)的前后做一些操作。在 Spring Bean 中,实例化是为 Bean 对象开辟空间,初始化则是对属性的初始化。
五、Bean的装配方式(获取对象的方式?)
Bean的装配可以理解为将Bean依赖注入到Spring容器中,Bean的装配方式即Bean依赖注入的方式。Spring容器支持基于XML的装配方式、基于注解的装配以及自动装配等多种装配方式,其中最受喜爱的是基于注解的装配.
1、基于xml的装配方式(也就是构造函数装配和使用setter方法装配)
基于 XML 配置的装配方式已经有很久的历史了,曾经是主要的装配方式。通过 2.3 节的学习,我们知道 Spring 提供了两种基于 XML 配置的装配方式, 即使用构造方法注入 和使用属性的 setter方法注入。
在使用构造方法注入方式装配 Bean 时, Bean 的实现类需要提供带参数的构造方法,并在配置文件中使用< bean>元素的子元素来定义构造方法的参数:在使用属性的 setter 方法注入方式装配 Bean 时, Bean 的实现类需要提供一个默认无参数的构造方法,并为需要注入的属性提供对应的setter方法,另外还需要使用元素的子元素为每个属性注入值。
使用注解的装配方式
如果应用中存在大量的注解需要去配置,会导致XML配置文件过于庞大,不方便以后的升级与维护,因此更多时候会推荐使用注解的方式去装配。
1、Component(主件,要在配置文件开启主件扫描)
该注解是一个泛化的概念,仅仅表示一个组件对象( Bean),可以作用在任何层次上。下面通过一个实例讲解@ Component。
听视频的时候的理解是这个相当于
如果后面设置名称,就相当于id=?
注意:
配置注解之后,必须要去扫描注解
2、Repository
该注解用于将数据访问层(DAO)的类标识为Bean, 即注解数据访问层Bean,其功能与@Component相同。
3、Service
该注解用于标注一个业务逻辑组件类(Service层〉,其功能与@Component相同 。
4、Controller
该注解用于标注一个控制器组件类(SpringMVC 的 Controller),其功能与@Component 相同。
5、Autowired
该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配的工作。通过使用@Autowired来消除 setter和 getter方法。 默认按照 Bean 的类型进行装配。
6、Resource
该注解与@Autowired的功能一样,区别在于该注解默认是按照名称来装配注入的,只有当找不到与名称匹配的 Bean 时才会按照、类型来装配注入;而@Autowired 默认按照 Bean 的类型进行装配,
如果想按照名称来装配注入,则需要和@Qualifier注解一起使用 。
@Resource注解有两个属性一-name和type。 name属性指定Bean实例名称,即按照、 名称来装配注入 ;type 属性指定Bean类型,即按照 Bean 的类型进行装配。
7、Qualifier
该注解与@Autowired注解配合使用。当@Autowired 注解需要按照名称来装配注入时需要和该注解一起使用, Bean的实例名称由@Qualifier注解的参数指定 。
8、Spring 的通知是什么?有哪几种类型?
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过 SpringAOP 框架触发的代码段。 Spring 切面可以应用五种类型的通知:
- 1)before:前置通知,在一个方法执行前被调用。
- 2)after: 在方法执行之后调用的通知,无论方法执行是否成功。
- 3)after-returning: 仅当方法成功完成后执行的通知。
- 4)after-throwing: 在方法抛出异常退出时执行的通知。
- 5)around: 在方法执行之前和之后调用的通知。
总结
在上面几个注解中,虽然@Repository、@Service和 @Controller等注解的功能与@Component注解相同,但为了使类的标注更加清晰(层次化),在实际开发中推荐使用 @Repository标注数据访问层(DAO层〉、使用@Service标注业务逻辑层(Service层〉、使用@Controller标注控制器层(控制层)。