1、容器与Bean
容器理解
从这张图能看到
重要容器有BeanFactory
ConfigurableApplicationContext
它们的关系是ConfigurableApplicationContext间接继承了ApplicationContext
然后间接继承了BeanFactory
BeanFactory从侧面看到Spring有在用工厂模式。
除此之外spring还用了单例模式、动态代理模式(aop)等等
那么
什么是BeanFactory
他是ApplicationContext父接口,也就是ApplicationContext是BeanFactory的孙子
它是核心容器,ApplicationContext是实现功能
ConfigurableApplicationContext.getBean(“sdffds”)
这个方法实际在用BeanFactory方法
BeanFactory主要包括哪些方法
常用的其实是getBean containsBean isSingleton
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String var1) throws BeansException;
<T> T getBean(String var1, Class<T> var2) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> var1);
<T> ObjectProvider<T> getBeanProvider(ResolvableType var1);
boolean containsBean(String var1);
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;
String[] getAliases(String var1);
}
主要看它的实现类
包括实现了控制反转、基本注解注入、直至Bean的生命周期
Bean的生命周期
实例化 Instantiation
属性赋值 Populate
初始化 Initialization
销毁 Destruction
Spring:简单、高效、成熟框架
微服务:独立运行生产级别
反应性:异步、解耦,通常用mq中间件。
云服务:所有平台,都支持连接和扩展服务
网络应用:快速、安全和响应式Web应用
无服务器:灵活
事件驱动:与企业集成,实时处理流数据
自动化任务:一次离线处理数据
特征
核心技术:依赖注入、事件、资源、i18n、验证、数据绑定、类型转换、SpEL、AOP。
测试:模拟对象、TestContext 框架、Spring MVC 测试、WebTestClient.
数据访问:事务、DAO 支持、JDBC、ORM、编组 XML。
Spring MVC和 Spring WebFlux Web 框架。
集成:远程处理、JMS、JCA、JMX、电子邮件、任务、调度、缓存。
语言:Kotlin、Groovy、动态语言。
2、AOP
主要实现了动态代理的功能,是面向切面编程的思路升级。
在OOP中我们以类为基本单位,而在aop中基本单元是Aspect
使用@Aspect注解的类就是切面。
有哪些类型的通知
@Before
@After Returning
@After Throwing
@After
@Around
aop有哪些实现方式?
静态代理
使用aop框架提供的命令进行编译,从而在编译的时候生成aop代理类
1、编译时编织
2、类加载时编织
动态代理
在运行时内存中临时生成aop动态代理类,也称为运行时增强
1、jdk动态代理
代理对象和目标对象是兄弟关系,都实现了Foo接口,代理对象类型不能强转成目标对象类型;
目标类定义的时候可以加final修饰。
2、CGLIB
1 MethodInterceptor的intercept()方法的第2个参数是method,可以通过反射对目标方法进行调用
Object result = method.invoke(target, args); // 用方法反射调用目标
2 第4个参数proxy,可以不用反射就能对目标方法进行调用;
Object result = proxy.invoke(target, args); // 需要传目标类 (spring用的是这种)
// 或者
Object result = proxy.invokeSuper(obj, args); // 不需要目标类,需要代理自己
3 代理类不需要实现接口;
4 代理对象和目标对象是父子关系,代理类继承于目标类;
5 目标类定义的时候不能加final修饰,否则代理类就无法继承目标类了,会报java.lang.IllegalArgumentException: Cannot subclass final class top.jacktgq.proxy.cglib.Target异常;
6 目标类方法定义的时候不能加final修饰,否则代理类继承目标类以后就不能重写目标类的方法了。
3、总结:spring
执行流程
spring的执行流程:
前提:做容器刷新准备工作
1、设置容器的启动时间
2、设置活跃状态为true
3、设置关闭状态为false
4、获取environment对象,并加载当前系统属性值到environement
对象中
5、准备监听器和事件的集合对象,默认为空集合