spring容器在启动的时候会去扫描@Configuration,并将相关的类进行加载。那么spring容器怎么去扫描的呢?

配置类与启动类同包或者在其子包下

springboot配置数据库连接池

@Configuration
public class DruidConfig {

    //跟配置文件绑定
    //spring.druid.xx xx跟DruidDataSource里的属性绑定
    @ConfigurationProperties(prefix = "spring.druid")
    //spring容器启动时,DruidDataSource调用内部init方法启动,关闭时,调用内部close方法关闭
    @Bean(initMethod = "init",destroyMethod = "close")
    public DruidDataSource dataSource(){
        DruidDataSource dataSource=new DruidDataSource();
        dataSource.setProxyFilters(Lists.newArrayList(statFilter()));
        return dataSource;
    }

    /**
     * 定义慢sql的Filter,出现慢sql可以打印出来
     * @return
     */
    @Bean
    public Filter statFilter(){
        StatFilter statFilter=new StatFilter();
        //设定多长时间属于慢SQL  这里设置为5秒属于慢SQL
        statFilter.setSlowSqlMillis(5000);
        //设置是否打印慢SQL日志
        statFilter.setLogSlowSql(true);
        //是否将日志合并
        statFilter.setMergeSql(true);
        return statFilter;
    }

    /**
     * 添加监控bean 用来监控慢SQL日志等等
     * 服务启动后,输入地址:http://localhost:8080/druid/index.html查看监控
     * 如果存在慢SQL,则控制台会打印出来
     * 例如:slow sql 21 millis. select id,name,phone,email from user[]
     * @return
     */
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        return new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
    }

}

如果DruidConfig所在包名为:com.ft.abc.xx,而启动类所在包名为:com.ft.abc,那么满足spring的扫描条件,配置被成功加载。如果不满足包名条件的情况下,还想让配置类加载成功,该怎么办?看下一种方式。

spring.factories文件的配置

在resources目录下新建META-INF目录,并在该目录下创建spring.factories文件。spring.factories文件内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ft.xx.config.DruidConfig

第一行是spring自动配置的路径,第二行是我们自己要指定加载配置类的路径。
这样的话,spring也会去找到该配置类,并且加载它。

自定义注解指定配置类

假设前两种都不用,那么可以自定义一个注解,并将注解加到启动类中,也能达到目的。
自定义注解如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(DruidConfig.class)
public @interface EnableDruidConfig {

}

这个注解里已经将DruidConfig配置类引入了。
启动类加上该注解:

@SpringBootApplication
@EnableDruidConfig
public class HourseApplication {

	public static void main(String[] args) {
		SpringApplication.run(HourseApplication.class, args);
	}

}

启动spring容器,配置类加载成功!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