JavaConfig1

来源:互联网 发布:网络大电影众筹方案 编辑:程序博客网 时间:2024/06/16 06:26
1.@ComponentScan
@ComponentScan对应于XML配置形式中的<context:component-scan>元素,用于配合一些元信息Java Annotation
比如@Component和@Repository等,将标注了这些元信息Annotation的bean定义类批量采集到Spring的IOC容器中。
我们可以通过basePackages等属性来细粒度地定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring
框架会从声明@ComponentScan所在类的package进行扫描。
  @ComponentScan是SpringBoot框架魔法得以实现的一个关键组件。
2.@PropertySource与@PropertySources
 @PropertySource用于从某个地方加载*.properties文件内容,并将其中的属性加载到IOC容器中,便于填充一些
bean定义属性的占位符(placeholder),当然,这需要PropertySourcesPlaceholderConfigurer的配合。
(Java8及更高)
@Configeration
@PropertySource("classpath:1.properties")
@PropertySource("classpath:2.properties")
@PropertySource("classpath:3.properties")
public class XConfiguration{
...
}
(低于Java8)
@PropertySources({
 @PropertySource("classpath:1.properties")
 @PropertySource("classpath:2.properties")
})
public class XConfiguration{
...
}
3.@Import与ImportResource
 在XML形式的配置中,我们通过<import resource="xxx.xml"/>的形式将多个分开的容器配置合到一个配置中,在JavaConfig
形式的配置中,我们使用@Import这个Annotation完成同样目的:
@Configuration
@Import(MockConfiguration.class)
public class XConfiguration{
...
}
@Import只负责引入JavaConfig形式定义的IOC容器配置,如果有一些遗留的配置或者遗留系统需要以XML形式来配置
(比如dubbo框架),我们依然可以通过@ImportResource将它们一起合并到当前JavaConfig配置的容器中:
@Configuration
@Import(MockConfiguration.class)
@ImportResource("...")
public class XConfiguration{
...
}
4.@Configuration
用@Configuration注解该类,等价于XML中配置beans;用@Bean标注方法等价于XML中配置bean
5.@Value
通过@Value注解可以将属性值注入进来
    @Configuration    
    public class ExampleConfiguration {    
        
        @Value("com.mysql.jdbc.Driver")    
        private String driverClassName;    
        
        @Value("jdbc://xxxx.xx.xxx/xx")    
        private String driverUrl;    
        
        @Value("${root}")    
        private String driverUsername;    
        
        @Value("123456")    
        private String driverPassword;    
        
        @Bean(name = "dataSource")    
        public DataSource dataSource() {    
            BasicDataSource dataSource = new BasicDataSource();    
            dataSource.setDriverClassName(driverClassName);    
            dataSource.setUrl(driverUrl);    
            dataSource.setUsername(driverUsername);    
            dataSource.setPassword(driverPassword);    
            return dataSource;    
        }    
        
        @Bean    
        public PlatformTransactionManager transactionManager() {    
            return new DataSourceTransactionManager(dataSource());    
        }    
        
    }  
这样,在项目中

@Autowired

private DataSource dataSource;

的时候,这个dataSource就是我们在ExampleConfiguration中配的DataSource
这样,在项目中
6.@ConfigurationProperties

Spring Boot 可以方便的将属性注入到一个配置对象中。例如:

my.name=Isea533
my.port=8080
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com


对应对象:

@ConfigurationProperties(prefix="my")
public class Config {
    private String name;
    private Integer port;
    private List<String> servers = new ArrayList<String>();

    public String geName(){
        return this.name;
    }

    public Integer gePort(){
        return this.port;
    }
    public List<String> getServers() {
        return this.servers;
    }
}

 

Spring Boot 会自动将prefix="my"前缀为my的属性注入进来。

Spring Boot 会自动转换类型,当使用List的时候需要注意在配置中对List进行初始化!
7.在@Bean方法上使用@ConfigurationProperties

例如:

@ConfigurationProperties(prefix = "foo")
@Bean
public FooComponent fooComponent() {
    ...
}

Spring Boot 会将foo开头的属性按照名字匹配注入到FooComponent对象中。

8.@EnableAutoConfiguration
  通过@Import将所有符合自动配置条件的bean定义到IOC容器
扩展:@EnableScheduling 是通过@Import将Spring调度框架相关的bean定义都加载到IOC容器
      @EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IOC容器
@EnableAutoConfiguration作为一个复合Annotation,其自身定义关键信息如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration{
...
}
EnableAutoConfiguration得以生效得关键组件关系图


自动配置的幕后:SpringFactoriesLoader详解
SPringFactoriesLoader属于Spring框架私有的一种扩展方案(类似于Java的SPI方案java.util.ServiceLoader)
,其功能就是从指定的配置文件META-INF/Spring.factories加载配置,spring.factories是一种典型的java
properties文件,配置的格式微Key=Value形式,只不过Key和Value都是Java类型的完整类名
自动配置工作过程:从classpath中搜寻所有META-INF/spring.factories配置文件,并将其中
org.spring-framework.boot.autoconfigure.AnableAutoConfiguration对应的配置项通过反射(Java Reflection)
实例化为对应的标注了@Configuration的JavaConfig形式的IOC容器配置类,然后汇总为一个并加载到IOC容器
其中,最关键的是@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector
,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前
SpringBoot创建并使用的IOC容器。另外借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持
,@EnableAutoConfiguration自动配置才能成功
9.@SpringBootApplication
它是一个“三体”结构,实际上是一个复合Annotation
@Target(ElementType.TYPE)
@Rentention(RententionPolicy.RUNTIME)
@Documented
@Inherited
@Configeration
@EnableAutoConfiguration
@ComponentScan
每次写复合Annotation比较繁琐,直接写@SpringBootApplication比较方便