Spring -> 四种xml配置注入方式

spring通过xml进行IOC配置的方式

1. setter注入

public class Order {
    /*要注入的对象*/
    private NotifyService notifyservice;   
    /*notifyservice不是在内部new()出来的,
    而是通过指定方法传进来的,也就是我们说的注入。这里是setter方法注入*/
    public void setNotifyservice(NotifyService notifyservice) {
        this.notifyservice = notifyservice;
    }
    /*订单支付完成后,系统通知老板*/
    public void PaySuccess(){
        notifyservice.sendMessage("客户张铁蛋完成订单2017079657付款,共人民币:97.5元");
    }
}

spring的xml文件

<bean id="notify" class="com.zl.spring.NotifyServiceByCellPhoneImpl" />
<bean id="order" class="com.zl.spring.Order" >
    <!-- 配置要注入的对象 -->
    <property name="notifyservice" ref="notify"/>
</bean>

<bean>中的id属性是bean的标识,必须唯一。class属性是类的完全限定名,指明由哪个类来实例化。
<property>是用来指明要注入的属性和对象的。因为我们要注入Order中的私有成员notifyService,所以要在标签中创建一个<property>标签指定notifyService对象。标签中的name就是就是注入方法名去掉前面的set,剩下的这一截首字母大小写可不限。ref指向要注入的对象(id)。对象是引用实例,所以要用ref,如果是传值,则用value。

另外要注意的是:property name只和注入方法名相关,和内部属性名没有半毛关系。

2. 构造器注入

构造函数也是一个注入点。现在我们把上例的setter注入改为构造注入。
首先删除setNotifyservice方法,改成构造函数:

/*构造函数注入*/
public Order(NotifyService notifyservice1) {
    this.notifyservice1 = notifyservice1;
}

相应的xxx.xml修改:
<property name="notifyservice" ref="notify"/>
改为<constructor-arg ref="notify"></constructor-arg>
这样就完成了构造器注入

构造函数有多个参数的时候

    public Order(String username, String orderno, NotifyService notifyservice1) {
        this.username = username;
        this.orderno = orderno;
        this.notifyservice1 = notifyservice1;
    }

xml配置

1、智能识别
<!-- Spring会按参数类型排序,同类型的按先后顺序向构造函数赋值 -->
<!-- 即使按下面这种方式填写也可以,只要2个String类型的参数顺序对了就行 -->
<bean id="order" class="com.zl.spring.Order" >
    <constructor-arg value="张老三"></constructor-arg>
    <constructor-arg ref="notify"></constructor-arg>
    <constructor-arg value="1234567"></constructor-arg>
</bean>

2、指明参数类型
<!-- 和1智能识别一样,Spring会先按类型区分,同类型的按先后顺序向构造函数参数赋值 -->
<bean id="order" class="com.zl.spring.Order" >
    <constructor-arg type="String" value="张老三"></constructor-arg>
    <!-- ref指定注入对象的id  value赋值 -->
    <constructor-arg type="com.zl.spring.NotifyService" ref="notify"></constructor-arg>
    <constructor-arg type="String" value="1234567"></constructor-arg>
</bean>

3、指定参数名
<!-- Spring会完全按照构造函数的形参名字匹配 -->
<bean id="order" class="com.zl.spring.Order" >
    <constructor-arg name="username" value="张老三"></constructor-arg>
    <constructor-arg name="notifyservice1" ref="notify"></constructor-arg>
    <constructor-arg name="orderno" value="1234567"></constructor-arg>
</bean>

4、指定索引index
<!-- 指定的索引顺序一定要和类型匹配,不然会报错  index基0-->
<bean id="order" class="com.zl.spring.Order" >
    <constructor-arg index="0" value="张老三"></constructor-arg>
    <constructor-arg index="2" ref="notify"></constructor-arg>
    <constructor-arg index="1" value="2017877997"></constructor-arg>
</bean>

何时使用构造注入,何时使用setter注入,经验法则是:强制依赖用构造,可选依赖用Setter。注意,在settter方法上使用@Required注解即可令属性强制依赖。
Spring 团队建议,构造注入的实例是不可变的,不为null的。此外,构造注入组件要将完全初始化后的实例返回给客户端代码。还有,大量参数的构造函数是非常烂的,它意味着该类有大量的职责,得重构。
setter注入主要用于可选依赖,类内部可以指定默认依赖。否则类内所有使用依赖的地方,都得进行非空校验。setter注入的有个好处就是,类可以重配置或者再注入。因此,使用JMXMBeans进行管理的场景中,就非常适合setter注入。
使用何种依赖注入方式,对于某些类,非常有意义。有时协同第三方类处理,没有源码,由你来决定使用何种方式。比如,第三方类未暴露任何setter方法,那么构造注入也许就是唯一的可行的注入方式了。

3. 静态工厂的方法注入

静态工厂,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过”工程类.静态方法()”来获取对象,而是依然通过spring注入的形式获取。
在上例的基础上,增加一个工厂类:

