Spring 源码学习
通过注解的形式注入IOC
- 简单的创建一个maven的项目的
- 下载指定的spring的核心jar包(https://mvnrepository.com/artifact/org.springframework/spring-context/5.1.5.RELEASE,我在下载的是最新的jar包)
- 在maven的pom文件中加入spring坐标,等待文件下载
- 通过spring 的配置文件加载bean
a) 创建spring配置文件的xml,我这里叫做spring.xml
b) 创建一个实体类包含名字、年龄等字段
c) 在spring.xml中注入bean的形式,如下
d) 创建一个Test类以及main方法,通过ClassPathXmlApplicationContext加载spring.xml,在通过getBean的方式在配置的bean就可以获得创建的对象,以及输入对象信息
- 通过spring注解的形式加载bean
a) 创建springConfig的类
b) 通过@Configuration注解标记这个一个配置文件
c) 声明一个实体对象,并返回这个对象,通过@bean注入spring容器当中,如下
d) 通过 AnnotationConfigApplicationContext an = new AnnotationConfigApplicationContext(SpringConfig.class);加载java文件,在通过getBean输出实体对象信息,如下图
- 在注解形式里面,通过@ComponentScan进行注解扫描包结构,@ComponentScan也可以配置一些只引入那些,或者排除那些或者使用@ComponentScans配置多个@ComponentScan,主要是使用@filter进行扫描过滤信息。
a) includeFilters 只包含
- 通过使用typeFilter自定义过滤规则(CUSTOM)
a) 实现typeFilter自定义接口,重新了typeFilter的match方法,match方法包含2个参数(MetadataReader,MetadataReaderFactory)分别的意思是:MetadataReader,读取到当前正在扫描的类的信息;MetadataReaderFactory,可以获取其他的类信息,如下图;
b)
- 使用@scope作用域
a) PROTOTYPE(多实例的),ioc启动并不会调用,而是每次获取的时候调用方法创建对象,多次调用就创建多个对象。
b) SINGLETON(单实例的),ioc启动,调用方法,创建单实例的对象
c) 写法
i. 注解方式:@Scope
ii. 配置文件:在bean标签添加scope属性
- 使用@lazy_bean进行加载
a) 主要针对单实例对象说的,在容器启动时就创建对象。所谓懒加载,就是在容器启动不创建对象,而是在第一次获取的创建对象,以后每次获取就不创建了。
- 使用@conditional 按照条件注册实例
a) @Conditional可以被加在类上或者是方法上
i. 放在类上,不满足则所有的bean都不会加载
ii. 放在方法上,只是针对方法
- 使用@import使用
a) 通过导入的方式实现把实例加入springIOC容器中,直接在spring文件的类型上@import(文件。class)就行,也可以多个({文件。Class,。。})。默认注入的bean是文件的全路径.
b) 使用importSelector,返回需要导入的全路径的数据,如下图
c) 使用ImportBeanDefinitionRegistrar 可以自定义注册bean信息,并且指定bean的定义信息。
- 使用factoryBean 容器工厂。
- 生命周期@bean的初始化和销毁
a) 所谓生命周期就是指的是bean的创建、初始化、销毁的过程。现在是有spring容器管理的,但是我们可以自定义初始化和销毁
i. 初始化和销毁:
- 初始化:对象创建完成,并赋值好,调用初始化方法
- 销毁:单实例,容器关闭是会销毁;多实例,容器不会管理这个bean,容器不会销毁bean
b) 使用接口initializeBean初始化,使用disposeable销毁
c) 可以使用JSR250,使用PostConstruct,在bean创建时,并且赋值完成,初始化
使用Predestroy进行销毁。(使用在方法上)
d) 使用BeanPostprocessor接口,bean的后置处理器,在bean初始化前后处理一些工作
e) 使用@value赋值
i. 可以使基本数据类型
ii. 可以使用#{20-2}类型
iii. 可以从配置文件(propertites)读取数据${ }形式,使用@propertitySource加载外部配置文件数据
f) 自动装配
i. 就是spring依赖注入,完成对ioc容器中各个组件的进行赋值@AutoWired
是spring定义的。主要是使用AutoWiredAnnotationPostPrecessor类进行自动装配的
ii. @resouce(JSR250定义的,java 规范),默认是按照属性名称进行装配的
iii. @Inject(JSR330定义的,java 规范),默认是@AutoWired按照他的格式,只不过@Inject不呢个支持required
g) 自动装配还可以使用构造器、方法上,在spring创建对象时,会自动调用该方法装载上spring的容器当中,对象都是容器当中获取的
h) 自定义组件想要使用spring底层的一些组件(AplicationContext,BeanFaction),就可以使用XXXAware,在创建对象时,底层都是使用后置处理器操作的。如下图
- 使用@profile,spring提供了根据当期环境,动态激活和切换一系列的组件 的功能,比如说,在实际开发过程中我们有开发库、测试库以及生产库,使用profile可以自动的切换数据库源,下图:
可以使用命令行得形式激活测试库或者是开发库
- 第一种方式可以配置-Dspring.profiles.active=Test或者dev
- 第二种方式手动配置运行环境
AOP
a) AOP:在程序运行中动态的将某一段代码切换到指定位置进行运行编程方式
b) AOP主要就是运行日志打印,动态代理模式等
c) 日志打印主要包含前置通知、后置通知、返回通知、异常通知以及环绕通知,对应的注解分别的是@before、@after、@afterreturning、@afterException,在这些通知方法都可以声明JoinPoint 类型的参数,获取方法名和方法参数等。