Spring-Bean的构造函数和Setter执行顺序以及InitializingBean
来源:互联网 发布:天龙八部抢号软件 编辑:程序博客网 时间:2024/06/07 12:39
经过试验得知,Spring注入Bean,实例化一个Bean的时候,顺序如下:
1. 这个class的构造函数被执行;
2.Setter被执行;
3.如果这个class实现了InitializingBean(即implements InitializingBean)则,接下来执行public void afterPropertiesSet() throws Exception() 中的内容。
实例,
当我不用InitializingBean 方法,而是直接在构造器中知己执行jedis = jedisPool.getResource(); 则因为此时程序只是执行到上面的第1步,这时候jedisPool==null,那这里肯定会报错。会导致RedisClient实例化失败,并且抛出NullPointerException
下面贴上错误的代码。注意这里对RedisClient进行了Spring的Setter注入。
package com.foundjet.flylib.redis;import java.util.ArrayList;import java.util.List;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;import redis.clients.jedis.ShardedJedis;import redis.clients.jedis.ShardedJedisPool;import redis.clients.jedis.JedisShardInfo;public class RedisClient {private Jedis jedis;//非切片额客户端连接 private JedisPool jedisPool;//非切片连接池 private ShardedJedis shardedJedis;//切片额客户端连接 private ShardedJedisPool shardedJedisPool;//切片连接池 private String password = "tea@fjdev"; public RedisClient() { initialPool(); // initialShardedPool(); jedis = jedisPool.getResource(); jedis.auth(password); jedis.select(10);// shardedJedis = shardedJedisPool.getResource(); } /** * 初始化非切片池 */ private void initialPool() { // 池基本配置 JedisPoolConfig config = new JedisPoolConfig(); // config.setMaxActive(20); config.setMaxTotal(20); config.setMaxIdle(5); config.setMaxWaitMillis(1000L); config.setTestOnBorrow(false); jedisPool = new JedisPool(config, "127.0.0.1", 6379); } /** * 初始化切片池 */ private void initialShardedPool() { // 池基本配置 JedisPoolConfig config = new JedisPoolConfig(); // config.setMaxActive(20); config.setMaxTotal(20); config.setMaxIdle(5); config.setMaxWaitMillis(1000l); config.setTestOnBorrow(false); // slave链接 List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(); shards.add(new JedisShardInfo("127.0.0.1", 6379, "master")); // 构造池 shardedJedisPool = new ShardedJedisPool(config, shards); } public void show() { keyOperate(); // StringOperate(); // ListOperate(); // SetOperate(); // SortedSetOperate(); // HashOperate(); jedis.close();// shardedJedis.close(); } private void keyOperate() { String k = "key3"; jedis.set(k, "ccc"); System.out.println("value of " + k + " is: " + jedis.get(k)); } public static void main(String[] args) {RedisClient client = new RedisClient();client.show();}}
修正后的代码见https://github.com/flylib/rediskit
RedisClient.java
片段如下
package net.flylib.rediskit;import org.springframework.beans.factory.InitializingBean;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.Protocol;public class RedisClient implements InitializingBean {private Jedis jedis;// 非切片额客户端连接private JedisPool jedisPool;// 非切片连接池public RedisClient() {//jedis = jedisPool.getResource();}@Override public void afterPropertiesSet() throws Exception {jedis = jedisPool.getResource();}public JedisPool getJedisPool() {return jedisPool;}public void setJedisPool(JedisPool jedisPool) {this.jedisPool = jedisPool;}public String set(final String key, String value) {jedis.get("");return jedis.set(key, value);}public String get(final String key) {return jedis.get(key);}}
0 0
- Spring-Bean的构造函数和Setter执行顺序以及InitializingBean
- spring bean中构造函数,afterPropertiesSet和init-method的执行顺序
- BeanFactoryAware在InitializingBean之后执行,奇怪的Spring初始化顺序?
- Spring 中Bean的生命周期与InitializingBean和DisposableBean
- Spring 中Bean的生命周期与InitializingBean和DisposableBean
- Spring中Bean的生命周期与InitializingBean和DisposableBean
- Spring 中Bean的生命周期与InitializingBean和DisposableBean
- Spring 中Bean的生命周期与InitializingBean和DisposableBean
- spring InitializingBean init-method postConstruct 执行顺序
- spring InitializingBean init-method postConstruct 执行顺序
- spring InitializingBean init-method postConstruct 执行顺序
- Spring @Autowired和构造函数的顺序
- C#中基类和派生类的构造函数以及变量的执行顺序整理
- C#中基类和派生类的构造函数以及变量的执行顺序整理
- Spring Bean InitializingBean和DisposableBean实例
- Spring Bean InitializingBean和DisposableBean实例区别
- 构造函数的执行顺序
- 构造函数的执行顺序
- 各类常用排序算法的总结
- 用Java连接数据库MySQL
- kruscal算法实现
- 17年2月26日Java后台学习记录,Mysql 多个timestamp,xml中使用小于号,Mybatisdao接口多个参数函数错误
- patch matching 图像块匹配算法
- Spring-Bean的构造函数和Setter执行顺序以及InitializingBean
- odd even linked list
- 用GSON 五招之内搞定任何JSON数组
- 浅谈CPU,内存,指令之间关系
- Android笔记之(BroadcastReceiver)广播接收短信
- Ansible之 Inventory 资源清单介绍
- IIS7.5 真正解决PUT、DELETE请求问题
- Study Jams_RelativeLayout
- 安卓项目搭建总结