NotifyFactory.java:

public class NotifyFactory {
    /*静态工厂方法*/
    public static NotifyService getNotifyService(){
        return new NotifyServiceByWeixinImpl();
    }
}

xml

<bean id="order" class="com.zl.spring.Order">
    <constructor-arg name="username" value="张老三"></constructor-arg>
    <constructor-arg name="notifyservice1" ref="notify2"></constructor-arg>
    <constructor-arg name="orderno" value="1234567"></constructor-arg>
</bean>
<!-- class指向生成静态工厂bean -> factory-method生成对象的bean -->
<bean id="notify2" class="com.zl.spring.NotifyFactory" factory-method="getNotifyService" />

注意看指向的class并不是NotifyService的实现类,而是指向静态工厂NotifyFactory,并且配置factory-method="getNotifyService"指定调用哪个工厂方法:

静态工厂方法需要传递参数,同bean的构造函数一样,应该通过constructor-arg元素产生

4. 实例工厂的方法注入

实例工厂的意思是获取对象实例的方法不是静态的,所以需要首先new工厂类,再调用普通的实例方法:

public class NotifyFactory {
    /*普通工厂方法*/
    public NotifyService getNotifyService(){
        return new NotifyServiceByWeixinImpl();
    }
}

实例工厂方法(非静态)和静态工厂方法本质相同(除了使用facory-bean属性替代class属性,其他都相同)

<!-- 生成工厂bean -->
<bean id="notifyfactory" class="com.zl.spring.NotifyFactory" />
<!-- factory-bean指向工厂bean调用factory-method来生成对象bean -->
<bean id="notify2" factory-bean="notifyfactory" factory-method="getNotifyService" />

Spring IOC注入方式用得最多的是1、2两种。

现在常用的注解注入不属于xml配置注入方式

附录:

1、给属性设置空格字符串("")
//相当于exampleBean.setEmail("")
<bean class="ExampleBean">
    <property name="email" value=""/>
</bean>

2、给属性设置null值
//相当于exampleBean.setEmail(null)
<bean class="ExampleBean">
    <property name="email">
        <null/>
    </property>
</bean>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在 Spring MVC 中配置 Redis 的步骤: 1. 引入 Redis 相关依赖 ```xml <!-- Redis 相关依赖 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>${spring.data.redis.version}</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency> ``` 其中,`${spring.data.redis.version}` 和 `${jedis.version}` 分别是 Spring Data Redis 和 Jedis 的版本号。 2. 配置 Redis 连接池 在 `spring-mvc.xml` 文件中添加以下配置: ```xml <!-- Redis 连接池配置 --> <bean id="redisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="200"/> <property name="maxIdle" value="50"/> <property name="minIdle" value="10"/> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="true"/> <property name="testWhileIdle" value="true"/> <property name="timeBetweenEvictionRunsMillis" value="30000"/> <property name="numTestsPerEvictionRun" value="10"/> <property name="minEvictableIdleTimeMillis" value="60000"/> <property name="softMinEvictableIdleTimeMillis" value="10000"/> </bean> ``` 上述配置中,`redisPoolConfig` 是一个连接池配置的 bean,其中包含了一些连接池的属性配置。 3. 配置 Redis 连接工厂 在 `spring-mvc.xml` 文件中添加以下配置: ```xml <!-- Redis 连接工厂配置 --> <bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="poolConfig" ref="redisPoolConfig"/> <property name="hostName" value="${spring.redis.host}"/> <property name="port" value="${spring.redis.port}"/> <property name="database" value="${spring.redis.database}"/> <property name="password" value="${spring.redis.password}"/> <property name="timeout" value="${spring.redis.timeout}"/> <property name="usePool" value="true"/> </bean> ``` 上述配置中,`redisConnectionFactory` 是一个连接工厂的 bean,其中包含了 Redis 连接的相关配置。 4. 配置 Redis 模板 在 `spring-mvc.xml` 文件中添加以下配置: ```xml <!-- Redis 模板配置 --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="redisConnectionFactory"/> <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> </bean> ``` 上述配置中,`redisTemplate` 是一个 Redis 模板的 bean,其中配置了 Redis 的序列化方式。 5. 配置 Redis 缓存管理器 在 `spring-mvc.xml` 文件中添加以下配置: ```xml <!-- Redis 缓存管理器配置 --> <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"> <constructor-arg name="redisTemplate" ref="redisTemplate"/> <property name="cacheNames"> <list> <value>cacheName1</value> <value>cacheName2</value> </list> </property> <property name="defaultExpiration" value="3600"/> </bean> ``` 上述配置中,`redisCacheManager` 是一个 Redis 缓存管理器的 bean,其中配置了缓存的名称和过期时间。 至此,Redis 的配置就完成了。在需要使用 Redis 的地方,可以直接注入 `redisTemplate` 或 `redisCacheManager` 来实现操作 Redis 缓存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值