spring配置详述与springboot

  1. ApplicationContext接口是BeanFactory的一个扩展,,除了DI服务,ApplicationContext还提供事务、AOP服务、国际化的消息源以及应用程序事件处理等。
  2. <context:component-scan>标记告诉Spring扫描代码,从而找到使用了@Component、@Controller、@Serivice、@Repository注解的注入bean,以及支持在指定包下使用@Autowired、@Inject、@Resource注解的bean。
  3. @Configuration注解用于指定class为配置类,可以在该类型使用@Bean注解方法;
  4. @ComponentScanning是一个java类配置注解,与<context:component-scan>标记同理;
  5. @Resource注解是jdk本身自带的,支持name参数以获得更精细的DI要求;@Autowired是spring提供的注解,@Autowired使用反射来填充需要依赖项;
  6. @Service是@Component的一个特例,@Service表明注解的类正在向应用程序中的其他层提供业务服务;
  7. 方法查找(Lookup Method Injection)@Lookup注入的工作方式是让单例声明一个查找方法,该方法返回非单例Bean的一个实例。spring使用CGlib来生成一个目标类的子类,该类将动态地重写该方法;
  8. 方法替换通过实现MethodReplacer接口,替换目标类的任何方法,实际上使用的也是CGlib方式;
  9. @Autowired配合@Qualifier注解指定注入的具体bean名;
  10. Bean命名规则:为bean设置了id,则bean名称为id,如果没有设置id,spring会查找name属性(第一个值,name中可以设置多个名称),如果id与name属性都没有设置,会将类名作为名称;
  11. 如果项目中有两个不同名称的bean,但是使用同一个类,例如foo与superfoo,如果想把引用superfoo的改为foo,可以删除superfoo的bean,然后在foo的name后面增加一个superfoo的别名;
  12. spring默认情况下所有的bean都是单例的,可以使用scope设置prototype(原型模式)等;
  13. prototype(原型模式)表示spring在每次应用程序请求bean实例时实例化一个新的bean实例;
  14. 什么时候选择使用单例:
    1. 没有状态的共享对象;
    2. 只有可读状态的共享对象;
    3. 具有共享状态的共享对象;
    4. 具有可写状态的高通量对象(应用程序大量创建对象,可以使用同步方式控制写状态)
  15. 实例bean作用域
    1. 单例作用域
    2. 原型作用域
    3. 请求作用域
    4. 会话作用域(http请求带有会话作用的bean)
    5. 全局会话作用域
    6. 线程作用域
    7. 自定义作用域
  16. bean通过xml配置时需要按照注入顺序配置,防止一个bean未初始化的情况下,被另一个bean进行了注入;
  17. 如果bean在xml配置时未按照注入顺序配置,可以通过配置depends-on标志进行注入依赖bean(通过depends-on属性指定bean前置依赖的bean,前置依赖的bean会在本bean实例化之前创建好),需要注意使是一个Abean依赖于另一个Bbean,需要让Abean实现ApplicationContextAware接口;
  18. ApplicationContextAware接口提供了一个特性有spring的接口,Spring容器会检测容器中的所有Bean,如果发现Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身作为参数传给该方法,同时赋给该类对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身,这个过程是在调用bean的构造函数之后完成的。
  19. bean自动装配,可以在xml中配置自动装配模式 autowire="byName"
    1. byName模式
    2. byType
    3. 构造函数
    4. 默认模式
  20. 针对一个类有2个bean配置的情况,可以在一个bean配置中增加primary标志,设置优先使用哪个bean(同一个类型不同名称的);例如一个A类,xml中配置了两个bean,分别的beanname为a1,a2,但是使用时注入的代码为:private A a;这种情况默认使用byType,发现有两个符合注入条件,使用primary就可以解决这种情况;
  21. 针对20出现情况,也可以使用@Autowired配合@Qualifier注解指定注入的具体bean名;
  22. xml中配置init-method,指定类初始化时执行的方法
  23. InitializingBean接口,实现该接口的bean可以获得spring已经完成配置的通知,即可以获得spring中所有bean信息,可以设置bean默认值或者检测bean配置是否正确;
  24. @Postconstruct注解应用于方法上,类似于init-method
  25. @Bean(initMethod="init")同理xml中配置init-method
  26. Bean加载顺序
    1. 首先调用构造函数来创建bean
    2. 注意依赖项(调动setter)
    3. 现在bean已经存在并且提供了依赖项,预初始化的BeanPostProcessor基础机构bean将被查询,以查询看它们是否想从创建的bean中调用任务东西(@Postconstruct注解)
    4. 实现InitializingBean接口的afterPropertiesSet()方法在注入依赖项后立即执行;
    5. 最后执行init-method属性,这是因为它是bean的实际初始化方法;
  27. BeanNameAware接口,实现该接口的类会实现setBeanName方法,通过该方法可以获得beanName值,在打印日志时可以实现beanName的配置值作为日志的一部分,方便查询;
  28. ApplicationContextAware接口,通过实现该接口,可以获得丢配置bean的ApplicationContext实例的应用,创建此接口的原因是为了允许bean在应用程序中访问spring的ApplicationContext,例如通过getBean方法获得指定名称的bean对象。
  29. FactoryBean接口,该接口充当不能使用标准spring语义创建和管理的对象的适配器;FactoryBean可以用在事务代理以及JNDI上下文自动获得资源。

猜你喜欢

转载自www.cnblogs.com/use-D/p/12634039.html