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启动流程分析