1哲戚、Springboot應用獲取ApplicationContext
在部分Springboot應用中,經常需要定時任務中執(zhí)行Spring容器中的Bean厌丑。由于定時任務啟動不是SpringMVC Controler層觸發(fā)兰迫,因此不能采用@Autoward自動注入容器中的Bean淀零。這時漾唉,我們可用編寫一個BeanUtils類荧库,可以在任意環(huán)境獲取Spring容器中的Bean。
1.1赵刑、定義Springboot應用啟動后執(zhí)行類
package com.example.demo.common.config;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
@Component //添加注解分衫,以便Spring啟動時掃描本類,并且需要實現(xiàn)ApplicationContextInitializer接口
public class CustomApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static ConfigurableApplicationContext context = null;//定義靜態(tài)類型變量
/**
* spring啟動后執(zhí)行本函數(shù)般此,獲取context并給static類型變量賦值
*/
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
context = applicationContext;
}
/**
* 根據(jù)class獲取是容器中的實現(xiàn)類丐箩,class參數(shù)可以時接口的class
* @param <T>
* @param clzz
* @return 容器中的實現(xiàn)類實例
*/
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接口的實現(xiàn)類實例恤煞。還可以添加根據(jù)id獲取容器中的實現(xiàn)類的方法。
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、配置數(shù)據(jù)源及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喜喂、編寫數(shù)據(jù)庫訪問層接口及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容器中生成本接口實現(xiàn)類,并可以通過@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', '新增數(shù)據(jù)', 20);
</insert>
</mapper>
之后即可在Service實現(xiàn)類中注入接口(不必編寫IHelloDao的接口實現(xiàn)類)玉吁,調用相關方法完成數(shù)據(jù)庫訪問操作。