springboot為什么要configuration而不用component?
@Component和@Configuration都屬于Spring所提供的注解,兩者可謂各司其職。
共同點(diǎn)@Component這個(gè)注解,從剛開始的SpringMVC到現(xiàn)在的SpringBoot,我們都一直有接觸到,我們也知道它的功能,它幫我們實(shí)現(xiàn)了聲明一個(gè)bean注入到IOC容器中。
另一個(gè)注解@Configuration,它們有個(gè)共同點(diǎn),便是它也可以聲明一個(gè)bean注入到IOC容器中。
特別點(diǎn)那這樣的話,@Configuration的意義是什么呢?
在我看來,@Configuration這個(gè)注解,是最能詮釋Spring的去配置文件這個(gè)工作的注解,因?yàn)檫@個(gè)注解有一個(gè)很大的作用,它可以代替xml文件,生成類似<beans>的結(jié)果。
也就是除了本身外,它可以在類中通過@Bean注解來注入多個(gè)Bean到IOC容器中。
如下:
@Configurationpublic class ExampleConfiguration {// 獲取到application.properties里的com.mysql.jdbc.Driver配置項(xiàng)@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;//通過@Configuration和@Bean注解,將注入一個(gè)名稱為dataSource的Bean,這個(gè)Bean的主體,便是dataSource()這個(gè)方法的結(jié)果@Bean(name = "dataSource")public DataSource dataSource() {BasicDataSource dataSource = new BasicDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUrl(driverUrl);dataSource.setUsername(driverUsername);dataSource.setPassword(driverPassword);return dataSource;}// 還能再繼續(xù)注入其他的Bean@Beanpublic PlatformTransactionManager transactionManager() {return new DataSourceTransactionManager(dataSource());}}之后在需要使用該Bean的地方,便可以使用
@Autowiredprivate DataSource dataSource;來注入,并使用。
注意點(diǎn)在使用@Configuration這個(gè)注解的時(shí)候,有幾點(diǎn)是需要注意的,我們順便提一下:
配置類必須以類的形式提供(不能是工廠方法返回的實(shí)例),允許通過生成子類在運(yùn)行時(shí)增強(qiáng)(cglib 動(dòng)態(tài)代理)。
配置類不能是 final 類(沒法動(dòng)態(tài)代理)。配置注解通常為了通過 @Bean 注解生成 Spring 容器管理的類,配置類必須是非本地的(即不能在方法中聲明,不能是 private)。任何嵌套配置類都必須聲明為static。@Bean 方法可能不會(huì)反過來創(chuàng)建進(jìn)一步的配置類(也就是返回的 bean 如果帶有 @Configuration,也不會(huì)被特殊處理,只會(huì)作為普通的 bean)。