@ImportResouce 和 @Import 在springboot中的使用
@Import注解可以导入类(bean会被spring容器托管),也可以导入配置类(配置类中的所有bean会被spring容器托管)
@ImportResouce注解加载XML配置文件
1、@ImportResouce有两种常用的引入方式:classpath和file,具体查看如下的例子:
classpath路径:locations={"classpath:application-bean1.xml","classpath:application-bean.xml"}
file路径:locations= {"file:d:/test/application-bean1.xml"};
如下:
@Configuration
@ImportResource({"classpath:application-bean.xml"})
public class ShiroConfig{
}
2、重点说一下@Import
springboot提供了三种Import的方式:
1、@Import注解导入
2、实现ImportSelector接口
3、实现ImportBeanDefinitionRegistrar接口
首先定义三个普通java类User.java 、Role.java、Person.java,一个配置类ImportConfig.java
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Role {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ImportConfig {
//配置Person的bean
@Bean
public Person person(){
return new Person();
}
}
直接注入@Import注解
注解导入User、Role、ImportConfig,如下
@SpringBootApplication
@Import(value={User.class,Role.class,ImportConfig.class})
public class ImportApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ImportApplication.class, args);
System.out.println(context.getBean(User.class));
System.out.println(context.getBean(Role.class));
System.out.println(context.getBean(Person.class));
System.out.println("=================================");
context.close();
}
}
结果打印如下:
com.sjz.lesson2.config.User@c20be82
com.sjz.lesson2.config.Role@13c612bd
com.sjz.lesson2.config.Person@3ef41c66
=================================
发现注入成功
实现ImportSelector
1、实现ImportSelector接口:
public class MyImportSelector implements ImportSelector{
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{User.class.getName(),Role.class.getName(),ImportConfig.class.getName()};
}
}
2、定义注解ImportSelectorAnnotation,导入MyImportSelector类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(value=MyImportSelector.class)
public @interface ImportSelectorAnnotation {
}
3、java类中使用ImportSelectorAnnotation注解
@ImportSelectorAnnotation //等价于@Import(value=MyImportSelector.class)
@SpringBootApplication
//@Import(value={User.class,Role.class,ImportConfig.class})
//@Import(value=MyImportSelector.class)//等价于@Import(value={User.class,Role.class,ImportConfig.class})
@ImportSelectorAnnotation //等价于@Import(value=MyImportSelector.class)
public class ImportApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ImportApplication.class, args);
System.out.println(context.getBean(User.class));
System.out.println(context.getBean(Role.class));
System.out.println(context.getBean(Person.class));
System.out.println("=================================");
context.close();
}
}
测试可以正常获取
实现ImportBeanDefinitionRegistrar接口
1、实现ImportBeanDefinitionRegistrar接口
public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder userBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class);
registry.registerBeanDefinition(User.class.getName(), userBeanDefinition.getBeanDefinition());
BeanDefinitionBuilder roleBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Role.class);
registry.registerBeanDefinition(Role.class.getName(), roleBeanDefinition.getBeanDefinition());
BeanDefinitionBuilder importConfigBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(ImportConfig.class);
registry.registerBeanDefinition(ImportConfig.class.getName(), importConfigBeanDefinition.getBeanDefinition());
}
}
2、定义注解BeanDefinitionRegistrarAnnotation导入MyBeanDefinitionRegistrar
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(value=MyBeanDefinitionRegistrar.class)
public @interface BeanDefinitionRegistrarAnnotation {
}
3、java类中使用BeanDefinitionRegistrarAnnotation注解
@SpringBootApplication
@BeanDefinitionRegistrarAnnotation
public class ImportApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ImportApplication.class, args);
System.out.println(context.getBean(User.class));
System.out.println(context.getBean(Role.class));
System.out.println(context.getBean(Person.class));
System.out.println("=================================");
context.close();
}
}
备注:可以在具体类中直接使用@Import注解导入MyImportSelector和MyBeanDefinitionRegistrar,不需要使用注解
相关推荐
在本篇文章中,我们将详细介绍 @Import 的作用和使用方法。 什么是 @Import? @Import 是 Spring Boot 中的一个注解,用于将指定的类实例注入到 Spring IOC Container 中。它的作用类似于 Spring XML 中的 `...
本教程将详细介绍如何在Spring Boot项目中整合MyBatis,并使用@Select注解来实现数据库查询。 首先,我们需要在Spring Boot项目中引入MyBatis的依赖。在`pom.xml`文件中添加如下依赖: ```xml <groupId>org....
`@ComponentScan`注解则会扫描指定包及其子包下的所有@Component、@Service、@Repository和@Controller等注解的类,将它们注册为Spring Bean,以便在应用中使用。 6. SpringApplication `SpringApplication`是...
在上面的`DatabaseConfig`类中,我们通过`@Value`注解将`database.properties`文件中的`db.url`、`db.username`和`db.password`属性注入到对应的字段中,使得这些配置值可以直接在类中使用。 需要注意的是,如果在...
5. 在业务逻辑类中使用`@Scheduled`注解来定义定时任务,并根据数据库配置动态调整执行频率。 通过这种方式,我们可以灵活地管理和调整应用中的定时任务,而无需修改代码,只需更改数据库中的配置即可。
这时,可以使用`@TestConfiguration`注解创建一个只在测试中使用的配置类。 此外,Spring Boot测试支持`@MockBean`和`@SpyBean`注解,可以用来模拟或监控bean的行为,这对于测试时避免不必要的数据库操作或外部服务...
SpringBoot框架提供了强大的功能来实现定时任务和异步调用,这在业务场景中非常常见。例如,在电商平台中,需要定时发送邮件、短信、统计监控数据等操作,而在订单流程中,需要异步调用下单、发货通知、短信推送、...
在Spring Boot中使用RSocket,首先需要引入相关依赖。在`pom.xml`文件中,添加`spring-boot-starter-rsocket`和`spring-boot-starter-webflux`依赖,因为RSocket基于Reactive Streams进行数据处理,而WebFlux是...
在测试类中,我们可以使用 `@Test` 注解来标记测试方法,并使用 `@Before` 和 `@After` 注解来标记测试前的 setup 和 teardown 操作。 MockMvc MockMvc 是 Spring Boot 提供的一种强大的测试工具,可以模拟 HTTP ...
在Sass世界里,@import规则曾是组织和合并样式表的主要方式,但在Sass 7.0版本之后,引入了新的模块系统,推荐使用@use来替代@import。这个转变是为了提供更好的命名空间管理和避免潜在的命名冲突,从而提高代码的可...
在Spring Boot项目中,枚举类型(Enums)的使用是一种常见...以上所述内容,都是在`springboot-enum-demo-master`项目中可以找到的实际应用示例,可以帮助开发者更好地理解和实现Spring Boot项目中枚举类型的高效使用。
标题 "最最最简单的SpringBoot+Redis" 描述了如何在SpringBoot项目中集成和使用Redis,这是一个流行的Java开发框架和一个高效的键值存储系统。接下来,我们将深入探讨这个主题,详细讲解SpringBoot与Redis的集成,...
在现代的Web开发中,API接口的文档化和测试是非常重要的环节,这使得开发者能够方便地理解和使用API。Swagger作为一款流行的API文档化工具,它提供了直观、易用的界面来展示、测试和理解RESTful API。在Java Web开发...
在本文中,我们将深入探讨如何在IDEA(IntelliJ IDEA)中搭建一个基于SpringBoot的Web MVC应用程序。SpringBoot简化了Spring应用的初始搭建以及开发过程,它内嵌了Tomcat服务器,使得我们可以无需额外配置就能运行Web...
在SpringBoot中,我们可以通过配置`application.yml`或`application.properties`文件来设置JedisCluster的相关参数。以下是一个基本的YAML配置示例: ```yaml spring: data: redis: cluster: nodes: node1:6379...
在本项目中,我们主要探讨如何使用SpringBoot与Elasticsearch(ES)集成,以便查询存储在ES中的日志内容。Elasticsearch是一种强大的、分布式、实时的搜索和分析引擎,常用于处理大量数据,特别是在日志管理和分析...
导入CSS文件主要有两种方式: 链接式(link) 代码如下 复制代码代码如下: <link rel=”stylesheet” href=”style.css” type=”text/css”/>... 而采用@import方式,浏览器则会先装载完整个H
@Import 注解可以在@Configuration 注解的配置类中使用,用于导入其他配置类或bean 方法。例如: ```java @Configuration @Import({TestBean1.class, TestBean2.class}) public class AppConfig { // ... } ``` 在...
通过这个例子,我们可以看到easypoi在SpringBoot项目中的使用非常简便,它大大简化了Excel操作的代码,提高了开发效率。同时,由于其对Word和PDF的支持,easypoi成为了一个全面的文档处理工具,对于需要处理多种格式...
在IT行业中,SpringBoot和Mybatis是两个非常重要的框架,它们分别是Java后端开发的主流框架。SpringBoot简化了Spring的配置,提供了快速构建应用程序的能力,而Mybatis则是一个轻量级的持久层框架,专注于SQL映射和...