当前位置: 代码迷 >> 综合 >> springboot组件添加,@Configuration,@Import,@Conditional,@ImportResource
  详细解决方案

springboot组件添加,@Configuration,@Import,@Conditional,@ImportResource

热度:98   发布时间:2023-12-12 20:58:59.0

有关组件添加的注解@Bean、@Component、@Controller、@Service、@Repository

@Configuration

  1. 之前spring创建xml的方式

在这里插入图片描述
2. 现在通过标有@Configuration的配置类

package com.ll.config;import com.ll.domain.Pets;
import com.ll.domain.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration // 告诉springboot这是配置文件,以前xml能做的,它都能做
public class MyConfig {
    //给容器中添加一个user组件(组件id:方法名;组件类型:返回类型;返回值:组件容器中的实例(单例))// @Bean("user01") 自定义组件id@Beanpublic User user01(){
    return new User(18,"zhangsan");}@Beanpublic Pets pets01(){
    return new Pets("cat");}
}
  1. 打印的结果
    可以看到MyConfig 本身就是组件
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
    ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);// 固定写法String[] beanDefinitionNames = run.getBeanDefinitionNames();for (String a:beanDefinitionNames) {
    System.out.println(a);}}
}

在这里插入图片描述

4.容器中创建的组件实单例的

    public static void main(String[] args) {
    ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);// 固定写法String[] beanDefinitionNames = run.getBeanDefinitionNames();for (String a:beanDefinitionNames) {
    System.out.println(a);}User user1 = run.getBean("user01",User.class);User user2 = run.getBean("user01",User.class);System.out.println(user1==user2);// true 在容器中是单实例的}
  1. springboot2新增特性proxyBeanMethods
    proxyBeanMethods:代理bean的方法
    Full(proxyBeanMethods = true),速度会慢一点,默认为true
    Lite(proxyBeanMethods = false),springboot不会检查bean是否在容器中已经存在,所以速度很快,适用于没有组件依赖的情况
// @Configuration的源码,其中有proxyBeanMethods()
@Target({
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(annotation = Component.class)String value() default "";boolean proxyBeanMethods() default true;
}

组件依赖
Dog和Pets有组件依赖

public class Pets {
    private String name;public Pets(){
    }private Dog dog;public Dog getDog() {
    return dog;}public void setDog(Dog dog) {
    this.dog = dog;}public Pets(String name) {
    this.name = name;}public String getName() {
    return name;}public void setName(String name) {
    this.name = name;}@Overridepublic String toString() {
    return "Pets{" +"name='" + name + '\'' +'}';}
}

@Import
给容器添加组件,类注解
@Import({User.class, DBHelper.class})

@Conditional
满足Conditional的条件,才进行组件注入
可以作用于类和方法
在这里插入图片描述

@ImportResource
springboot的容器中没有spring的xml中配置的bean
如果要做大量的bean迁移到springboot环境中,可以使用@ImportResource注解引入原来的xml的配置

@ImportResource("classpath:beans.xml")
public class MyConfig {
    
}

@ConfigurationProperties
是跟application.properties里面进行绑定的
组件需要在容器中
配置绑定
把properties配置文件配到javabean里
方式1:
@Component + @ConfigurationProperties

@Component
@ConfigurationProperties(prefix = "zhangsan")
public class User {
    
// 省略bean
}

方式2:
@EnableConfigurationProperties + @ConfigurationProperties
如果要注册的类是引的第三方包里的,不能加@Component注解到包里,这时候就需要用这种方式
开启配置绑定功能并把这个组件自动注册到容器中

@Component
@ConfigurationProperties(prefix = "zhangsan")
public class User {
    
// 省略bean
}
@EnableConfigurationProperties(User.class)
public class MyConfig {
    
// 省略
}

原来写法:

在这里插入图片描述

  相关解决方案