先说业务场景,我在系统启动后想要维护一个List常驻内存,因为我可能经常需要查询它,但它很少更新,而且数据量不大,明显符合缓存的特质,但我又不像引入第三方缓存。现在的问题是,该List的内容是从数据库中查到的,那么如何实现在spring bean加载后(数据源这时已加载),才去初始化这个List呢?用@PostConstruct这个注解就好了,这是一个很有意思的注解,它是javax包里的注解,但spring却支持了它,其他这个注解的功能就类似于

@Bean(initMethod="init")

  接下来看例子:

import com.crocodile.springboot.model.Merchant;
import com.crocodile.springboot.repository.MerchantRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List; @Component
public class MerchantList {
@Autowired
private MerchantRepository merchantRepository; private MerchantList() {
} static class SingletonHolder {
static MerchantList instance = new MerchantList();
} public static MerchantList getInstance() {
return SingletonHolder.instance;
} private static List<Merchant> merchants = new ArrayList<>(); @PostConstruct
private void init() {
merchants = (List<Merchant>) merchantRepository.findAll();
} public void addMerchant(Merchant merchant) {
merchants.add(merchant);
} public void deleteMerchant(Merchant merchant) {
merchants.remove(merchant);
} public List<Merchant> getMerchants() {
return merchants;
}
}

  我们既然使用了spring的初始化处理,那么就得让它发现不是?所以@Component是少不了的。Spring的Bean生命周期简单来说即:创建Bean->Bean的属性注入->Bean初始化->Bean销毁。我们结合上面的Bean来说,MerchantList这个bean先是被Spring容器创建,当然这里也会去创建MerchantRepository这个bean,容器统一管理所有的bean。接着MerchantRepository这个bean被注入到MerchantList这个bean,接着spring发现MerchantList有个初始化注解@PostConstruct就去执行了init方法。

  @PostConstruct在Spring的CommonAnnotationBeanPostProcessor类中接受处理:

    public CommonAnnotationBeanPostProcessor() {
this.setOrder(2147483644);
this.setInitAnnotationType(PostConstruct.class);
this.setDestroyAnnotationType(PreDestroy.class);
this.ignoreResourceType("javax.xml.ws.WebServiceContext");
}

最新文章

  1. JAVA NIO Scatter/Gather(矢量IO)
  2. iostat 命令
  3. 为什么你不应该用angularjs?
  4. PHP 线程安全与非线程安全版本的区别深入解析
  5. 不会用ant打包、部署项目的工程师,不是一个好程序员(测试)
  6. Jquery 扩展获取RUL参数
  7. Ubuntu 重新设置网络
  8. Dev的DocumentManager添加窗体
  9. 黑白棋游戏 (codevs 2743)题解
  10. JSP页面的构成
  11. 第二百二十五 how can I 坚持
  12. 3905 - Meteor
  13. POJ1961 KMP算法
  14. MVC 怎么把string字符串转译成html格式
  15. cas 代理认证配置
  16. CSS &lt;input type=&quot;file&quot;&gt;样式设置
  17. 使用querybuilder做忽略大小写查询的例子
  18. sqlmap的安装
  19. Java异常学习总结二
  20. Java零拷贝

热门文章

  1. 删除svn用户
  2. MySQL的索引优化,查询优化
  3. kombu在redis中的键值名
  4. 服务如何配置JVM
  5. Longest Continuous Increasing Subsequence
  6. java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Workbook] with root cause
  7. jquery动画函数里面可以跟一个回调函数,表示动画结束后执行的代码
  8. HTML 002 基础
  9. MongoDB 查看存储引擎
  10. javaweb+上传大文件