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-method bean初始化方法,在bean对象创建后,DI注入之后调用,必须为无参方法 destroy-method bean销毁之前调用,只针对单例模式下生效 scope singleton:单例模式 prototype:多例模式 -
DI注入方式
- 构造器注入
- constructor-arg标签
- name:用于指定构造函数中指定参数名称进行注入
- index:用于指定构造函数中参数指定参数顺序进行注入
- value:待注入属性的值
- ref:引用其他SpringBean的ID
- constructor-arg标签
- set方法注入
- property标签
- name:注入时调用的set方法名称
- value:待注入的值
- ref:注入引用其他Bean的id
- property标签
- 构造器注入
-
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;
}