栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring——》@Import注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring——》@Import注解

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Spring】

Spring——》@Import注解
  • 一、介绍
  • 二、作用
  • 三、导入配置类
    • 1、RedisConfig.java
    • 2、MyBatisConfig.java
    • 3、JavaConfig.java
  • 四、对象注入方式
    • 方式1、静态注入
      • 1)UserService.java
      • 2)JavaConfig.java
    • 方式2、动态注入
      • 1)实现ImportSelector接口 ,重写selectImports()
        • <1> MyImportSelector.java
        • <2> JavaConfig.java
      • 2)实现ImportBeanDefinitionRegistrar接口,重写registerBeanDefinitions()
        • <1> MyImportBeanDefinitionRegistrar.java
        • <2> JavaConfig.java
  • 四、@Import 与 @Enable区别
  • 五、Spring源码中动态注入的示例

一、介绍

@Import注解出现在 Spring 3.0

二、作用

1、替换标签,导入第三方的配置类
2、把特定类型的对象注入到Spring容器中(静态注入、动态注入)

三、导入配置类

1、RedisConfig.java
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedisConfig {
}
2、MyBatisConfig.java
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisConfig {
}
3、JavaConfig.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Import;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@Import(value = {RedisConfig.class,MyBatisConfig.class})
public class JavaConfig {
    public static void main(String[] args) {

        ApplicationContext ac = new ClassPathXmlApplicationContext("xxx.xml");
        System.out.println(ac);
    }
}
四、对象注入方式 方式1、静态注入

1)UserService.java
public class UserService {
}
2)JavaConfig.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Import;

@Import(UserService.class)
public class JavaConfig {
    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
        // 结果:com.example.test.UserService@1bb266b3
        System.out.println(ac.getBean(UserService.class));
    }
}
方式2、动态注入

动态注入的实现有2种:
1)实现 ImportSelector 接口 ,重写 selectImports()
2)实现 ImportBeanDefinitionRegistrar接口,重写 registerBeanDefinitions()

1)实现ImportSelector接口 ,重写selectImports()

<1> MyImportSelector.java
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{RedisConfig.class.getName(), MyBatisConfig.class.getName()};
    }
}
<2> JavaConfig.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Import;

@Import(MyImportSelector.class)
public class JavaConfig {
    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
        for (String beanDefinitionName : ac.getBeanDefinitionNames()) {
            // beanDefinitionName = com.example.test.RedisConfig
            // beanDefinitionName = com.example.test.MyBatisConfig
            System.out.println("beanDefinitionName = " + beanDefinitionName);
        }
    }
}

2)实现ImportBeanDefinitionRegistrar接口,重写registerBeanDefinitions()

<1> MyImportBeanDefinitionRegistrar.java
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition redis = new RootBeanDefinition(RedisConfig.class);
        registry.registerBeanDefinition("redis666", redis);
        RootBeanDefinition mybatis = new RootBeanDefinition(MyBatisConfig.class);
        registry.registerBeanDefinition("mybatis", mybatis);
    }
}

<2> JavaConfig.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Import;

@Import(MyImportBeanDefinitionRegistrar.class)
public class JavaConfig {
    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
        for (String beanDefinitionName : ac.getBeanDefinitionNames()) {
            // beanDefinitionName = redis666
            // beanDefinitionName = mybatis
            System.out.println("beanDefinitionName = " + beanDefinitionName);
        }
    }
}

四、@Import 与 @Enable区别

@Enable的本质其实就是@Import

五、Spring源码中动态注入的示例

ConfigurationClassParser.processImports()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/926538.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号