Spring读书笔记-----Spring的Bean之配置依赖

2024-09-04 04:38

本文主要是介绍Spring读书笔记-----Spring的Bean之配置依赖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 前一篇博客介绍了Spring中的Bean的基本概念和作用域(Spring读书笔记-----Spring的Bean之Bean的基本概念 ,现在介绍Spring Bean的基本配置。

          从开始我们知道Java应用中各组件的相互调用的实质可以归纳为依赖关系。根据注入方式的不同,Bean的依赖注入可以分为两种形式:

          1、  属性:通过<property …/>元素配置,对应设置注入。

          2、  构造器参数:通过<constructor-arg…/>元素配置,对应构造注入。

          不管是属性,还是构造器参数,都视为Bean的依赖,接受Spring容器管理,依赖关系的值要么是一个确定的值,要么是Spring容器中的其他Bean的引用。

          在一般情况下,我是不应该在配置文件中管理普通属性的引用,通常只是用配置文件管理容器中的Bean实例的依赖关系。

          Spring在实例化容器时,会校验BeanFactory中每一个Bean的配置。这些校验包括:

          Bean引用的依赖Bean是否指向一个合法的Bean

          Bean的普通属性值是否获得一个有效值。

        对于singleton作用域的Bean,如果没有强行取消其预初始化的行为,系统会在创建Spring容器时预初始化所用singleton Bean,与此同时,该Bean所依赖的Bean也被一起实例化。

          BeanFactoryApplicationContext实例化容器中的Bean的时机也是不同的:BeanFactory等到程序需要Bean实例时才创建Bean,而ApplicationContext是在创建ApplicationContext实例时,会预初始化容器中的全部Bean。同时在创建BeanFactory时不会立即创建Bean实例,所以有可能程序可以正确地创建BeanFactory实例,但是当请求Bean实例时依然抛出一个异常:创建Bean实例或注入它的依赖关系时出现错误。所以当配置错误的延迟出现,会给系统带来一些不安全的因素。而ApplicationContext则是默认预初始化所有singleton作用域的Bean,所以ApplicationContext实例化过程比BeanFactory实例化过程的时间和内存开销大,但是一旦创建成功,应用后面的响应速度会非常快,同时可以检验出配置错误,故一般都是推荐使用ApplicationContext作为Spring容器。

           其实我们可以指定lazy-int=”true”来强制取消singleton作用域的Bean的预初始。这样该Bean就不会随着ApplicationContext启动而预实例化了。

          Spring可以为任何java对象注入任何类型的属性,只要改java对象为该属性提供了对应的setter方法即可。

[html]  view plain  copy
 print ?
  1. <bean id="person" class="lee.Person">  
  2.     <!-- Property配置需要依赖注入的属性 -->  
  3.     <property name="name" value="chenming" />  
  4.     <property name="age" value="22" />  
  5. </bean>  

 

          Spring会为<bean…/>元素创建一个java对象,一个这样的java对象对应一个Bean实例,对于如上代码,Spring会采用如下形式来创建Java实例。

 

[java]  view plain  copy
 print ?
  1. //获取lee.Person类的Class对象  
  2. Class  personClass = Class.forName("lee.Person");  
  3. //创建lee.Person类的默认实例  
  4. Object personBean = personBean.newInStance();  


          创建该实例后,Spring就会遍历该<bean../>元素的所有<property…/>子元素。<bean…/>元素每包含一个<property…/>子元素,Spring就会为该Bean实例调用一次setter方法。类似于下面程序:

[java]  view plain  copy
 print ?
  1. //获取name属性的setter方法  
  2. String setName = "set"+"Name";  
  3. //获取lee.Person类里面的Set()Name方法  
  4. java.lang.reflect.Method setMethod = personClass.getMethod(setName, aVal.getClass());  
  5. //调用Bean实例的SetName()方法  
  6. setMethod.invoke(personBean, aVal);  


          对于使用<constructor-arg…/>元素来指定构造器注入,Spring不会采用默认的构造器来创建Bean实例,而是使用特定的构造器来创建该Bean实例。

[html]  view plain  copy
 print ?
  1. <bean id="person" class="lee.Person">  
  2.     <constructor-arg index="0" value="aVal" />  
  3.     <constructor-arg index="1" value="bVal" />  
  4. </bean>  

 

          针对上面的代码,Spring会采用类似如下的代码来创建Bean实例:

[java]  view plain  copy
 print ?
  1. //获取lee.Person类的class对象  
  2. Class  personClass = Class.forName("lee.Person");  
  3. //获取第一个参数是aVal类型,第二个参数是bVal类型的构造器  
  4. Constructor personCtr = personClass.getConstructor(aVal.getClass(),bVal.getClass());  
  5. //以指定构造器创建Bean实例  
  6. Object bean = personCtr.newInstance(aVal,bVal);  


          上面的程序只是一个实例,实际上Spring还需要根据<property…/>元素、<contructor-arg../>元素所使用value属性,ref属性等来判断需要注入的到底是什么数据类型,并要对这些值进行合适的类型转换,所以Spring的实际处理过程会更加复杂。

 

            读李刚《轻量级Java EE企业应用实战》

这篇关于Spring读书笔记-----Spring的Bean之配置依赖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135016

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2