开源项目
知识点
相关文章
更多最近更新
更多Spring 5种自动装配模式注入bean
2019-04-19 23:34|来源: 网路
在Spring框架,可以用 auto-wiring 功能会自动装配Bean。要启用它,只需要在 <bean>定义“autowire”属性。
<bean id="customer" class="com.common.Customer" autowire="byName" />
在Spring中,支持 5 自动装配模式。
no – 缺省情况下,自动配置是通过“ref”属性手动设定
byName – 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
byType – 按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
constructor – 在构造函数参数的byType方式。
autodetect – 如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”。
示例
Customer 和 Person 对象自动装配示范。
package com.common; public class Customer { private Person person; public Customer(Person person) { this.person = person; } public void setPerson(Person person) { this.person = person; } //... }
package com.common; public class Person { //... }
1. 根据beanId默认注入
这是默认的模式,你需要通过 'ref' 属性来连接 bean。
<bean id="customer" class="com.common.Customer"> <property name="person" ref="person" /> </bean> <bean id="person" class="com.common.Person" />
2. 根据名称自动注入autowire="byName"
按属性名称自动装配。在这种情况下,由于对“person” bean的名称是相同于“customer” bean 的属性(“person”)名称,所以,Spring会自动通过setter方法将其装配 – “setPerson(Person person)“.
<bean id="customer" class="com.common.Customer" autowire="byName" /> <bean id="person" class="com.common.Person" />
3. 根据类型自动注入autowire="byType"
通过按属性的数据类型自动装配Bean。在这种情况下,由于“Person” bean中的数据类型是与“customer” bean的属性(Person对象)的数据类型一样的,所以,Spring会自动通过setter方法将其自动装配。– “setPerson(Person person)“.
<bean id="customer" class="com.common.Customer" autowire="byType" /> <bean id="person" class="com.common.Person" />
4. 根据构造器注入autowire="constructor"
通过构造函数参数的数据类型按属性自动装配Bean。在这种情况下,由于“person” bean的数据类型与“customer” bean的属性(Person对象)的构造函数参数的数据类型是一样的,所以,Spring通过构造方法自动装配 – “public Customer(Person person)“.
<bean id="customer" class="com.common.Customer" autowire="constructor" /> <bean id="person" class="com.yiibai.common.Person" />
5. Auto-Wiring ‘autodetect’
如果找到默认的构造函数,则使用“构造方法”; 否则,使用“byType”。在这种情况下,由于有默认的构造函数在“Customer”类,所以,Spring通过构造方法自动装配 – “public Customer(Person person)“.
<bean id=" customer"="" class="com.common.Customer" autowire="autodetect" >="" <bean="" id="person" >
相关问答
更多-
是不是有一款什么手机软件,可以很自然的拉长腿部?不是美图秀秀,有知道的不?[2022-10-20]
spring -
spring 自动装配后怎么获得bean[2021-06-10]
Chinese c = (Chinese) ctx.getBean("chinese"); 你折行代码应该有问题吧? 错误java.lang.ClassCastException是类型转换错误,不是bean的引用问题 -
spring自动装配小问题[2023-04-03]
第一个问题应该是什么地方写错了,可以使用排除法一点点 缩小范围检查,去掉default-autowire="byName"会不会出错。 第二个问题是你并没有理解自动装配,你用的都是set注入,没有用到自动装配;自动装配应该是有2个 bean,一个bean需要另一个bean的依赖,不需要使用,根据在java类里定义的属性名字为user,自动匹配user Bean。给个例子如下: 定义一个java文件依赖你的user package com.sh ... -
spring 自动装配后怎么获得bean[2021-11-25]
Chinese c = (Chinese) ctx.getBean("chinese"); 你 折行 代码应该 有问题吧? 错误java.lang.ClassCastException是 类型转换错误,不是bean的引用问题 -
春天的英语怎么读?[2022-05-21]
spring -
基于@ Juan的回答,创建了一个帮助器来包装一个不被自动装配的bean: public static
FactoryBean preventAutowire(T bean) { return new FactoryBean () { public T getObject() throws Exception { return bean; } public Class> getObjectType() { ... -
您可以使用JSR-250 @Resource进行by-name bean自动装配,除非需要构造器注入或多参数方法注入。 从文档: 如果您打算通过名称来表达注释驱动的注入,那么不要主要使用@Autowired,即使在技术上能够通过@Qualifier值引用一个bean名称。 而是使用语义定义的JSR-250 @Resource注释,以通过其唯一名称来标识特定目标组件,声明的类型与匹配过程无关。 You can use JSR-250 @Resource for by-name bean autowiring, ...
-
您可以使用@Conditional批注控制bean创建。 此外,如果您需要使用bean的实际控制,您可以创建一些注释,如@ConroledByQualifer,并使用此注释而不是标准的spring组件注释,或者扩展为一个(如service,repository ....)。 因此,春天无法处理自动装配,因为人们不知道如何处理它。 您需要添加可与@ConroledByQualifer一起使用的自定义BeanPostProcessor - 创建它并注入。 因此,您的自定义bean将仅由BeanPostProce ...
-
正如评论中所指出的,问题是您手动创建bean而不是让Spring容器创建它。 基本上,你这样做: new MyBeanOne() 因此Spring容器不能注入您配置的任何字段,因此为null例如jdbcTemplate字段。 有一些解决方案: 将SomeOtherClass转换为由Spring容器管理的bean,并让它注入MyBeanOne实例(可能使用@Autowired注释)。 如果由于需要手动创建bean而无法完成后一种方法,则可以手动创建bean,如下所示: 如何动态创建spring bean? ...