概要
@Configuration里边定义@Bean,@Configuration相当于一个xml配置文件,@Bean就是xml中的<bean/>
定义
bean依赖可以调用方法,比如这里的beanTwo()。你可能会好奇,如果beanTwo()被调用两次会不会创建两个beanTwo实例,因为spring bean的默认scope是单例;答案是不会创建多个实例的,@Configuration类实现原理是cglib,代理类继承了配置类,然后重写方法,从而实现拦截,这也是为什么配置类不能被final修饰。
@Configuration
public class AppConfig {
@Bean
public BeanOne beanOne() {
//bean依赖,直接调用本类方法beanTwo
return new BeanOne(beanTwo());
}
@Bean
public BeanTwo beanTwo() {
return new BeanTwo();
}
}
如果跨@Configuration怎么办?将依赖bean当做方法参数传递 ,无论是否同一个类都可以使用这种方式,实践中这种用法更实用。
@Configuration
public class AppConfig1 {
//bean依赖,方法参数当作依赖
@Bean
public BeanOne beanOne(BeanTwo beanTwo) {
return new BeanOne(beanTwo);
}
}
@Configuration
public class AppConfig2 {
@Bean
public BeanTwo beanTwo() {
return new BeanTwo();
}
}
注意
如果@Bean方法返回的是BeanPostProcessor ,方法要用static 修饰,否则可能造成@Configuration中的@AutoWired、@Inject没被注入,因为很有可能AutoWiredBeanPostProcessor在@Configuration实例化之后执行。这是为什么呢? 这是因为static方法的BeanPostProcessor实例化时,不需要实例化@Configuration类,相当于执行ConfigurationClass.staticMethod(); 而非static方法,依赖@Configuration类实例,相当于new ConfigurationClass().notStaticMethod();总
|