Java

Spring要点记录

2020-08-07  本文已影响0人  AC编程

一、Spring Bean 生命周期

1、class
2、BeanDefinition
3、BeanFactoryPostProcessor
4、反射创建对象
5、填充属性
6、Aware
7、初始化
8、AOP
9、单例池

二、Spring Bean

被Spring管理的对象叫bean

三、SpringBoot内嵌Tomcat

Tomcat的源码是用Java写的,SpringBoot直接将Tomcat的源码导过来进行依赖,调用Tomcat的源码进行启动Tomcat

四、web项目的入口

非web项目程序的入口是main函数;web项目的入口是web.xml

五、SpirngBoot 如何实现零配置(连web.xml都不需要)

5.1 web.xml做了什么?

1、配置一个DispatcherServlet
这个已经被servletCxt.addServlet("app", servlet)取代了

2、配置一个ContextLoaderListener,执行Spring的初始化
这个已经被WebApplicationInitializer 取代了

5.2 WebApplicationInitializer 何时被调用执行?

servlet 3.0有一个新特性:web容器加载一个项目的时候,如果这个项目当中提供了一个接口ServletContainerInitializer,并且配置了这个接口,那么就会调用这个接口的onStartUp()方法,调用onStartup的时候会传入两个参数,其中一个叫Set<Class<?>> webAppInitializerClasses,webAppInitializerClasses表示实现了当前类上面注解HandlesTypes的接口的所有实现类的集合。

遵循SPI机制,Spring源码在resources/META-INF/services/ 目录下配置了接口名字,接口名字为:org.springframework.web.SpringServletContainerInitializer

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer{

    @Override
    public void onStartUp(@Nullable Set<Class<?>> webAppInitializerClasses,Servlet servlet){
         // 省略
    }
}

即会把WebApplicationInitializer及其所有实现类都会做为参数传给SpringServletContainerInitializer的onStartUp方法执行,因此以下代码MyWebApplicationInitializer在tomcat启动后会被执行。

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletCxt) {

        // Load Spring web application configuration
        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
        ac.register(AppConfig.class);
        ac.refresh();

        // Create and register the DispatcherServlet
        DispatcherServlet servlet = new DispatcherServlet(ac);
        ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("/app/*");
    }
}

代码来自Spring官网

六、Spring IOC 注入方式

1、@Autowired自动装配:no、byType、byName
2、setter 方法注入
3、构造器注入

七、Spring循环依赖

Spring中是通过三级缓存来解决循环依赖的。

正常情况下用两级缓存就可以解决循环依赖问题了。但要处理AOP的问题,所以需要使用三级缓存来处理代理对象,所以Spring中使用的是三级缓存。

八、Spring动态代理实现方式

8.1 Java动态代理 & CGLIB动态代理
8.2 JDK动态代理和CGLIB字节码生成的区别?
8.3 适用场景
8.4 如何强制使用CGLIB实现AOP

1、添加CGLIB库,SPRING_HOME/cglib/*.jar
2、在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class=“true”/>

从动态代理实现到Spring AOP看这一篇就够了

上一篇下一篇

猜你喜欢

热点阅读