中所有带@Bean注解的方法都会被动态代理,调用该方法返回的都是同一个实例。
从定义来看,@Configuration注解本质上还是@Component,因此<context:component-scan/>
或者@ComponentScan
都能处理@Configuration注解的类。
@Configuration 标记的类必须符合下面的要求:
配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
配置类不能是 final 类(没法动态代理)。
配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类。
配置类必须是非本地的(即不能在方法中声明,不能是 private)。
任何嵌套配置类都必须声明为static。
@Bean方法不能创建进一步的配置类(也就是返回的bean如果带有@Configuration,也不会被特殊处理,只会作为普通的 bean)。
Spring 容器在启动时,会加载默认的一些PostPRocessor,其中就有 ConfigurationClassPostProcessor,这个后置处理程序专门处理带有@Configuration注解的类,这个程序会在bean定义加载完成后,在bean初始化前进行处理。其主要处理的过程就是使用 cglib 动态代理对类进行增强,使用增强后的类替换了beanFactory原有的 beanClass,增强类会对其中带有@Bean注解的方法进行额外处理,确保调用带@Bean注解的方法返回的都是同一个实例。
但是对于@Component,@Component 注解并没有通过cglib来代理@Bean方法的调用,因此调用带@Bean注解的方法态返回的都是新的实例。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
在web开发的过程中,我经常需要自定义一些配置文件,如何使用呢?
配置在application.properties中。
com.neo.title=纯洁的微笑
com.neo.description=分享生活和技术
自定义配置类
@Component
public class NeoProperties {
@Value("${com.neo.title}")
private String title;
@Value("${com.neo.description}")
private String description;
//省略getter settet方法
}
内容来源于网络,如有侵权,请联系作者删除!