1、Springboot应用获取ApplicationContext
在部分Springboot应用中,经常需要定时任务中执行Spring容器中的Bean。由于定时任务启动不是SpringMVC Controler层触发,因此不能采用@Autoward自动注入容器中的Bean。这时,我们可用编写一个BeanUtils类,可以在任意环境获取Spring容器中的Bean。
1.1、定义Springboot应用启动后执行类
package com.example.demo.common.config;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
@Component //添加注解,以便Spring启动时扫描本类,并且需要实现ApplicationContextInitializer接口
public class CustomApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static ConfigurableApplicationContext context = null;//定义静态类型变量
/**
* spring启动后执行本函数,获取context并给static类型变量赋值
*/
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
context = applicationContext;
}
/**
* 根据class获取是容器中的实现类,class参数可以时接口的class
* @param <T>
* @param clzz
* @return 容器中的实现类实例
*/
public static <T> T getBean(Class<T> clzz) {
return context.getBean(clzz);
}
}
1.2、修改Springboot启动类
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.example.demo.common.config.CustomApplicationContextInitializer;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//SpringApplication.run(DemoApplication.class, args);
SpringApplication application = new SpringApplication(DemoApplication.class);
application.addInitializers(new CustomApplicationContextInitializer()); //添加容器启动初始化类
application.run(args);
}
}
即可在任意类中即可通过CustomApplicationContextInitializer.getBean(IHelloService.class)方法获取容器中的IHelloService接口的实现类实例。还可以添加根据id获取容器中的实现类的方法。
2、Springboot整合mybatis
2.1、添加durid及mybatis依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
2.2、配置数据源及mybatis mapper等相关信息
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
#url: jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai
username: testuser
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations:
- classpath:mappers/**/*.xml #mapper文件存储目录,**表示任意多级目录
2.3、编写数据库访问层接口及mapper文件
package com.example.demo.hello.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import com.example.demo.hello.vos.FirstTable;
@Mapper //自动在Spring容器中生成本接口实现类,并可以通过@Autoward注入到Service层代码中
@Repository
public interface IHelloDao {
public List<FirstTable> queryData();
public int insertData();
}
mapper文件,注意namespace的值和接口类全限定名一致
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.hello.dao.IHelloDao">
<resultMap id="queryMap" type="com.example.demo.hello.vos.FirstTable">
<id column="id_col" jdbcType="VARCHAR" property="idCol"/>
<result column="name_col" jdbcType="VARCHAR" property="nameCol"/>
<result column="age_col" jdbcType="INTEGER" property="ageCol"/>
</resultMap>
<select id="queryData" resultMap="queryMap">
SELECT id_col, name_col, age_col
FROM first_table
</select>
<insert id="insertData">
INSERT INTO first_table (id_col, name_col, age_col)
VALUES('0000000000000002', '新增数据', 20);
</insert>
</mapper>
之后即可在Service实现类中注入接口(不必编写IHelloDao的接口实现类),调用相关方法完成数据库访问操作。