依赖注入

发表时间:2017-07-11 16:57:52 浏览量( 45 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

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

一、导入外部文件

在真实项目中会有很多组件,如果有的组件都写在一个文件里面,这样文件就很大了,而且不容易维护,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-3.0.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="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" autowire="byName">
		<!-- 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获得组件,但是对象是一样。


那么我们可以让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>

结果如下:


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