Spring创建bean的几种方法

原创
2017/05/31 16:19
阅读数 293

前言

本文总结spring创建bean的几种方法,在我所学习的范围内尽量求全,如果以后再发现新的方法方式还会进一步补充

创建bean的方式大致有三种:xml配置,JavaConfig配置,@Component自动化配置

本文的实例在另一篇文章中:《Spring创建bean实例》,可做参考。


XML配置

  xml文件配置是最常见的bean创建方法,我们先从最简单开始。

构造器

<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容器中

构造器 +property 实例

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容器中

静态工厂方法

  调用bean的构造函数某个静态方法

<bean id="bean的id" class="包名+类名" factory-method="某个静态方法名">
        <constructor-arg value="参数值"></constructor-arg>           
</bean>

   静态方法的入参,需要用<constructor-arg>

相当于java代码:实例bean = 类.静态方法(参数值); 然后将bean放入spring容器中

实例方法

  调用某个实例方法来生成bean

<bean id="beanA" class="A包+实例类"/>
<bean id="beanB" factory-bean="beanA" factory-method="某个方法" /> 

相当于java代码:实例beanA = new 类A构造方法(); 实例beanB = beanA.某个实例方法(参数值); 然后将beanB放入spring容器中

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>

注意:

  1. 如果想要获得BeanB的实例,需要在id前加&,例如 beanB = applicationContext.getBean("&beanC");
  2. 如果使用@Autowired自动注入实现了FactoryBean接口的类时,可能会出现类型转换错误或者null的问题,因为@Autowired是使用byType注入的,spring可能不能直接获取getObject()的返回类型去注入。因此最好用**@Resource(name="beanC")**,指定beanId来注入

JavaConfig配置

  JavaConfig是与xml并行,相辅相成的一种配置bean模式。使用注解**@Configration** 加在类名前来激活此class为JavaConfig配置

@Bean注解创建

@Configuration  
public class ConfClass{  
  
    @Bean  
    public BeanA beanA(){  
        return new BeanA();  
    }  
}

  @Bean加在某个方法前,方法的返回值即是bean,放入spring容器的bean_id是方法名

  1. 如果使用web服务,则需要修改web.xml中contextConfigLocation的设置,从xml变为java文件 <param-name>contextConfigLocation</param-name>
    <param-value>com.test.ConfClass</param-value>
  2. 如果使用xml配置,使用JAVAConfig配合创建bean,则可以在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>
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部