基础知识
本文为Spring基础知识个人梳理
1.Spring IoC的容器构建流程
1.获取一个新的bean工厂:通常是ApplicationContext
2.加载和解析Spring的配置,解析bean对象,将解析到的bean封装成BeanDefinition,并放到本地缓存中
3.实例化和调用BeanFactoryPostProcessor的扩展方法,这边是一个非常重要的扩展点
4.实例化BeanPostProcessor,加载到BeanFactory中,但是这边还不出发,该扩展接口的方法在bean对象执行初始化方法前后被触发,这边是另一个重要扩展点
5.实例化所有剩余的bean实例,包括:创建bean实例、bean实例属性填充、bean实例的初始化
6.完成容器刷新,推送上下文刷新完毕事件到监听器
2.Spring bean的生命周期
1.bean实例化,创建一个bean对象
Spring会扫描指定包下面的Java类,然后将其变成beanDefinition对象,然后Spring会根据beanDefinition来创建bean,特别要记住一点,Spring是根据beanDefinition来创建Spring bean的
2.属性填充阶段
3.初始化阶段
4.bean正常使用阶段
5.销毁阶段
3.Spring事务的实现原理
Spring 事务的底层实现主要使用的技术:AOP(动态代理) + ThreadLocal + try/catch。
动态代理:基本所有要进行逻辑增强的地方都会用到动态代理,AOP 底层也是通过动态代理实现。
ThreadLocal:主要用于线程间的资源隔离,以此实现不同线程可以使用不同的数据源、隔离级别等等。
try/catch:最终是执行 commit 还是 rollback,是根据业务逻辑处理是否抛出异常来决定。
4.@Resource和@Autowire的区别
1.@Resource和@Autowire都可以用来装配bean。
2.@Autowire默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置他的required属性为false。
3.@Resource如果指定了name或type,则按指定的进行装配;如果都不指定,则优先按名称装配,当找不到名称匹配的bean时才按照类型进行装配。。
5.@Autowire怎么使用名称来注入
配合@Qualifier使用,例如@Qualifier(“userService”)
6.使用MyBatis时,调用DAO接口时是怎么调用到SQL的?
简单点说,当我们使用 Spring+MyBatis 时:
1、DAO接口会被加载到 Spring 容器中,通过动态代理来创建
2、XML中的SQL会被解析并保存到本地缓存中,key是SQL 的 namespace + id,value 是SQL的封装
3、当我们调用DAO接口时,会走到代理类中,通过接口的全路径名,从步骤2的缓存中找到对应的SQL,然后执行并返回结果
7.Spring常用注解都有哪些
- @Component(任何层)、@Controller、@Service、@Repository(dao):用于实例化对象
- @Autowired:对象属性的依赖注入
- @Qualifier:要和 @Autowired 联合使用,代表在按照类型匹配的基础上,再按照名称匹配
- @Resource:按照属性名称依赖注入
- @ComponentScan:组件扫描
- @Configuration:被此注解标注的类,会被 Spring 认为是配置类。Spring 在启动的时候会自动扫描并加载所有配置类,然后将配置类中的 bean 放入容器
- @Transactional:此注解可标注在类上,也可标注在方法上,表示当前类中的方法具有事务管理功能
- @Value:简单属性的依赖注入
- @Bean:标注在方法上,用于将方法的返回值对象放入容器
- @Import:在一个配置类中导入其他配置类的内容
- @Scope:设置 Spring 对象的作用域
- @PostConstruct、@PreDestroy:用于设置 Spring 创建对象在对象创建之后和销毁之前要执行的方法
- @PropertySource:用于引入其他的 properties 配置文件
8.@Component和@Service的区别
@Component:spring基础的注解,被spring管理的组件或bean
@Repository:用于持久层,数据库访问层
@Service:用于服务层,处理业务逻辑
@Controller:用于呈现层,(spring-mvc)