常见工厂后处理器作用
Spring有两个常见的工厂后处理器,用于包扫描以及整合其它框架。这两个后处理器分别是
ConfigurationClassPostProcessor和MapperScannerConfigurer。
1.准备依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo2</artifactId><version>0.0.1-SNAPSHOT</version><name>demo2</name><description>demo2</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- Spring 核心依赖(包含 getResources 和 PathMatchingResourcePatternResolver) --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.23</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.23</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.3.23</version></dependency><!-- MyBatis 相关依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency><!-- Spring JDBC --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.23</version></dependency><!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.18</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
2.类准备
1)Config配置类
package com.example.demo2.b03;import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 21:46*/
@Configuration
@ComponentScan("com.example.demo2.b03.component")
public class Config {@Beanpublic Bean1 bean1(){return new Bean1();}@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean;}@Bean(initMethod = "init")public DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl("jdbc:mysql://localhost:3306/test");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;}
}
2)Bean2
Bean2在com.example.demo2.b03.component包下,通过扫描注入到Spring容器。
package com.example.demo2.b03.component;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 21:58*/
@Component
public class Bean2 {private static final Logger log = LoggerFactory.getLogger(Bean2.class);public Bean2(){log.info("我被spring管理了");}
}
3)Bean1
package com.example.demo2.b03;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 21:44*/
public class Bean1 {
}
3.主类调用
配置类中的类并未注入到Spring容器中,给配置类添加下面两个工厂后处理器。结果如下。
1)ConfigurationClassPostProcessor后处理器
该类继承图如下:
context.registerBean(ConfigurationClassPostProcessor.class);
结果输出:
2)MapperScannerConfigurer后处理器
该后处理器是用来扫描mapper接口,用来整合spring与mybatis。首先提供mapper接口
package com.example.demo2.b03.mapper;import org.apache.ibatis.annotations.Mapper;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 22:51*/
@Mapper
public interface Mapper1 {
}
package com.example.demo2.b03.mapper;import org.apache.ibatis.annotations.Mapper;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 22:51*/
@Mapper
public interface Mapper2 {
}
注入后处理器,并同时设置包扫描的位置。
context.registerBean(MapperScannerConfigurer.class,beanDefinition -> {beanDefinition.getPropertyValues().add("basePackage","com.example.demo2.b03.mapper");});
结果输出:
相比之前,多了两个mapper接口,并且间接加入了常见的Bean后处理器。