三木之注意事项---spring

注解:

@Import:用于注入到Bean 。(注意:如果重复注入,很有可能会导致覆盖原有的bean)

spring中的@import注解

@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  ,并扩展功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值