java:【@Import】和【ImportSelector】的简单示例

# 代码结构

在这里插入图片描述

# 项目【myBeanBranch】

【pom.xml】

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.15.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.15.RELEASE</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>
<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId>
    <version>1.3.5</version>
</dependency>

【BranchBean.java】

package com.chz.myBeanBranch.bean;

@Slf4j
@Getter
@Setter
// 被【ImportSelector】指过来的类不需要添加【@Component】
public class BranchBean {

    private String name;

    @PostConstruct
    public void init()
    {
        name = "BranchBeanName put in from @PostConstruct";
    }
}

【BranchController.java】

package com.chz.myBeanBranch.controller;

// 被【ImportSelector】指过来的类不需要添加【@RestController】,但要加【@ResponseBody】
@Slf4j
@ResponseBody
@RequestMapping("/branch")
public class BranchController {

    @Autowired
    private BranchBean branchBean;

    @GetMapping("/test1")
    public String test1() {
        return "test1: " + branchBean.getName();
    }
}

【BranchImportBean.java】

package com.chz.myBeanBranch.importSelector;

// 被【@Bean】指过来的类不需要添加【@Component】
@Getter
@Setter
public class BranchImportBean 
{
    private Integer id = 1;
    private String name = "BranchImportBeanName";
}

【BranchImportConfiguration.java】

package com.chz.myBeanBranch.importSelector;

// 被【ImportSelector】指过来的类不需要添加【@Configuration】
public class BranchImportConfiguration 
{
    @Bean
    public BranchImportBean branchImportBean() {
        BranchImportBean branchBean = new BranchImportBean();
        branchBean.setId(19);
        branchBean.setName("I am branchImportBean!!!");
        return branchBean;
    }
}

【BranchImportSelector.java】

package com.chz.myBeanBranch.importSelector;

public class BranchImportSelector implements ImportSelector
{
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata)
    {
        // 这里想让哪个类变成bean就在返回值里面返回,所以ImportSelector可以用来做为动态添加bean的一个方法,
        // 比如扫描某一个自定义注解,然后返回类名,变成bean
        return new String[]{
                BranchImportConfiguration.class.getName(),
                BranchController.class.getName(),
                BranchBean.class.getName()
        };
    }
}

【EnableBranchImportSelector.java】

package com.chz.myBeanBranch.importSelector;

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
@Import(BranchImportSelector.class)   // 这里使用了@ImportSelector
public @interface EnableBranchImportSelector {
}

# 项目【myBeanMain】

【pom.xm】

<dependency>
    <groupId>com.chz</groupId>
    <artifactId>myBeanBranch</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.12.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>2.3.12.RELEASE</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>

【application.properties】

server.port=8080
spring.application.name=myBeanMain

management.server.port=7001
management.endpoints.web.exposure.include=*

【MainBean.java】

package com.chz.myBeanMain.bean;

@Getter
@Setter
@Component
public class MainBean
{
    @Autowired
    private NotAnnotatedBean notAnnotatedBean;

    @Autowired
    private BranchBean branchBean;

    @Autowired
    private BranchImportBean branchImportBean;
}

【NotAnnotatedBean.java】

package com.chz.myBeanMain.bean;

// 被【@Import】指过来的bean不需要添加【@Component】
@Getter
@Setter
public class NotAnnotatedBean 
{
    private String name = "I am " + this.getClass().getSimpleName();
}

【MainController.java】

package com.chz.myBeanMain.controller;

@Slf4j
@RestController
@RequestMapping("/main")
public class MainController 
{
    @Autowired
    private MainBean mainBean;

    @GetMapping("/notAnnotatedBean")
    public String notAnnotatedBean() {
        return "notAnnotatedBean: " + mainBean.getNotAnnotatedBean().getName();
    }

    @GetMapping("/branchBean")
    public String branchBean() {
        return "branchBean: " + mainBean.getBranchBean().getName();
    }

    @GetMapping("/branchImportBean")
    public String branchImportBean() {
        return "branchImportBean: " + mainBean.getBranchImportBean().getName();
    }
}

【MyBeanMainTest.java】

package com.chz.myBeanMain;

@Import(NotAnnotatedBean.class)         // 这里使用了@Import
@EnableBranchImportSelector             // 这里使用了@ImportSelector
@SpringBootApplication
public class MyBeanMainTest 
{
    public static void main(String[] args) {
        SpringApplication.run(MyBeanMainTest.class, args);
    }
}

# 测试

启动【MyBeanMainTest】,然后:

访问【http://localhost:8080/branch/test1】
在这里插入图片描述
访问【http://localhost:8080/main/branchBean】
在这里插入图片描述
访问【http://localhost:8080/main/branchImportBean】
在这里插入图片描述
访问【http://localhost:8080/main/notAnnotatedBean】
在这里插入图片描述

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
@Import引入ImportSelector接口的主要作用是选择性地注册Bean。ImportSelector接口中的selectImports()方法返回一个类数组,其中每个类都将被注册为一个Bean。这里的选择性是指根据一些条件来选择哪些类将被注册为Bean,可以通过代码逻辑来实现示例: 假设我们有一个注解@MyConfiguration,我们想使用它来注册一些Bean。我们可以创建一个实现ImportSelector接口的类MyImportSelector实现它的selectImports()方法来选择性地注册Bean。 ``` @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(MyImportSelector.class) public @interface MyConfiguration { String[] value() default {}; } ``` MyImportSelector类的实现如下: ``` public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { // 获取@MyConfiguration注解中的value属性 Map<String, Object> attributes = importingClassMetadata.getAnnotationAttributes(MyConfiguration.class.getName()); String[] values = (String[]) attributes.get("value"); // 根据一些条件来选择哪些类将被注册为Bean if (values != null && values.length > 0) { // 返回类数组,其中每个类都将被注册为一个Bean return values; } else { return new String[]{MyBean.class.getName()}; } } } ``` 这个例子中,我们通过@MyConfiguration注解引入了MyImportSelector类,它的selectImports()方法返回一个类数组,其中每个类都将被注册为一个Bean。我们可以根据@MyConfiguration注解中的value属性来选择性地注册Bean,如果没有指定value属性,则默认注册MyBean类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈鸿圳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值