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注解的配置类有如下要求:
- @Configuration不可以是final类型;
- @Configuration不可以是匿名类;
- 嵌套的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