Spring框架之基础学习

BeanFactory与Applicationcontext

  BeanFactory接口提供了一个抽象的配置和对象的管理机制
  ApplicationContext是BeanFactory的子接口。它简化了与AOP的整合,消息机制,事件机制以及对web的扩展。
  (1)AOP的支持。AnnotationAwareAspectJAutoProxyCreator作用于Bean的初始化之后。
  (2)配置元信息。
  (3)资源管理(Resource抽象)
  (4)事件驱动机制(ApplicationEvent,ApplicationListener)
  (5)Environment抽象

注解驱动与xml驱动ioc容器互通

xml文件中引入注解驱动

  在xml中药引用注解配置,需要开启注解配置,同时注册对应的配置类:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/context 
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 开启注解配置 -->
    <context:annotation-config />
    <bean class="com.test.spring.annotation.config.AnnotationConfiguration"/>
</beans>

注解引用xml

  在注解配置中引用xml,需要在配置类上标注@ImportResource注解,并声明配置文件路径。

@Configuration
@ImportResource("classpath:annotation/application.xml")
public class AnnotationConfiguration {
}

引入外部配置文件

通过注解类引入,添加注解@propertySource

  配置类中通过注解@PropertySource引用properties配置文件。
  在扫描类中可以通过占位符来表示注入。${key},key为properties中的key。

通过配置文件引入

<context:property-placeholder location="classpath:mysql.properties" />

对象的注入(component组件类)

  通过注解@Autowire完成对象注入。也可以通过注解@Resource完成对象注入(这个是按照属性名/Bean的名称注入,这个是属于JSR规范的注解))。@Inject注入(根据类型注入,这个是属于JSR规范的注解)。
  如果IOC容器中包含两个类型相同的bean。可以通过注解@Qualifier,指定注入bean的名称。也可以将要注入的bean上标注注解@Primary,含义是默认注入的Bean。

  @Autowired注入的原理逻辑:
  先拿属性对应的类型,去 IOC 容器中找 Bean ,如果找到了一个,直接返回;如果找到多个类型一样的 Bean , 把属性名拿过去,跟这些 Bean 的 id 逐个对比,如果有一个相同的,直接返回;如果没有任何相同的 id 与要注入的属性名相同,则会抛出 NoUniqueBeanDefinitionException 异常。
在这里插入图片描述
在这里插入图片描述

回调注入与延迟注入

回调注入

  回调注入的核心是一个叫Awarre接口。它来自springframework。
  常用的几个回调接口:
在这里插入图片描述
  简单使用,比如ApplicationContextAware的使用。我们类中只需要实现接口ApplicationContextAware。重写setApplicationContext方法即可。

public class AwaredTestBean implements ApplicationContextAware {
    
    private ApplicationContext ctx;
    
    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        this.ctx = ctx;
    }
}

  上面代码的含义就是,当AwaredTestBean被初始化好的时候,就会把ApplicationContext传给它

延迟注入

  只需要将注入的类型封装为ObjectProvider

  @Autowired
    private ObjectProvider<Person> person;

在这里插入图片描述
  依赖注入的目的与优点:

  1. 依赖注入作为 IOC 的实现方式之一,目的就是解耦
  2. 依赖注入的另一个特点是依赖对象的可配置。通过 xml 或者注解声明,可以指定和调整组件注入的对象,借助 Java 的多态特性,可以不需要大批量的修改就完成依赖注入的对象替换(面向接口编程与依赖注入配合近乎完美)。

BeanFactory 与 FactoryBean的区别

  BeanFactory:spring中实现IOC的最底层容器。从类的继承体系上看,它是最顶层的接口,也就是最顶层的容器实现。从类的组合结构上看,它则是最深层次的容器。
  FactoryBean:它是bean的一种类型,可以使用它来直接创建一些初始化流程比较复杂的对象。

Spring中的作用域

  为什么会出现不同的作用域?
  资源是有限的。如果一个资源允许同时被多个地方访问,那就可以把作用域提高。反正,如果一个资源伴随着一个时效性强的,带强状态的动作,那么这个作用域就应该局限于这一个动作,不能被这个动作之外的干扰。
  spring框架内置的作用域:
在这里插入图片描述

Spring框架干预bean的生命周期

spring框架初始化init-method,销毁方法destroy-method

  1. 在spring配置文件中,组件<bean>的配置有个属性init-method,可以配置要执行初始化的方法。destroy-method可以指定销毁方法。
  2. 在配置类中,有个注解@Bean中有个属性initMethod可以指定初始化方法。destroyMethod可以指定销毁方法。

  这两种方法都有以下特征:
  (1)方法的访问权限无要求。spring会通过反射获取。
  (2)方法无参数。
  (3)方法无返回值。
  (4)可以抛出异常。

InitializingBean和DisposableBean

  这两也是spring框架内部预先定义好的两个关于生命周期的额接口。
  实现InitializingBean接口,重写afterPropertiesSet方法,完成初始化。
  实现DisposableBean接口,重写destroy方法,完成销毁方法。

JSP规范中的初始化,销毁方法

  JSR规范中负责生命周期的注解,包括@PostConstruct@PreDestroy 两个注解,他们分别对应init-methoddestroy-method

三种方式的优先级

  当三种初始化方式都存在的时候,他们的执行顺序为:@PostConstructInitializingBeaninit-method
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值