[SpringBoot] 通过注解加载自定义的Bean

1.在springboot工程中,默认会扫描启动类所在包路径下面的所有bean,比如启动类下面还有很多的包路径,里面定义了一些类,通过@Componount’注解指定的类会被加载到bean容器,但是如果自己有一个类,达成了jar包不在启动类下面,怎么加载呢?
办法一:可以使用注解的形式,比如:
  @Autowire
  ClassName  classname;

但是如果有多个的话,这样就不好用了,要写好多个;如何用一种更加简单的形式加载bean,这里可以自己写一个简单的注解,在注解里面Import自己需要的类即可,如下:

办法二:在启动类上面加一个自定义的注解:@EnableModifyLogLevel,注解的实现如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({LogChangeListener.class, LogInitBean.class})
public @interface EnableModifyLogLevel  {
}
这里的Import的两个类就是需要加载的bean,这样就可以通过简单的添加一个注解来加载自己自定义的bean了,而且可
以是很多个,可以打到jar包里面通过Maven引入都是ok的;
在Spring Boot中,`@MapperScan` 是 MyBatis 提供的一个注解,用于自动扫描和注册 MyBatis 的 Mapper 接口为 Spring 容器中的 Bean。通过 `@MapperScan` 注解,可以指定需要扫描的 Mapper 接口所在的包路径,并将这些接口以代理类的形式注册为 Spring Bean,从而可以在其他组件中通过依赖注入使用这些 Mapper。 ### 获取通过 `@MapperScan` 加载的所有 Bean 要在 Spring Boot 应用中获取所有通过 `@MapperScan` 加载的 Mapper Bean,可以通过以下几种方式实现: #### 1. 使用 `ApplicationContext` 获取所有 Bean Spring 提供了 `ApplicationContext` 接口,可以通过该接口获取容器中所有的 Bean。由于 `@MapperScan` 注解会将 Mapper 接口注册为 Spring Bean,因此可以通过 `ApplicationContext` 获取这些 Bean。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.Map; @Component public class MapperBeanLoader { @Autowired private ApplicationContext applicationContext; @PostConstruct public void loadMapperBeans() { String[] beanNames = applicationContext.getBeanDefinitionNames(); for (String beanName : beanNames) { Object bean = applicationContext.getBean(beanName); if (bean.getClass().getName().contains("MyBatis")) { System.out.println("Mapper Bean Name: " + beanName + ", Bean Class: " + bean.getClass()); } } } } ``` 在上述代码中,`@PostConstruct` 注解确保在 Bean 初始化之后执行 `loadMapperBeans()` 方法。该方法通过 `getBeanDefinitionNames()` 获取所有 Bean 的名称,然后通过 `getBean()` 方法获取对应的 Bean 实例,并判断其是否为 MyBatis Mapper Bean。 #### 2. 获取特定包路径下的所有 Mapper Bean 如果知道 `@MapperScan` 扫描的具体包路径,可以通过 `getBeansOfType()` 方法获取特定类型的 Bean。例如,假设所有的 Mapper 接口都继承自一个公共的接口(如 `BaseMapper`),可以通过以下方式获取所有实现了该接口的 Mapper Bean: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.Map; @Component public class MapperBeanLoader { @Autowired private ApplicationContext applicationContext; @PostConstruct public void loadMapperBeans() { Map<String, BaseMapper> beans = applicationContext.getBeansOfType(BaseMapper.class); for (Map.Entry<String, BaseMapper> entry : beans.entrySet()) { System.out.println("Mapper Bean Name: " + entry.getKey() + ", Bean Class: " + entry.getValue().getClass()); } } } ``` 在上述代码中,`BaseMapper` 是一个自定义的接口,所有的 Mapper 接口都继承自该接口。通过 `getBeansOfType()` 方法可以获取所有实现了 `BaseMapper` 接口的 Bean,并遍历输出这些 Bean 的名称和类信息。 #### 3. 使用 `@MapperScan` 注解的 `basePackages` 属性 在配置类中使用 `@MapperScan` 注解时,可以通过 `basePackages` 属性指定需要扫描的包路径。例如: ```java import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Configuration; @Configuration @MapperScan(basePackages = "com.example.mapper") public class MyBatisConfig { } ``` 在上述配置中,`@MapperScan` 会扫描 `com.example.mapper` 包下的所有 Mapper 接口,并将其注册为 Spring Bean。通过这种方式,可以明确知道哪些包路径下的接口会被注册为 Bean,并结合前面提到的方法获取这些 Bean。 #### 4. 使用 `BeanFactoryPostProcessor` 获取所有 Bean 定义 如果需要在应用启动时获取所有 Bean 的定义信息,可以实现 `BeanFactoryPostProcessor` 接口,并在 `postProcessBeanFactory()` 方法中获取所有 Bean 的定义: ```java import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.stereotype.Component; @Component public class MapperBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { String[] beanNames = beanFactory.getBeanDefinitionNames(); for (String beanName : beanNames) { if (beanFactory.getBeanDefinition(beanName).getBeanClassName() != null && beanFactory.getBeanDefinition(beanName).getBeanClassName().contains("Mapper")) { System.out.println("Mapper Bean Name: " + beanName); } } } } ``` 在上述代码中,`BeanFactoryPostProcessor` 在应用启动时会遍历所有 Bean 的定义,并判断其是否为 Mapper Bean(通过类名是否包含 "Mapper" 判断)。 ### 总结 通过 `@MapperScan` 注解加载的 Mapper Bean 可以通过 `ApplicationContext`、`getBeansOfType()` 方法或 `BeanFactoryPostProcessor` 等方式获取。这些方法可以帮助开发者在 Spring Boot 应用中动态地获取和管理所有通过 `@MapperScan` 加载的 Mapper Bean,从而更好地进行依赖管理和调试。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值