注解:
@Import:用于注入到Bean 。(注意:如果重复注入,很有可能会导致覆盖原有的bean)
@Autowired:注解可以同时标注在属性,方法,参数,构造器的位置上
------------------------------------------------------------------------------------------------------------------
单例生成方式(静态内部类,枚举单例,可有效使用到并发):
静态类部类:初始化单例,可用静态内部类来初始化,解决并发,继承饿汉式和懒汉式的优点,同时解决第一次初始化慢的问题,读写不需要锁
单例多例初始化的区别:
单例bean默认再启动时就被初始化加载到ioc容器里面,而多例是通过每次获取bean对象时才会被创建初始化
注入bean方式:
提供方:
@Autowired是由org.springframework.beans.factory.annotation.Autowired提供,换句话说就是由Spring提供;
@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。
注入方式:
@Autowired只按照通过 类型 注入;
@Resource默认 按类名称小写 自动注入,也提供按照类型注入,name和type属性进行选择性注入;
Springbean 生命周期(简要):
bean创建(执行构造函数)==>初始化(自定义init方法)==>销毁 (初始化方法和销毁方法都可自定义)
bean存储方式:
使用ConurrentHashMap 存储对象,为了保证在多线程情况下线程安全性
Spring上下文获取bean的实现方法:
实现ApplicationContextAware接口来获取bean(可参考:Spring中ApplicationContextAware的作用 实现上下文获取bean)
SpringBean简要生命周期:
Bean实例生命周期的执行过程如下:
-
Spring对bean进行实例化,默认bean是单例;
-
Spring对bean进行依赖注入;
-
如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法;
-
如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来;
-
如果bean实现了ApplicationContextAware接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到bean中;
-
如果bean实现了BeanPostProcessor接口,它的postProcessBeforeInitialization方法将被调用;
-
如果bean实现了InitializingBean接口,spring将调用它的afterPropertiesSet接口方法,类似的如果bean使用了init-method属性声明了初始化方法,该方法也会被调用;
-
如果bean实现了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法将被调用;
-
此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
-
若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用;
springbean的循环依赖:
当两对象都为单例,则 spring会采用三级缓存(缓存中的对象都是非完整对象--即属性没赋值的),当放入一级缓存前,对象会先放入三级缓存里(用于存放非完整对象),,,一级缓存为完整对象
当两对象都为多例,则会产生死循环从而报错
原理如图下:
springAOP:
spring Aop嵌套调用的解决办法
注意:spring 默认不会对切面类(AOP)增强,即不可AOP内嵌AOP,所以切面类里面有需增强方法,都不可以生效;仅可通过调用其他增强代理类里的方法解决; 总结:切面类不能作为被代理对象
原因:
源码:AbstractAutoProxyCreator#postProcessBeforeInstantiation
默认不会对切面类(AOP)增强:
SpringAOP-JDK 动态代理和 CGLIB 代理
在 Spring 中 AOP 代理使用 JDK 动态代理和 CGLIB 代理来实现,默认如果目标对象是接口,则使用 JDK 动态代理,否则使用 CGLIB 来生成代理类。
JDK动态代理:被代理类必须要有实现接口,实现接口InvocationHandler
CGLIB代理:不需实现接口,实现接口MethodInterceptor
--jdk1.8(含)以上jdk动态代理效率高于cglib
原理与源码分析:
启动IOC容器,获取ApplicationContext 的方式有:注解、classpath的XML配置文件、web.xml 配置监听器或servlet 来实现
FactoryBean 和 BeanFactory
BeanFactory 与ApplicationContext 区别
ApplicationContext 继承 BeanFactory ,并扩展功能