您的位置:首页 > 编程语言 > Java开发

Spring注入

2016-04-08 11:41 387 查看
以redis为例子对spring配置文件的注入进行详述下:
在配置文件中有一个配置文件,名称为: spring-config-redis.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byName">
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="500" />
<property name="testOnBorrow" value="true" />
</bean>

<bean id="jedis.shardInfo1" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="${redis.host1}" />
<constructor-arg index="1" value="${redis.port1}" />
</bean>

<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<ref bean="jedis.shardInfo1" />
</list>
</constructor-arg>
</bean>

<bean id="redisUtil" class="com.diligrp.website.util.redis.impl.RedisUtilImpl">
<property name="shardedJedisPool" ref="shardedJedisPool" />
</bean>

<bean id="manageRedisUtil" class="com.diligrp.website.util.redis.impl.RedisUtilImpl">
<property name="shardedJedisPool" ref="shardedJedisPool" />
</bean>

</beans>

如上,spring通过bean层层注入的,在class="com.diligrp.website.util.redis.impl.RedisUtilImpl"里面有一个属性名为shardedJedisPool 的属性 (private ShardedJedisPool shardedJedisPool;),但是shardedJedisPool 也是一个Object类型,.
class="redis.clients.jedis.ShardedJedisPool",是通过构造函数进行注入的的如下:

<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<ref bean="jedis.shardInfo1" />
</list>
</constructor-arg>

这两个构造函数里面的参数分别是:

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="500" />
<property name="testOnBorrow" value="true" />
</bean>
在JedisPoolConfig类中有属性:maxIdle ,testOnBorrow 所以这两个值通过spring启动时注入
<property />这种方式是通过属性名称的方式

<bean id="jedis.shardInfo1" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="${redis.host1}" />
<constructor-arg index="1" value="${redis.port1}" />
</bean>
<constructor-arg />这种方式的注入是通过构造函数的方式注入的

总结:
依赖注入的方式: constructor-arg:通过构造函数注入。 property:通过setxx方法注入;

使用constructor-arg标签的index属性,对应于构造函数的多个参数,index属性的值从0开始

使用constructor-arg的type属性,避免构造子冲突(两个参数一样的构造函数,但是参数类型不一样,这里注入时需要加上type属性,避免冲突)

注入集合属性,使用list,map,set和props标签,分别对应List,Map,Set和Properties;

另外注意:通过Spring创建的对象默认是单例的,如果需要创建多实例对象可以在<bean>标签后面添加一个属性:

<bean name="..." class="..." scope="prototype">

spring注入的几种方法,1,2种方法用的偏多一点);
1、set注入
2、构造器注入
3、静态工厂方法注入
4、实例工厂方法注入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: