spring容器启动实现初始化某个方法(init)

spring容器启动 初始化某方法(init)

1、前言

很多时候,我们需要在项目启动的时候,就要完成某些方法的执行。今天整理了一个简单的方法,使用spring容器中bean的属性:init-method

2、代码

/*
    初始化的类。这里不需要添加任何注解
*/
public class InitData {
    @Autowired
    private UserService userService;
    /*
        初始化方法
    */
    public void inits(){
        System.out.println("初始化方法执行.....");
        List<User> userList = userService.queryAllUser();
        System.out.println(userList.toString());
    }
}

3、配置

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"
    default-lazy-init="true"><!-- 默认懒加载(延迟加载):调用的时候才实例化   -->
    <!-- 启动注解扫描包,获取bean -->
    <context:component-scan base-package="ws.spring.mybatis.service" />
    <!-- 引入数据源 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!-- 注入数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
    <!-- 容器启动后执行:需要执行初始化方法,所以必须直接实例化,取消懒加载-->
    <bean id="initData" class="ws.spring.mybatis.init.InitData" init-method="inits"  lazy-init="false" />
</beans>

5、结果

6、注意事项

  • 当初始化方法中有依赖注入的时候,需要将加载注入的bean放在初始化bean之前。最好直接放在子容器中。因为父容器先于子容器初始化。否则依赖注入报错。
  • 取消初始化bean的懒加载,否则初始化方法无法执行。
  • lazy-init 设置只对scop属性为singleton的bean起作用

spring容器启动初始化的几种方法

方法一

实现InitializingBean接口

InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。

xml中添加bean

不在xml中添加可以在Initializing类头部添加注解@Service

<bean id="initializingBean" class="cn.base.core.init.Initializing" init-method="init"></bean>

Initializing.java

public class Initializing implements InitializingBean{
 private static final Logger logger = LoggerFactory.getLogger(Initializing.class);
 // 方法一
 @Override
 public void afterPropertiesSet() throws Exception {
  logger.info(">>>>>>>> init start...");
 }

 public void init() {
  logger.info(">>>>>>>> 初始化...");
 }
}

启动项目日志如下:

Invoking afterPropertiesSet() on bean with name 'initializingBean'
>>>>>>>> init start...
Invoking init method 'init' on bean with name 'initializingBean'
>>>>>>>> 初始化...

方法二

使用@PostConstruct注解

@PostConstruct
public void initConstruct() {
 System.out.println("注解初始化...");
}

注意:此方法所在的类需要被扫描到,多种注解可以用,推荐使用@Service

执行顺序:方法二比方法一优先执行。

方法三

web.xml配置

<filter>
     <filter-name>filterServlet</filter-name>
     <filter-class>cn.base.web.interceptor.FilterServlet</filter-class>
</filter>
<filter-mapping>
    <filter-name>filterServlet</filter-name>
   <url-pattern>/*</url-pattern>
   <dispatcher>REQUEST</dispatcher>
</filter-mapping>

FilterServlet.java

public class FilterServlet implements Filter {
 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
  System.out.println("FilterServlet 初始化");
 }

 @Override
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain
chain)
   throws IOException, ServletException {
  chain.doFilter(request, response);
 }

 @Override
 public void destroy() {
 }
}

执行顺序:优先级比上面两个低。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解SpringBoot程序启动时执行初始化代码

    因项目集成了Redis缓存部分数据,需要在程序启动时将数据加载到Redis中,即初始化数据到Redis. 在SpringBoot项目下,即在容器初始化完毕后执行我们自己的初始化代码. 第一步:创建实现ApplicationListener接口的类 package com.stone; import com.stone.service.IPermissionService; import org.springframework.context.ApplicationListener; import

  • spring boot容器启动流程

    一.前言 spring cloud大行其道的当下,如果不了解基本原理那么是很纠结的(看见的都是 约定大于配置 ,但是原理呢?为什么要这么做?).spring cloud是基于spring boot快速搭建的,今天咱们就看看spring boot容器启动流程.(本文不讲解如何快速启动spring boot,那些直接官方看即可, 官网文档飞机票 ) 二.容器启动 spring boot一般是 指定容器启动main方法,然后以命令行方式启动Jar包 ,如下图: @SpringBootApplicati

  • spring启动加载程序的几种方法介绍

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过注解@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class DataInitializer{ @PostConstruct public void initMethod() throw

  • 详解Spring Boot中初始化资源的几种方式

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回答这个问题. CommandLineRunner 定义初始化类 MyCommandLineRunner 实现 CommandLineRunner 接口,并实现它的 run() 方法,在该方法中编写初始化逻辑 注册成Bean,添加 @Component注解即可 示例代码如下: @Component p

  • spring容器启动实现初始化某个方法(init)

    spring容器启动 初始化某方法(init) 1.前言 很多时候,我们需要在项目启动的时候,就要完成某些方法的执行.今天整理了一个简单的方法,使用spring容器中bean的属性:init-method 2.代码 /* 初始化的类.这里不需要添加任何注解 */ public class InitData { @Autowired private UserService userService; /* 初始化方法 */ public void inits(){ System.out.printl

  • Docker容器启动时初始化Mysql数据库的方法

    1. 前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案. 第一种方案是在容器启动后手动导入,太low了不行.第二种在Spring Boot客户端连接Mysql容器时初始化数据库,你可以参考使用flyway进行数据库版本控制一文,但是这依赖客户端的能力.能不能做到Mysql容器启动时就自己初始化数据库呢?当然可以!今天就来演示一下.全部代码见文末. 2.

  • SpringBoot 如何添加容器启动的初始化逻辑的操作方法

    背景 传统 SpringMVC 项目中,我们可以定义容器初始化 Servlet ,然后在 web.xml 配置该 Servlet ,指定 load-on-startup 就可以在容器启动后,执行一些系统的初始化逻辑.比如设置全局资源文件路径.加载系统定时任务.数据初始化等. 技术转换到 SpringBoot 的时候,该在哪里添加应用初始化的代码呢? 如果初始化逻辑中,有一些普通类,需要通过 Spring 的 ApplicationContext 的 getBean 获取依赖属性,如何保证 Spr

  • Spring源码分析容器启动流程

    目录 前言 源码解析 1.初始化流程 流程分析 核心代码剖析 2.刷新流程 流程分析 核心代码剖析 前言 本文基于 Spring 的 5.1.6.RELEASE 版本 Spring的启动流程可以归纳为三个步骤: 1.初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中 2.将配置类的BeanDefinition注册到容器中 3.调用refresh()方法刷新容器 Spring Framework 是 Java 语言中影响最为深远的框架之一,其

  • springboot 项目容器启动后如何自动执行指定方法

    目录 springboot 项目容器启动后自动执行指定 springboot 容器及启动过程 问题1:为什么要启动父子两个容器? 问题2:在什么时候启动父容器? 问题3:父容器和子容器的区别? 问题4:怎么保证父容器启动过程中 问题5:容器实际通过什么来管理bean springboot 项目容器启动后自动执行指定 我们需要写一个class去让它实现ApplicationRunner,然后重写它的run方法就行了,注意类加上@Component注解 注意:这个class需要写在和Applicat

  • 浅谈spring容器中bean的初始化

    当我们在spring容器中添加一个bean时,如果没有指明它的scope属性,则默认是singleton,也就是单例的. 例如先声明一个bean: public class People { private String name; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String get

  • Spring容器中添加bean的5种方式

    目录 @Configuration + @Bean @Componet + @ComponentScan @Import注解导入 @Import直接导入类 @Import + ImportSelector @Import + ImportBeanDefinitionRegistrar @Import + DeferredImportSelector 使用FactoryBean接口 使用 BeanDefinitionRegistryPostProcessor 小结 我们知道平时在开发中使用Spri

  • Spring 容器初始化 register 与 refresh方法

    目录 register方法 refresh 方法 1.prepareRefresh 2.obtainFreshBeanFactory 3.prepareBeanFactory 4.postProcessBeanFactory 5.invokeBeanFactoryPostProcessors 6.registerBeanPostProcessors 7.非重点部分 前篇回顾: Spring源码解析容器初始化构造方法 在上一篇文章中,我们介绍完了AnnotationConfigApplicatio

  • Spring Boot解决项目启动时初始化资源的方法

    前言 在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资源操作. 这个神器就是 CommandLineRunner, CommandLineRunner 接口的 Component 会在所有 SpringBeans都初始化之后, SpringApplication.run()之前执行,非常适合在应用程序启动之初进行一些数据初始化的工作. 接下来我们

  • Spring SpringMVC在启动完成后执行方法源码解析

    关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) 应用场景:很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我们这个类引用了其他类(可能是更复杂的关联),所以当我们去使用这个类做事情时发现包空指针错误,这是因为我们这个类有可能已经初始化完成,但是引用的其他类不一定初始化完成,所以发生了空指针错误,解决方案如下: 1.写一个类继承spring的ApplicationListener监听,并监控ContextRefresh

随机推荐