@Configuration注解

本文详细介绍了Spring框架中@Configuration注解的用途,包括如何定义配置类、批量扫描、按条件注册bean以及使用@Import进行注册。@Configuration用于替代XML配置,标记的类包含@Bean注解的方法,这些方法会生成bean定义。同时,通过@Conditional可以实现条件注册,只有满足特定条件时才会注册bean。此外,还展示了如何使用@Import批量导入并注册bean。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";

    boolean proxyBeanMethods() default true;
}

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

@Configuration的第二个作用是可以作为配置类,和@Component的作用一样,两者的差别是@Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。

@Configuration注解的配置类有如下要求:

  1. @Configuration不可以是final类型;
  2. @Configuration不可以是匿名类;
  3. 嵌套的configuration必须是静态类。

2. 用于定义配置类

@Configuration
 public class AppConfig {

     @Bean
     public MyBean myBean() {
         // instantiate, configure and return bean ...
     }
 }

3. 用于配置批量扫描

        使用配置类扫描批量注册,只能注册加了组件注解(@Repository、@Service、@Controller、@Component)的类

@Configuration
@ComponentScan(basePackages = {"cn.test.entity", "cn.test.service", "cn.test.dao"},
excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {Person.class})})
public class BeanConfig {
}

4. 按条件注册

①在配置类上加@Configuration注解

②在方法上加@Bean注解,bean的id默认为方法名,如果需要自定义id,则在该注解上加value属性

③在方法上加@Conditional注解,该注解的参数是字节码数组,什么样的类的字节码呢?必须是实现了Condition接口的。使用时,需要自定义1个或多个Condition的实现类,并在其实现方法中定义生效条件,当满足生效条件时,才会去注册该bean类

/**
 * 按条件注册bean类
 */
@Configuration
public class BeanConfig {
    
    /**
     * 按条件生成名字为ronaldo的Person对象
     * 条件为写在JuventusCondition类中
     */
    @Bean(value = "ronaldo")
    @Scope(value = SCOPE_SINGLETON)
    @Conditional({JuventusCondition.class})
    public Person ronaldo() {
        return new Person("ronaldo", 34);
    }
}

5.使用导入方式注册

①在配置类上加@Configuration注解

②在配置类上加@Import注解,该注解的value属性为字节码数组,可以接收以下三种类的字节码

/**
 * springIOC容器配置类
 * 使用import注解注册bean
 * 该注解可以接收三种参数
 * 1.要注册的类的字节码
 * 2.ImportSelector的自定义实现类的字节码,在其实现方法中,将要注册的类的全限定名写入返回数组
 * 3.ImportBeanDefinitionRegistrar的自定义实现类的字节码,在其实现方法中,使用bean注册器手动注册
 * 其中,前两种方式注册的bean的id只能是该类的全限定名
 * 第三种方式注册的bean类可以自定义id
 */
@Configuration
@Import({Red.class, ColorImportSelector.class, ColorDefinitionRegistrar.class})
public class BeanConfig {
}

感谢:https://blog.youkuaiyun.com/Liuqz2009/article/details/101310194

https://www.cnblogs.com/dubhlinn/p/10662763.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值