43、Spring的Bean组件

学习目标:

1、深入了解Bean组件的定义

2、了解Bean组件的作用域

学习过程:

所有的组件都需要在配置文件中配置,这样配置文件岂不是很庞大,而且项目中很多组件,组件之间的依赖关系也很多,这样写起来也很麻烦,这节课我们就讲几个小技巧,简化一下我们的工作。另外所有组件都是从容器中取得,这样每个组件是不是都是同一个呢,有没有其它的配置方式呢?

一、导入外部文件

在真实项目中会有很多组件,如果有的组件都写在一个文件里面,这样文件就很大了,而且不容易维护,spring提供了很多方式解决这个问题,可以使用注解,和自动装配,这样就不需要配置了,当然这里介绍另外一种方式就是把配置分开写,实现模块化管理,虽然可能不是最好的方法,不过也实用。不如下面我们定义好几个组件,一般sprinig推荐我们使用面向接口的方式变成,也就是会所所有的组件最好先定义一个接口,在编程中使用接口定义,在配置文件中才定义实现类,比如下面包定义,分时定义了接口和对应的实现类,

新建一个loginContext.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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean name="userAction" class="com.action.UserAction" scope="prototype">
		<property name="loginBiz" ref="loginBiz"></property>
	</bean>

	<bean name="loginBiz" class="com.biz.impl.LoginBizImpl">
		<!-- DI -->
		<property name="userDao" ref="userDao"></property>
		<property name="logDao" ref="logDao"></property>
	</bean>
	<!--
	<bean name="loginBiz" class="com.biz.impl.LoginBizImpl" scope="prototype" autowire="byName">
		 DI 
		<property name="userDao" ref="userDao"></property>
		<property name="logDao" ref="logDao"></property>
		
	</bean>
	-->

	<bean name="userDao" class="com.dao.impl.UserDaoImpl"></bean>

	<bean name="logDao" class="com.dao.impl.LogDaoImpl"></bean>
</beans>

文件可是和applicationContext.xml是一样的,但是我们一般使用applicationContext.xml作为总配置文件,然后导入其他的配置文件。在applicationContext.xml导入loginContext.xml配置文件,代码如下:

<import resource="loginContext.xml"/>

二、自动装配

每一个bean都可以配置autowire来自动装配,比如可以根据名称自动装配。如果bean的名称和属性的名称一致,那么这样就可以简化我们注入的方式了,比如下面的代码我们把属性注入注释了,但是使用名称来自动装配,也是可以注入成功的

	<bean name="loginBiz" class="com.biz.impl.LoginBizImpl">
		<!-- DI -->
		<property name="userDao" ref="userDao"></property>
		<property name="logDao" ref="logDao"></property>
	</bean>

三、组件作用域

不知道大家有没有发现,所有的组件对象都是在家中spring容器时,由容器生成的,而且默认其实都是单例,这样当然可以提供我们程序的运行效率。大家可以做个实验

// 2、从容器里取得bean
LoginBiz loginBiz=(LoginBiz)context.getBean("loginBiz");
LoginBiz loginBiz1=(LoginBiz)context.getBean("loginBiz");
System.out.println(loginBiz);
System.out.println(loginBiz1);

两次通过getBean获得组件,但是对象是一样,打印结果如下:

com.biz.impl.LoginBizImpl@57855c9a
com.biz.impl.LoginBizImpl@57855c9a

那么我们可以让bean每次获得都是一样新的对象吗?这里就需要了解spring的组件的作用域了。Spring中bean的作用域用scope来表示,

singleton,Spring IoC容器只会创建该bean的唯一一个实例,这也是默认的。该实例就会一直放在缓存里供大家使用。

prototype为原型,即每一次请求都会产生一个新的bean实例。

我们可以修改为prototype,在运行一下上面的代码

	<bean name="loginBiz" class="com.biz.impl.LoginBizImpl" scope="prototype" autowire="byName">
		 DI 
		<property name="userDao" ref="userDao"></property>
		<property name="logDao" ref="logDao"></property>
		
	</bean>

结果如下:

com.biz.impl.LoginBizImpl@37271612
com.biz.impl.LoginBizImpl@ed7f8b4

可见已经不是一个对象了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值