Spring的Bean装配

本文详细介绍了Spring框架中Bean的配置方式,包括XML配置和Java注解配置,探讨了Bean的作用域、初始化与销毁方法,以及如何通过构造器注入、setter注入等方式配置Bean属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,

    创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入的本质。

    声明Bean:

从Spring3.0开始,Spring容器提供了两种配置Bean的方式,传统上,Spring使用一个或者多个XML作为配置文件,而Spring3.0同时还提供了基于Java注解的配置方式。

1.XML的配置方式:

  <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx" 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
            http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx.xsd
                               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

</beans>

在beans元素内你可以放置所有的Spring配置信息,包括<bean>元素的声明。但是Bean命名空间并不是你遇到的唯一的Spring命名空间,Spring核心框架自带的10个命名空间配置。

aop:为声明切面以及将@AspectJ注解的类代理为Spring切面提供了配置元素。

beans:支持声明Bean和装配Bean,是Spring最核心也是最原始的命名空间。

context:为配置Spring应用上下文提供了配置元素,包括自动检测和自动装配Bean,注入非Spring直接管理对象。

jee:提供了与Java EE API的集成,例如JNDI和EJB。

jms:为声明消息驱动的POJO提供了配置元素。

lang:支持配置由Groovy,JRuby或BeanShell等脚本实现的Bean。

mvc:启动Spring MVC的能力,例如面向注解的控制器,视图控制器和拦截器等

oxm:支持Spring的对象到XML映射配置

tx:提供声明式事物配置

util:提供各种各样的工具类元素,包括把集合配置为Bean,支持属性占位符元素。

 

Bean声明:

<bean id="newBean" class="类所在的路径">  <bean>是Spring元素最基本的配置单元,通过该元素Spring将创建一个对象,这里创建了一个由Spring容器管理的名字为newBean的Bean,id属性定义了Bean的名字,也作为该Bean在Spring容器中的引用。

 

通过构造器注入:在构造Bean的时候,我们可以使用<constructor-arg value=" "||ref=" ">元素来告诉Spring的额外信息。

对于没有公开的构造方法,我们通过工厂方法创建Bean,有时候静态工厂方法是实例化对象的唯一方法,Spring支持通过<bean>元素的factory-method属性来装配工厂创建的Bean,.

public class Stage{

       private Stage(){

         

        }

       private static class StageSingletonHolder(){

         static Stage instance=new Stage();

       }

       public static getInstance(){

       return StageSingletonHolder.instance;

      }

}

<bean id="stage" class="com.jt.Stage" factory-method="getInstance">

Spring Bean的作用域:

所有的Spring Bean默认都是单例,当容器分配一个Bean时(无论是通过装配还是调用容器的getBean()方法),它总是返回一个相同的Bean实例。但有时我们需要每次请求都获得一个唯一的Bean实例。

Bean的作用域:

singleton:在每一个Spring容器中,一个Bean定义只有一个实例(默认)

prototype:允许Bean的定义可以被实例化任意次(每次调用都创建一个实例)

request:在一次HTTP请求中,每个Bean对应一个实例,该作用域仅基于web的Spring上下文(例如Spring MVC)中才有效。

session:在一个HTTP SESSION中,每个Bean对应一个实例,该作用域仅在基于web的Spring上下文中才有效

global-session:在一个全局HTTP SESSION中,每个Bean对应一个实例,该作用域仅在portlet上下文中才有效。

 

初始化和销毁Bean:

当实例化一个Bean时,可能需要执行一些初始化操作来确保该Bean处于可用状态,同样地,当你不需要Bean,将其从容器中移除,我们可能还需要按顺序执行一些清除工作,初始化和销毁只需要调用init-method,destory-method参数来配置<bean>元素

 

通过set方法注入Bean:

通常JavaBean的属性是私有的,同时拥有一组存取器方法,以setXXX()和getXXX()形式存在,,Spring可以借助属性的set方法来配置属性的值,以实现setter方式的注入,在Spring中,我们可以使用<property>元素配置Bean属性,<property>与<constructor-arg>类似,只不过一个是根据构造器来注入值,另一个时根据属性的setter来注入值

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="2048000000" /><!--设置允许上传的最大文件大小,以字节为单位计算。当设为-1时表示无限制,默认是-1。 -->
  <property name="defaultEncoding" value="UTF-8"></property>
  <property name="uploadTempDir" value="/home/certs"></property><!--设置上传文件时的临时目录,默认是Servlet容器的临时目录。 -->
  <property name="maxInMemorySize" value="1024000"></property><!--设置在文件上传时允许写到内存中的最大值,以字节为单位计算,默认是1024000。 -->
 </bean>

还可以注入内部Bean

还可以使用Spring的命名空间p装配属性

装配集合:

list:装配list类型的值,允许重复

set:装配set类型的值,不允许重复

map:装配map类型的值,名称和值可以是任意类型

props:装配properties类型的值,名称和值必须是String类型

map和props的区别:这两个元素分别对应java.util.Map和java.util.Properties,当我们需要键-值对组成的集合时,这两种配置元素非常有用。区别在于:props要求键和值都必须为String类型,map允许键-值可以是任意类型。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值