SpringBoot 高级 原理分析 -- @Enable*注解@Import注解

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 高级 原理分析 -- @Enable*注解@Import注解相关的知识,希望对你有一定的参考价值。

01: SpringBoot 高级 原理分析 – SpringBoot 自动配置:Condition
02: SpringBoot 高级 原理分析 – 切换内置web服务器
03: SpringBoot 高级 原理分析 – @Enable*注解、@Import注解
04: SpringBoot 高级 原理分析 – @Import注解
05: SpringBoot 高级 原理分析 – @EnableAutoConfiguration 注解
06: SpringBoot 高级 原理分析 – 自定义redis-starter

1. @Enable*注解


SpringBoot中提供了很多Enable开头的注解,这些注解都是用于动态启用某些功能的。而其底层原理是使用@Import注解导入一些配置类,实现Bean动态加载


准备工作,创建2个Maven工程模块

Spring-pojo引入Spring依赖:


pom.xml

    <dependencies>
        <!--        Spring依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
    </dependencies>

1.1 思考?

SpringBoot 工程是否可以直接获取jar包中定义的Bean?

1.1.1 配置Spring-pojo

User.java

package com.tian.pojo;

public class User 

UserConfig.java

package com.tian.config;


import com.tian.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UserConfig 

    @Bean
    public User user()
        return new User();
    


1.1.2 配置Springboot-enable

引入我们刚刚创建好的spring-pojo:

<!--        引入我们刚刚创建好的spring-pojo-->
        <dependency>
            <groupId>com.tian</groupId>
            <artifactId>spring-pojo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

获取bean:

package com.tian;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringbootEnableApplication 

    public static void main(String[] args) 
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);
        // 获取bean
        System.out.println(context.getBean("user"));;
    

运行结果:


所以SpringBoot 工程不可以直接获取jar包中定义的Bean


1.1.3 解决办法01:组件扫描

package com.tian;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;


/**
 * @ComponentScan
 * SpringBoot默认的组件扫描范围是前引导类所在包及其子包, 所以他扫描不到第三方的包。
 */
@SpringBootApplication
@ComponentScan(value = "com.tian.config")
public class SpringbootEnableApplication 

    public static void main(String[] args) 
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);
        // 获取bean
        System.out.println(context.getBean("user"));;
    


1.1.4 解决方法02:@Import注解

说明:

可以使用@Import注解,加载类。这些类都会被Spring创建,并放入IOC容器。

演示:

package com.tian;

import com.tian.config.UserConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;


/**
 * @ComponentScan
 * SpringBoot默认的组件扫描范围是前引导类所在包及其子包, 所以他扫描不到第三方的包。
 */
@SpringBootApplication
//@ComponentScan(value = "com.tian.config")
@Import(value = UserConfig.class)
public class SpringbootEnableApplication 

    public static void main(String[] args) 
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);
        // 获取bean
        System.out.println(context.getBean("user"));;
    


1.1.5 解决办法03:对@Import注解进行封装

package com.tian.config;

import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 这里对@Import进行封装
@Import(UserConfig.class)
public @interface EnableUser 

运行结果:



以上是关于SpringBoot 高级 原理分析 -- @Enable*注解@Import注解的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 高级 原理分析 -- @Enable*注解@Import注解

SpringBoot 高级 原理分析 -- 自定义redis-starter

SpringBoot 高级 原理分析 -- SpringBoot启动流程分析

SpringBoot 高级 原理分析 -- 监听机制

SpringBoot 高级 原理分析 -- 切换内置web服务器

SpringBoot 高级 原理分析 -- SpringBoot 自动配置:Condition