Spring框架中@PostConstruct注解详解

目录
  • 初始化方式一:@PostConstruct注解
  • 初始化方式二:实现InitializingBean接口
  • 补充:@PostConstruct注释规则
  • 总结

初始化方式一:@PostConstruct注解

假设类UserController有个成员变量UserService被@Autowired修饰,那么UserService的注入是在UserController的构造方法之后执行的。

如果想在UserController对象生成时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入的对象,那么就无法在构造函数中实现(ps:spring启动时初始化异常),例如:

public class UserController {
    @Autowired
    private UserService userService;

    public UserController() {
        // 调用userService的自定义初始化方法,此时userService为null,报错
        userService.userServiceInit();
    }
}

因此,可以使用@PostConstruct注解来完成初始化,@PostConstruct注解的方法将会在UserService注入完成后被自动调用。

public class UserController {
    @Autowired
    private UserService userService;

    public UserController() {
    }

    // 初始化方法
    @PostConstruct
    public void init(){
        userService.userServiceInit();
    }
}

总结:类初始化调用顺序:

(1)构造方法Constructor

(2)@Autowired

(3)@PostConstruct

初始化方式二:实现InitializingBean接口

除了采用注解完成初始化,也可以通过实现InitializingBean完成类的初始化

public class UserController implements InitializingBean {
    @Autowired
    private UserService userService;

    public UserController() {
    }

    // 初始化方法
    @Override
    public void afterPropertiesSet() throws Exception {
        userService.userServiceInit();
    }
}

比较常见的如SqlSessionFactoryBean,它就是通过实现InitializingBean完成初始化的。

@Override
public void afterPropertiesSet() throws Exception {
 // buildSqlSessionFactory()是完成初始化的核心方法,必须在构造方法调用后执行
 this.sqlSessionFactory = buildSqlSessionFactory();
}

补充:@PostConstruct注释规则

  1. 除了拦截器这个特殊情况以外,其他情况都不允许有参数,否则spring框架会报IllegalStateException;而且返回值要是void,但实际也可以有返回值,至少不会报错,只会忽略
  2. 方法随便你用什么权限来修饰,public、protected、private都可以,反正功能是由反射来实现
  3. 方法不可以是static的,但可以是final的

所以,综上所述,在spring项目中,在一个bean的初始化过程中,方法执行先后顺序为

Constructor > @Autowired > @PostConstruct

先执行完构造方法,再注入依赖,最后执行初始化操作,所以这个注解就避免了一些需要在构造方法里使用依赖组件的尴尬。

总结

到此这篇关于Spring框架中@PostConstruct注解详解的文章就介绍到这了,更多相关Spring @PostConstruct注解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决spring懒加载以及@PostConstruct结合的坑

    目录 spring懒加载及@PostConstruct的坑 下面是一个初始化数据的组件 遗留问题 @PostConstruct注入不成功 直接先说原因吧 1.忽略ssm本身对注解是通过扫包才让注解有效的 2.忽略@Service的注解 3.注意扫包区间 4.@PostCoustruct注解用于 spring懒加载及@PostConstruct的坑 举例说明: 下面是一个初始化数据的组件 @Component public class InitData { /** * 初始化加载bean */ @

  • Spring实战之使用@POSTConstruct和@PreDestroy定制生命周期行为操作示例

    本文实例讲述了Spring实战之使用@POSTConstruct和@PreDestroy定制生命周期行为操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLS

  • Spring定时任务中@PostConstruct被多次执行异常的分析与解决

    发现问题 最近在项目中刚刚修改一个功能,代码正准备验证,启动Idea的debug模式,运行项目,发现启动失败,查看日志发现定时任务被重复执行,导致异常.debug定时任务的初始化类,发现启动定时任务是在@PostConstruct方法中执行的,网上查询,有说Spring在某种情况下初始化有bug,注解@Component可能出现多次执行.把@Component修改为@Service就行了! 结果我改了也没解决问题! 无赖更一步跟进日志,发现以下内容: [ERROR][2017-06-20 19:

  • Spring框架中@PostConstruct注解详解

    目录 初始化方式一:@PostConstruct注解 初始化方式二:实现InitializingBean接口 补充:@PostConstruct注释规则 总结 初始化方式一:@PostConstruct注解 假设类UserController有个成员变量UserService被@Autowired修饰,那么UserService的注入是在UserController的构造方法之后执行的. 如果想在UserController对象生成时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入的对

  • Spring Security 在 Spring Boot 中的使用详解【集中式】

    1.1 准备 1.1.1 创建 Spring Boot 项目   创建好一个空的 Spring Boot 项目之后,写一个 controller 验证此时是可以直接访问到该控制器的. 1.1.2 引入 Spring Security   在 Spring Boot 中引入 Spring Security 是相当简单的,可以在用脚手架创建项目的时候勾选,也可以创建完毕后在 pom 文件中加入相关依赖. <dependency> <groupId>org.springframework

  • Spring框架学习之AOP详解

    一.概念 1.面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 2.通俗描述:不通过修改源代码方式,在主干功能里面添加新功能 二.底层原理:动态代理 有两种情况动态代理 2.1 有接口, JDK 动态代理 1.被代理的对象 public class UserDaoImpl implements UserDao { @Override public int add(int a, int b) {

  • Java 自定义Spring框架与核心功能详解

    目录 Spring核心功能结构 核心容器 spring-beans和spring-core模块 spring-context模块 spring-context-support模块 spring-context-indexer模块 spring-expression模块 AOP和设备支持 数据访问与集成 Web组件 通信报文 集成测试 bean概述 在上一讲中,我们对Spring的基本使用进行了一个简单的回顾,接下来,我们就来看一下Spring核心功能结构. Spring核心功能结构 Spring

  • Dubbo在Spring和Spring Boot中的使用详解

    一.在Spring中使用Dubbo 1.Maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3.6</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artif

  • 详解Java的Spring框架中的注解的用法

    1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现: class UserManagerImpl implements UserManager { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } ... } 配置文件: <bean id="userManagerImpl" class="com.

  • 如何在Spring data中使用r2dbc详解

    前言 上篇文章我们讲到了怎么在Spring webFlux中使用r2dbc,今天我们看一下怎么使用spring-data-r2dbc这个Spring data对r2dbc的封装来进行r2dbc操作. 依赖关系 要使用Spring-datea-r2dbc需要配置下面的依赖关系: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp

  • Java 中的注解详解及示例代码

    在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注解通常扮演以下角色 编译器指令 构建时指令 运行时指令 其中 Java内置了三种编译器指令,本文后面部分会重点介绍 Java注解可以应用在构建时,即当你构建你的项目时.构建过程包括生成源码,编译源码,生成xml文件,打包编译的源码和文件到JAR包等.软件的构建通常使用诸如Apache Ant和Mav

  • Java反射机制在Spring IOC中的应用详解

    目录 Java反射机制在Spring IOC的应用 下面是Spring通过配置进行实例化对象 Spring的配置如下所示 实现一下Spring底层处理原理 反射机制.反射机制的作用.反射机制的功能 1.反射机制的作用 2.Java反射机制的功能 3.反射机制相关的重要的类有哪些? Java反射机制在Spring IOC的应用 IOC:即"控制反转",不是什么技术,而是一种思想.使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制. 本篇文章主要讲解一下IOC

  • Spring MVC之@RequestMapping注解详解

    引言: 前段时间项目中用到了REST风格来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据.为了找出原因,便对参数绑定(@RequestParam. @RequestBody. @RequestHeader . @PathVariable)进行了研究,同时也看了一下HttpMessage

随机推荐