如何在XML配置的Bean中引用注解配置的Bean?
如何在XML配置的Bean中引用注解配置的Bean
嗨,这个问题其实很好解决,Spring早就帮咱们打通了XML配置和注解配置Bean的关联通道,我来一步步给你讲清楚:
核心前提:让Spring容器识别到注解配置的AddObj
首先你得确保Spring能扫描到你的AddObj Bean——不管它是用@Component这类 stereotype 注解标记的,还是用@Bean在配置类里定义的,都得让Spring容器把它加载进来。
情况1:AddObj是用@Component(或@Service/@Repository)注解的
假设你的AddObj代码是这样的:
package com.demo; import org.springframework.stereotype.Component; // 如果指定了name属性,Bean的id就是"AddObj";如果不指定,默认是类名首字母小写(比如addObj) @Component("AddObj") public class Address { // 你的类属性和方法 }
那你只需要在XML配置文件中开启组件扫描,让Spring自动发现这个注解Bean:
<!-- 开启组件扫描,base-package改成你存放AddObj的实际包路径 --> <context:component-scan base-package="com.demo"/> <!-- 你的原empBean配置,直接引用AddObj即可 --> <bean id="empBean" class="com.demo.Employee"> <property name="empId" value="01234"/> <property name="age" value="25"/> <property name="add" ref="AddObj"/> <!-- 这里的ref名称要和注解Bean的id完全一致 --> </bean>
情况2:AddObj是用@Bean在配置类中定义的
如果你的AddObj是通过配置类的@Bean注解生成的,比如:
package com.demo; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { // 指定Bean的id为"AddObj",如果不指定name,默认是方法名addObj @Bean(name = "AddObj") public Address addObj() { return new Address(); } }
那你需要在XML中导入这个配置类,让Spring加载里面的@Bean定义:
<!-- 启用Spring的注解支持(如果用了component-scan可以省略这行) --> <context:annotation-config/> <!-- 导入配置类,Spring会自动加载其中的@Bean --> <bean class="com.demo.AppConfig"/> <!-- 原empBean配置,直接引用AddObj --> <bean id="empBean" class="com.demo.Employee"> <property name="empId" value="01234"/> <property name="age" value="25"/> <property name="add" ref="AddObj"/> </bean>
关键注意事项
- Bean名称必须匹配:XML中
ref的名称要和注解Bean的id完全一致。如果@Component没指定name,默认是类名首字母小写(比如Address类默认id是address);如果@Bean没指定name,默认是方法名。 - 扫描范围要正确:
component-scan的base-package要覆盖到你的注解类所在的包,不然Spring找不到它。 <context:component-scan>包含注解支持:如果已经加了component-scan,就不需要再单独加context:annotation-config了,前者已经包含了后者的功能。
内容的提问来源于stack exchange,提问作者rupasri guruprasad
相关产品推荐
相关产品推荐

