前言
本文总结spring创建bean的几种方法,在我所学习的范围内尽量求全,如果以后再发现新的方法方式还会进一步补充
创建bean的方式大致有三种:xml配置,JavaConfig配置,@Component自动化配置
本文实例在另一篇文章中:《Spring创建bean实例》,可做参考。
目录
一. XML配置
xml文件配置是最常见的bean创建方法,我们先从最简单开始。
1. 构造器
<bean id="bean的id" class="包名+类名">
<constructor-arg value="参数值"/>
<!--或者 <constructor-arg ref="other_bean_id"/> -->
</bean>
<constructor-arg> 中 value是直接赋值,ref引用其他bean的id作为参数
其中可以有属性 type="int"指定参数的类型,或者index="0"指定第几个参数
相当于java代码:
实例bean = new 类的构造方法(参数值);
创建了bean,然后放入spring容器中
2. property配置(set方法)
调用bean的默认构造方法(无参方法),然后调用set方法将参数设置进去
<bean id="bean的id" class="包名+类名">
<property name="某个参数名" value="参数值"/>
<!--或者 <property ref="other_bean_id" -->
</bean>
<property> 中 value是直接赋值,ref引用其他bean的id作为参数
相当于java代码:
实例bean =new 类构造方法(); bean.setXXX(参数值);
然后将bean放入spring容器中
3. 静态工厂方法
调用bean的构造函数某个静态方法
<bean id="bean的id" class="包名+类名" factory-method="某个静态方法名">
<constructor-arg value="参数值"></constructor-arg>
</bean>
静态方法的入参,需要用<constructor-arg>
相当于java代码:
实例bean = 类.静态方法(参数值);
然后将bean放入spring容器中
4. 实例方法
调用某个实例方法来生成bean
<bean id="beanA" class="A包+实例类"/>
<bean id="beanB" factory-bean="beanA" factory-method="某个方法" />
相当于java代码:
实例beanA = new 类A构造方法(); 实例beanB = beanA.某个实例方法(参数值);
然后将beanB放入spring容器中
5. FactoryBean 方法
如果某个class实现了FactoryBean<T>接口,重写了T getObject()方法,那么这个bean在新建时,在spring容器生成的bean是getObject()方法的返回值,而不是它的构造方法创造的本身的bean。
public class BeanB implements FactoryBean<BeanC> {
@Override
public BeanC getObject() {
return new BeanC();
}
}
//bean最后为BeanC的实例,而不是beanB
<bean id="beanC" class="BeanB">
</bean>
注意:
- 如果想要获得BeanB的实例,需要在id前加&,例如
beanB = applicationContext.getBean("&beanC");
- 如果使用@Autowired自动注入实现了FactoryBean接口的类时,可能会出现类型转换错误或者null的问题,因为@Autowired是使用byType注入的,spring可能不能直接获取getObject()的返回类型去注入。因此最好用@Resource(name="beanC"),指定beanId来注入
二. JavaConfig配置
JavaConfig是与xml并行,相辅相成的一种配置bean模式。使用注解@Configuration 加在类名前来激活此Class为JavaConfig配置
@Bean注解创建
@Configuration
public class ConfClass{
@Bean
public BeanA beanA(){
return new BeanA();
}
}
@Bean加在某个方法前,方法的返回值即是bean,放入spring容器的bean_id是方法名
- 如果使用web服务,则需要修改web.xml中contextConfigLocation的设置,从xml变为java文件 <param-name>contextConfigLocation</param-name>
<param-value>com.test.ConfClass</param-value>- 如果主框架使用spring.xml总配,再写JAVAConfig配合创建bean,则可以在spring.xml中开启
<context:component-scan>
注解扫描,加载此config类,或者import。具体方法请搜索相关文档
三. @Component自动化配置
使用 @Component @Controller @Service这些注解,配合spring注解扫描,实现自动注入bean
@Component
public class BeanA {
public String method() {
return "";
}
}
注解法需要在spring.xml文件下开启注解扫描,配置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 配置扫描的包,会扫描路径下所有包中的含有注解的类(如@Component @Controller, @Service等) -->
<context:component-scan base-package="org.test.*" />
</beans>