- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
大家好,我是 god23bin,今天继续说 Spring 的内容,关于 Spring 中 Bean 的配置的,通过上一篇文章的学习,我们知道了 Spring 中的依赖注入,其中有两种主要的方式,分别是 基于构造方法的 DI 和 基于 Setter 的 DI .
我们知道,当写完一个普通的 Java 类后,想让 Spring IoC 容器在创建类的实例对象时使用构造方法完成实例对象的依赖注入,那么就需要在配置元数据中写好类的 Bean 定义,包括各种标签的属性.
如果你是第一次看我这个系列的文章,可能不知道什么是配置元数据,不知道什么是依赖注入,那么请你先去看看我之前的文章,相信对你是有帮助的~ 。
现在我们来说说这其中的配置细节,废话不多说,开始啦! 。
property 标签:用于注入简单属性值,可以通过 name 属性指定属性名称,通过 value 属性指定属性值,或者通过 ref 属性指定引用其他 Bean.
<bean id="employee" class="cn.god23bin.demo.domain.entity.Employee">
<property name="id" value="1" />
<property name="name" value="god23bin" />
<property name="department" ref="department" />
</bean>
<bean id="department" class="cn.god23bin.demo.domain.entity.Department">
<property name="id" value="1" />
<property name="name" value="JUST DO IT" />
</bean>
constructor 标签:使用构造方法参数值进行注入。通过 value 属性指定了参数的具体值,或通过 ref 属性指定了对其他 Bean 的引用。这样,在容器创建 Bean 实例时,会使用指定的参数值调用构造方法,实现构造方法注入.
<bean id="employee" class="cn.god23bin.demo.domain.entity.Employee">
<constructor-arg value="1" />
<constructor-arg value="god23bin" />
<constructor-arg ref="department" />
</bean>
<bean id="department" class="cn.god23bin.demo.domain.entity.Department">
<constructor-arg value="1" />
<constructor-arg value="JUST DO IT" />
</bean>
list 标签:用于注入 List 集合类型的属性值,可以通过 value 子标签指定元素的值,或者通过 ref 子标签指定引用其他 Bean.
<bean id="employee" class="cn.god23bin.demo.domain.entity.Employee">
<property name="skills">
<list>
<value>Java</value>
<value>Spring</value>
<value>MySQL</value>
</list>
</property>
<property name="departments">
<list>
<ref bean="department" />
</list>
</property>
</bean>
<bean id="department" class="cn.god23bin.demo.domain.entity.Department">
<constructor-arg value="1" />
<constructor-arg value="JUST DO IT" />
</bean>
set 标签:用于注入 Set 集合类型的属性值,用法和 list 标签类似.
<bean id="employee" class="cn.god23bin.demo.domain.entity.Employee">
<property name="setProperty">
<set>
<value>Value 1</value>
<ref bean="bean1"/>
<ref bean="bean2"/>
</set>
</property>
</bean>
map 标签:用于注入 Map 集合类型的属性值,可以通过 entry 子标签指定键值对,键可以通过 key 属性指定,值可以通过 value 属性指定,或者通过 ref 子标签指定引用其他Bean.
<bean id="employee" class="cn.god23bin.demo.domain.entity.Employee">
<property name="mapProperty">
<map>
<entry key="key1" value="Value 1"/>
<entry key="key2">
<ref bean="bean1"/>
</entry>
</map>
</property>
</bean>
props 标签:用于注入 Properties 类型的属性值,可以通过 prop 子标签指定键值对,键可以通过 key 属性指定,值可以通过 value 属性指定.
<bean id="employee" class="cn.god23bin.demo.domain.entity.Employee">
<property name="propsProperty">
<props>
<prop key="key1">Value 1</prop>
<prop key="key2">Value 2</prop>
</props>
</property>
</bean>
以上是 Spring XML 配置文件中 Bean 注入的常用标签和集合注入的标签.
正常情况下,举个例子:
public class A {
private B b;
// 省略 getter 和 setter
}
B 这个 Bean 被写成是 A 的属性,也就是说,A 类依赖 B 类,这种正常的依赖关系下,我们在以 XML 为配置元数据的配置文件中,可以使用 ref 属性来指定 A 的依赖项是 B.
<bean id="a" class="cn.god23bin.demo.domain.model.A">
<property name="b" ref="b" />
</bean>
<bean id="b" class="cn.god23bin.demo.domain.model.B"/>
这种依赖关系, 是很明显的 ,一下子就能看出 A 是依赖 B 的,所以我们可以使用 ref 属性来指定依赖项, 与此同时,这个依赖项会被注入到需要它的 Bean 中 ,这里就是 B 的对象被注入到 A 中作为 b 属性.
那么对于依赖关系不明显,但是又有依赖关系的时候,就可以使用 depend-on 属性.
比如有一个类 C,它是 间接依赖 D 类的,也就是说 D 没有作为 C 的属性。此时,想要实例化 C,那么需要 D 先实例化好后,才能去实例化 C.
<bean /> 标签中的 depend-on 属性就能够做到这一点,让这种依赖关系不明显的,也能保证你在使用某个 Bean 时,该 Bean 的依赖项会先实例化.
<!-- 使用 depend-on 属性指定 C 这个 Bean 是依赖于 D 的 -->
<bean id="c" class="cn.god23bin.demo.domain.model.C" depend-on="d" />
<bean id="d" class="cn.god23bin.demo.domain.model.D" />
这样,在使用 C 时,是能够保证 C 的依赖项 D 是已经实例化好的.
如果有多个依赖项,那么可以使用有效的分隔符进行分割(英文逗号、英文分号或者空格):
<!-- 使用 depend-on 属性指定 C 这个 Bean 是依赖于 D 的 -->
<bean id="c" class="cn.god23bin.demo.domain.model.C" depend-on="d,another" />
<bean id="d" class="cn.god23bin.demo.domain.model.D" />
<bean id="another" class="cn.god23bin.demo.model.Another" />
同理,销毁对象的时候,在销毁 C 对象之前,D 就会被先销毁.
<bean /> 标签中的 lazy-init 属性是用来指定某个 Bean 是否开启懒加载的.
默认情况下,Bean 定义中这个属性默认值是 false,也就是说默认的 Bean 都不是懒加载的,当 Spring IoC 容器创建后,容器就会立即去创建并完全配置所有的单例作用域的 Bean.
如果我们想让某个 Bean 不在一开始就被实例化,那么就可以使用这个懒加载属性开启某个 Bean 的懒加载。懒加载的 Bean,只有在被第一次使用时,才会被实例化.
在以 XML 为配置元数据为例,直接使用 lazy-init 属性,设置该属性为 true 就 OK.
<bean id="lazyBean" class="cn.god23bin.demo.domain.model.LazyBean" lazy-init="true" />
当然,如果这个懒加载的 Bean 被其他没有懒加载的单例 Bean 给引用了,那么这个懒加载的 Bean 也会在容器创建后被容器所创建,因为容器必须确保单例 Bean 的依赖项都被实例化了.
Spring 支持 Bean 之间依赖关系的自动注入。 它能根据 ApplicationContext 的内容帮我们处理 Bean 之间的依赖关系,这样我们就可以不用手动在配置元数据中指定 Bean 之间的依赖关系.
网上有很多博客把「自动注入」说成「自动装配」的,在我看来,这是两回事,实际上从它们的英文名来看,就是两回事.
说到自动装配(Auto Configuration),一般都是联系到 Spring Boot 的,因为它的特点就是开箱即用,省去大量的配置,而之所以能省去大量的配置,就得益于它的自动装配。而自动注入(Autowiring Collaborator)是指自动注入协作者,换句话说,指 Bean 之间的依赖项 Spring 能帮你去注入.
可以大大减少我们在配置元数据中进行指定属性或构造方法的参数 。
可以随着对象的发展而更新配置,比如你需要给某个类添加一个新的依赖项,那么你不需要去修改配置元数据,自动注入就帮我们处理 。
以 XML 作为配置元数据的情况下,我们可以使用 <bean /> 标签中的 autowire 属性来指定自动注入的模式.
默认没有自动注入,这就是最开始学习的写法,Bean 的依赖项需要用 ref 属性来指定.
byName
:容器会默认根据 属性名 找到一个同名的 Bean 进行自动注入。
<bean id="employee" class="cn.god23bin.demo.domain.entity.Employee" autowire="byName">
<!-- 属性 -->
</bean>
byType
:容器会默认根据 属性的类型 找到一个同类型的 Bean 进行自动注入,如果存在多个同类型的 Bean,那么 Spring IoC 容器就不知道注入哪一个 Bean,就会抛出异常。
<bean id="employee" class="cn.god23bin.demo.domain.entity.Employee" autowire="byType">
<!-- 属性 -->
</bean>
constructor
:类似 byType,不过它是基于构造方法参数的自动注入。
<bean id="employee" class="cn.god23bin.demo.domain.entity.Employee" autowire="constructor">
<!-- 构造函数参数 -->
</bean>
需要注意的是,自动注入只对那些具有依赖关系的 Bean 起作用,而不是所有的 Bean。因此,在配置 Bean 的时候,需要确保被注入的属性在其他 Bean 中是存在的.
<property />
和 <constructor-args />
编写的明确的依赖关系会覆盖自动注入的,换句话说,它的优先级比自动注入的方式高。还有就是自动注入是不能注入简单的类型的,比如基本数据类型、String、Class 等类型(包括这些类型的数组也是不能自动注入的)。这里的限制是设计上的限制。 byType
中说过的。 对于自动注入匹配到了多个 Bean,有以下解决方案:
<bean />
中的 primary
属性,设置为 true
,那么在多个同类型的 Bean 定义当中,如果匹配上了,那么这个 Bean 就是主要的候选者,就会注入这个 Bean。 @Autowired
、 @Primary
等) 这几个使用注解实现自动注入的,在后面的文章中再讲.
我们总结一下,关于 Spring 中 Bean 的配置与依赖注入的重要内容.
注解
和 Java 配置
作为配置元数据的方式。 property
、 constructor-arg
、 list
、 set
、 map
和 props
,用于注入属性值或集合类型的属性。 depend-on
属性用于指定 Bean 之间的依赖关系,确保指定的 Bean 先于当前 Bean 实例化,这种依赖不是显式的依赖。 lazy-init
属性用于指定 Bean 是否懒加载,默认为 false
,即容器启动时立即实例化所有单例 Bean。 autowire
属性以设置自动注入的模式。 byName
、 byType
和 constructor
,通过属性名或类型进行自动匹配完成依赖注入。 primary
属性或基于注解的自动注入来解决。 以上就是本篇所有的内容了,对屏幕前的你有帮助的话,麻烦点点关注,点个免费的赞,给予我支持与鼓励,感兴趣的话可以关注我这个专栏,谢谢你们! 。
希望各位屏幕前的 靓仔靓女们 给个三连!你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星! 。
咱们下期再见! 。
最后此篇关于Spring中Bean的配置细节的文章就讲到这里了,如果你想了解更多关于Spring中Bean的配置细节的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有什么区别 和 您能解释一下这两者之间有什么区别吗? 最佳答案 它是一个 XML 命名空间,用于分隔可能存在冲突的元素名称,因此没有真正的区别。 XML Namespaces 关于java -
我刚刚浏览了两个 Web 应用程序,在两个项目的“applicationContext.xml”文件中都有一个标记 ... 另一个是 ... 谁能给我解释一下有什么区别吗? 最佳答案 没有语
我一直在尝试了解 WebSphere Commerce 中的 Java bean,但我真的很困惑。请帮帮我。我需要知道: What is the difference between EntityBe
自从我们更新到 grails 2.0.1(从 2.0.0 开始)以来,通过 bean 字段显示的所有 bean 都错误地显示为“withBean”字段的第一个属性。在我下面发布的示例中,所有 [fir
我有一个 bean,我将另一个 beanlist 放入其中,并且我想访问该内部 bean。 我的第一个 Bean 是: public class FirstDTO { private String F
我正在尝试将 CSS 和 JS 添加到 spring MVC 项目中的 JSP 页面,以便我在 dispatcher-servlet.xml 中包含了 js/css 文件夹的引用,如下所示:
当我将请求传递给 RestController 时,出现以下错误。 org.springframework.beans.factory.xml.XmlBeanDefinitionStoreExcept
我看到很多示例将 bean 标记为实体 bean (@Entity) 和命名 bean (CDI),以避免创建 2 个类(托管 bean 和实体 bean)并利用 Bean 验证以便可以执行验证在客户
在我的理解中, session 总是意味着有状态。考虑 servlet session 对象, 想想 cookie。如果 session 是无状态的,我认为我们根本不需要 session 。 在jee
我完全是Spring框架的初学者。我当时正在玩一个创建对象实例的示例。因此需要您的帮助! 看看这个例子: MainApp.java: import org.springframework.contex
这个问题在这里已经有了答案: What is a JavaBean exactly? (23 个回答) 关闭 7 年前。 我已经阅读了有关 EJB、Java Beans 的内容,但是我仍然对“bea
我刚开始使用 Spring-Framework,实际上我正在使用 spring-boot 库。我有以下问题: 我知道在 @Configuration 类中使用 @Bean 注册的 bean 默认是单例
我对下面提到的场景中使用Spring Framework时会创建的实例数量有疑问: bean配置是这样的 or 默认情况下,bean "a"有 singleton scope .所以
在我的 Spring-Module.xml 中,我有两个 bean: ... ... 我像这样实例化我的类: Applicat
@Autowired private Map departments; 我的 spring 配置文件 只要使用 @Autowired 需要日期,它就可以正常工作 同样, 如何使用没有属性
我已经为 ComboBox 设置了 ContainerDataSource this.comboBox.setContainerDataSource(container)。这个容器是一个 BeanIt
为了支持流畅的编程风格,我最近修改了我们的 Java Beans setter 方法以返回 Bean 类。但是现在 Java Beans Activation Framework (rel 1.1)
有人可以告诉我在我的 ApplicationContext 中我必须使用 beans:bean 而不是 bean 的什么以及如何修复它。
我有如下配置: batch:job id="reconciliationJob" job-repository="jobRepository" restartable="true" 在应用程序上下文启
我已经为 Test_flow 创建了简单的测试套件,但是当我尝试运行该流程时出现错误。 java.lang.RuntimeException: org.mule.api.config.Configur
我是一名优秀的程序员,十分优秀!