ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring的EnableAutoConfiguration注解

2022-03-27 15:32:08  阅读:125  来源: 互联网

标签:Spring public EnableAutoConfiguration 注解 import com class itheima


@EnableAutoConfiguration注解

Enable*开头的注解大都用于动态的开启某些功能的,其底层原理是使用@import注解导入了一些配置类,可以实现Bean的动态加载,但不一定说所有的Bean都会加载,因为需要满足@Conditional注解中的所有条件才可以创建

//@EnableAutoConfiguration注解下的两个注解:
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})

即根据以上描述可以得出:Springboot不能够直接自动读取jar包里面的Bean或第三方(其他Module中定义的bean)

演示:Springboot不能自动获取第三方创建的Bean

//第一:在springboot-enable中获取bean -- user
package com.itheima.springbootenable;

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 run = SpringApplication.run(SpringbootEnableApplication.class, args);
      Object object = run.getBean("user");  //获取springboot-other里面的bean-user
      System.out.println(object);
   }
}

//第二:创建另外一个工程springboot-other, 将User在这个工程中创建
//1.创建Bean
package com.itheima.domain;

public class User {
}
//2.将User纳入到Spring的IOC容器
package com.itheima.config;
import com.itheima.domain.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UserConfig { //将User纳入SpringIOC容器

    @Bean
    public User getUser(){

        return new User();
    }
}

//第三:在sprigboot-enable中的pom.xml引入springboot-other 项目坐标
<dependency>
	<groupId>com.itheima</groupId>
	<artifactId>springboot-other</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>
//第四:测试springboot-enable是否可以直接获取springboot-ohter中的User
结论:不能
原因:SpringbootApplication注解下有一个@ComponentScan注解负责扫描,作用是只负责扫描主配置类对应的包和该类下的子包,
      被扫到的包中的组件才会被纳入该工程的Spring IOC容器中,而User所在的包是springboot-other工程中的,扫描不到

 测试结果:

测试结果

那么Springboot将如何引入第三方中的Bean呢?

共有4中方案

1. 在主配置类上引入@CompanentScan注解,扫描 com.itheima.config 配置类的这个包

@SpringBootApplication
@ComponentScan("com.itheima.config")
public class SpringbootEnableApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext run = SpringApplication.run(SpringbootEnableApplication.class, args);
		Object object = run.getBean("user");
		System.out.println(object);
	}
}

2. 在主配置类上引入@Import注解,加载创建User的配置类  UserConfig.class

@SpringBootApplication
//1.@ComponentScan("com.itheima.config")
@Import(UserConfig.class)
public class SpringbootEnableApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext run = SpringApplication.run(SpringbootEnableApplication.class, args);
		Object object = run.getBean("user");
		System.out.println(object);
	}
}

 3. 在第三方项目中声明一个注解,将创建User的配置类UserConfig进行import到这个注解中, 主配置类就使用

//springboot-other这个模块
package com.itheima.annoation;

import com.itheima.config.UserConfig;
import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(UserConfig.class) //将UserConfig 这个配置类import进来
public @interface EnableUserAnnotion {//声明一个注解
}

//springboot-enable这个项目中的主启动类中引入以上声明的那个注解就可以EnableUserAnnotion
package com.itheima.springbootenable;

import com.itheima.annoation.EnableUserAnnotion;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
//1.@ComponentScan("com.itheima.config")
//2.@Import(UserConfig.class)
@EnableUserAnnotion
public class SpringbootEnableApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext run = SpringApplication.run(SpringbootEnableApplication.class, args);
		Object object = run.getBean("user");
		System.out.println(object);
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:Spring,public,EnableAutoConfiguration,注解,import,com,class,itheima
来源: https://www.cnblogs.com/Swl-Maky/p/16062732.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有