spring boot的@Autoware和@Resource的区别
- @Resource 是属于Java中的注解
- @Autowire默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果我们想使用按照名称装配,可以结合@Qualifier注解一起使用;
- @Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象.
注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖的对象时候,会回退到按照类型装配,但一旦指定了name属性,就只能按照名称装配了.
spring bean的生命周期
- Spring 启动,查找并加载需要被 Spring 管理的 Bean,并实例化 Bean。
- 利用依赖注入完成 Bean 中所有属性值的配置注入。
- 如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。
- 如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。
- 如果 Bean 实现了 ApplicationContextAware 接口,则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 实例的引用。
- 如果 Bean 实现了 BeanPostProcessor 接口,则 Spring 调用该接口的预初始化方法 postProcessBeforeInitialzation() 对 Bean 进行加工操作,此处非常重要,Spring 的 AOP 就是利用它实现的。
- 如果 Bean 实现了 InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 方法。
- 如果在配置文件中通过 init-method 属性指定了初始化方法,则调用该初始化方法。
- 如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的初始化方法 PostProcessAfterInitialization()。此时,Bean 已经可以被应用系统使用了。
- 如果在 中指定了该 Bean 的作用域为 singleton,则将该 Bean 放入 Spring IoC 的缓存池中,触发 Spring 对该 Bean 的生命周期管理;如果在 中指定了该 Bean 的作用域为 prototype,则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。
- 如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法销毁 Bean;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。
SpringBoot的自动装配原理
springboot
是通过main
方法下的SpringApplication.run
方法启动的,
启动的时候他会调用refshContext
方法,先刷新容器,- 然后根据解析注解或者解析配置文件的形式注册
bean
,
而它是通过启动类的SpringBootApplication注解
进行开始解析的, - 他会根据
EnableAutoConfiguration
开启自动化配置,里面有个核心方法ImportSelect
选择性的导入,根据loadFanctoryNames
根据classpash
路径以MATA-INF/spring.factorces
下面以什么什么EnableAutoConfiguration
开头的key
去加载里面所有对应的自动化配置,
他并不是把这一百二十多个自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,先判断是否引入相互的jar包
,再判断容器是否有bean
再进行注入到bean容器
Spring注解的实现原理
https://blog.csdn.net/weixin_43637366/article/details/104095265
SpringAOP相关
- AOP相关的概念
1) Aspect :切面,切入系统的一个切面。比如事务管理是一个切面,权限管理也是一个切面;
2) Join point :连接点,也就是可以进行横向切入的位置;
3) Advice :通知,切面在某个连接点执行的操作(分为: Before advice , After returning advice , After throwing advice , After (finally) advice , Around advice );
4) Pointcut :切点,符合切点表达式的连接点,也就是真正被切入的地方;
- AOP 的实现原理
AOP分为静态AOP和动态AOP。
静态AOP是指AspectJ实现的AOP,他是将切面代码直接编译到Java类文件中。
动态AOP是指将切面代码进行动态织入实现的AOP。
Spring的AOP为动态AOP,实现的技术为: JDK提供的动态代理技术 和 CGLIB(动态字节码增强技术) 。尽管实现技术不一样,但 都是基于代理模式 , 都是生成一个代理对象 。
JDK动态代理
主要使用到 InvocationHandler 接口和 Proxy.newProxyInstance() 方法。
JDK动态代理要求被代理实现一个接口,只有接口中的方法才能够被代理 。
其方法是将被代理对象注入到一个中间对象,而中间对象实现InvocationHandler接口,
在实现该接口时,可以在 被代理对象调用它的方法时,在调用的前后插入一些代码。
而 Proxy.newProxyInstance() 能够利用中间对象来生产代理对象。
插入的代码就是切面代码。所以使用JDK动态代理可以实现AOP。