Spring学习笔记

Spring学习笔记

第一部分Spring概述

spring是分层的full-stack轻量级的开源框架,以IOC、AOP为内核、以SpringMVC为展现层。

优势:

  • 解耦:IOC容器可以将对象的依赖关系交给Spring来控制
  • AOP编程支持
  • 声明式事务: @Transactional
  • 方便测试
  • 方便继承其他优秀的框架
  • 降低了JAVAEE API的使用难度

spring核心结构

  • 数据处理模块(Data Access):JDBC、JMS、ORM、OXM
  • Web模块:SpringMVC、Spring WebFlux
  • AOP
  • Core Container:SpEL、Core、Context、Beans …

第二部分核心思想

2.1 IOC

2.1.1 什么是IOC

Inversion of Control:控制反转,这是一种技术思想,在JAVA开发领域将对象创建交给Spring来管控和控制。

2.1.2 IOC解决了对象之间耦合的问题
2.1.3 IOC和DI的区别

DI:Dependancy Injection 依赖注入

IOC在对象角度将对象的实例化和管理交给了容器

DI站在容器的角度,在对象依赖的其他对象注入到该对象中

2.2 AOP

Aspect oriented Programming ⾯向切⾯编程/⾯向⽅⾯编程

AOP是在OOP的基础上的延续,在不改变原有业务逻辑的基础上,抽取横切代码。

第三部分 IOC容器

3.1 实例化Bean的方式

3.1.1 纯XML配置 或 XML+注解方式
1.需要beans.xml配置文件来配置bean
2.加载方式:
	JAVASE:ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
								   = new FileSystemXmlApplicationContext("beans.xml");
    JavaWeb web配置文件中 ContextLoaderListener监听器去加载xml

web配置文件配置

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
 <display-name>Archetype Created Web Application</display-name>
 <!--配置Spring ioc容器的配置⽂件-->
 <context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath:applicationContext.xml</param-value>
 </context-param>
 <!--使⽤监听器启动Spring的IOC容器-->
 <listener>
 <listenerclass>org.springframework.web.context.ContextLoaderListener</listenerclass>
 </listener>
</web-app>
3.1.2 纯注解方式
加载方式:指定配置文件类
	JAVASE:ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

    JavaWeb web配置文件中 ContextLoaderListener监听器去加载注解配置类

web配置文件配置

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
 <display-name>Archetype Created Web Application</display-name>
 <!--告诉ContextloaderListener知道我们使⽤注解的⽅式启动ioc容器-->
 <context-param>
 <param-name>contextClass</param-name>
 <paramvalue>org.springframework.web.context.support.AnnotationConfigWebAppli
cationContext</param-value>
 </context-param>

3.2配置-Start

Spring 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"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
     https://www.springframework.org/schema/beans/spring-beans.xsd">
    
  • 标签属性

    id用于创建bean的唯一标识
    class用于创建bean的全限定类名
    name可以给bean定义一个或多个名称。多个用空格分隔
    factory-bean用于创建bean对象的工厂bean的唯一标识。当指定该属性后,class属性失效
    factory-method用于创建当前bean对象的工厂bean中的方法,如配合factory-bean使用class属性失效,如配合calss属性使用,则class属性指定工厂bean的全限定类名,且生产bean方法必须为静态方法
    init-methodbean初始化方法,在bean对象创建后,DI注入之后调用,必须为无参方法
    destroy-methodbean销毁之前调用,只针对单例模式下生效
    scopesingleton:单例模式 prototype:多例模式
  • DI注入方式

    • 构造器注入
      • constructor-arg标签
        • name:用于指定构造函数中指定参数名称进行注入
        • index:用于指定构造函数中参数指定参数顺序进行注入
        • value:待注入属性的值
        • ref:引用其他SpringBean的ID
    • set方法注入
      • property标签
        • name:注入时调用的set方法名称
        • value:待注入的值
        • ref:注入引用其他Bean的id
  • DI注入数据类型

    • 基础数据类型+String
    • 其他Bean类型
    • 复杂类型(List、Map、Set、Properties)

3.3 IOC高级特性

3.3.1 lazy-init 延迟加载模式

Spring IOC 容器初始化时默认会将所有Bean都进行实例化

当配置lazy-init为true时,只有在获取该对象时才会进行实例化

XML配置方式

<bean id="testBean" calss="cn.lagou.LazyBean" lazy-init="false" />

注解配置方式

@Lazy
public class Person

全局配置方式

<beans default-lazy-init="true" ...
</beans>      
3.3.2 BeanFactory和FactoryBean
  • BeanFactory接口是IOC容器的顶层接口

  • FactoryBean是用于生产Bean对象的接口

    //FactoryBean接口源码
    
    // 可以让我们⾃定义Bean的创建过程(完成复杂Bean的定义)
    public interface FactoryBean<T> {
     @Nullable
     // 返回FactoryBean创建的Bean实例,如果isSingleton返回true,则该实例会放到Spring容器
    的单例对象缓存池中Map
     T getObject() throws Exception;
        
     @Nullable
     // 返回FactoryBean创建的Bean类型
     Class<?> getObjectType();
        
     // 返回作⽤域是否单例
     default boolean isSingleton() {
     return true;
     } 
    
    }
    

    例如 CompanyFactoryBean 实现了 FactoryBean

    则在xml文件中配置

    <bean id="companyBean" class="com.lagou.edu.factory.CompanyFactoryBean">
     <property name="companyInfo" value="拉勾,中关村,500"/>
    </bean>
    

    测试获取Bean

    Object companyBean = applicationContext.getBean("companyBean");
    System.out.println("bean:" + companyBean);
    此时输出的是company对象
        
    Object companyBean = applicationContext.getBean("&companyBean");
    System.out.println("bean:" + companyBean);
    此时输出的是工厂Bean对象
    
3.3.3 后置处理器

Spring提供了两种后处理bean的扩展接⼝

  • BeanPostProcessor是针对Bean级别的处理
public interface BeanPostProcessor {

	@Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}


	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //生成AOP代理对象时在此实现
		return bean;
	}

}

  • BeanFactoryPostProcessor是针对整个Bean工厂进行处理
@FunctionalInterface
public interface BeanFactoryPostProcessor {

	/**
	 * 
	 */
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值