点击返回目录
@Configuration:
允许在上下文中注册额外的bean或导入其他配置类
这个注解相当于一个xml文件.
举例1:如下的xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <bean class="com.User"></bean> </beans>
在java配置里大概就是这样。
@Configuration public class JavaConfig{ @Bean public User user(){ return new User(); } }
@Bean:
作用在方法上面,通常可以将该方法的返回值作为Bean注入到spring的容器中.
每个bean都有一个name值,在Configuration里面,@Bean的name就是方法名.当然你可以显式地指出bean的name,并且可以拥有多个name,如下:
@Configuration
public class JavaConfig{
@Bean({"myUser","user"})
public User user(){
return new User();
}
}
你也可以为bean设置scope等,这些属性都需要一些特定的注解,如下设置scope:这将不再是个单例
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public User user(){
return new User();
}
@Component
spring启动的时候加载的bean.
Component和Controller以及Service等这些注解没有什么区别,只是Controller/Service是一种约定,约定分别加到哪一层。
那么Component和Bean又有什么区别呢?
Component是类注解,Bean是方法注解。
Bean注解还可以让第三方包作为Bean,但是Component则不行啦。
@ComponentScan
扫描包来导入Bean。一般配合@Configuration来使用,和XML的<context:component-scan>极为相似,例子如下:
@Configuration
@ComponentScan("com.service")
public class JavaConfig{
}
如果没有指定包,则从当前类的包中进行扫描。
@Import
导入Configuration ,使用如下:
@Configuration
@Import({UserConfig.class,ManagerConfig.class})
public class JavaConfig{
}
它和 @ComponentScan的最终结果是一样的,只是过程和表现形式是不同的。
@EnableAutoConfiguration
启用Spring Boot的自动配置机制。
Spring Boot自动配置:尝试根据您添加的jar依赖项自动配置Spring应用程序。例如,如果HSQLDB
在您的类路径上,并且您尚未手动配置任何数据库连接bean,则Spring Boot会自动配置内存数据库。
该注解应该只配置一个。
@SpringBootApplication
SpringBootApplication = EnableAutoConfiguration + Configuration + ComponentScan
springboot的启动注解
如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplication(Application.class).run(args);
}
}
等于
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Application {
public static void main(String[] args) {
new SpringApplication(Application.class).run(args);
}
}
由此亦可以推导出,为什么SpringApplication的启动类要放在其他类之上的根包中,因为ComponentScan会只扫描当前包
@RunWith(SpringJUnit4ClassRunner.class)
这个注解实际上是Junit的,但是在spring的test里必不可少。
@ContextConfiguration
这个是spring测试,用来加载spring上下文。它有locations和classes两个属性,一个是用来加载Configuration类的,一个是用来加载xml文件的。
@SpringBootTest
这个是SpringBoot的测试,它不仅加载上下文,同时还会启动SpringBoot,它有个class属性,填入springboot的启动类。
如果不填启动类,那么它会寻找@SpringBootConfiguration的配置来启动springboot
@SpringBootConfiguration
Spring准备用它来代替@Configuration,但是在注释里说最好一个应用只配置一个,有点不太理解为什么不能配置多个呢?