@SpringBootApplication
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}
主要关注的几个注解如下
@SpringBootConfiguration:标记当前类为配置类
@EnableAutoConfiguration:开启自动配置
@ComponentScan:扫描主类所在的同级包以及下级包里的Bean
关键是@EnableAutoConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
@Service、 @Controller、 @Repository 和 @Component
@Controller:
- SpringMVC 中,控制器 Controller 负责处理 DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个 Model,然后再把该 Model 返回给对应的 View 进行展示。
- SpringMVC 提供了一个非常简便的定义 Controller 的方法,你无需继承特定的类或者接口,只需使用 @Controller 标记一个类是 Contoller。
@Service、 @Contrller、 @Repository 其实这 3 个注解和 @Component 是等效的,用在实现类上:
- @Service 用于标注业务层组件
- @Controller 用于标注控制层组件
- @Repository 用于编著数据访问组件
- @Component 泛指组件,当组件不好归类时,可以使用这个注解进行标注
@RequestMapping
使用 @RequestMapping 来映射 URL 到控制器,或者到 Controller 控制器的处理方法上。method 的值一旦指定,则处理方法只对指定的 HTTP method 类型请求处理。
可以为多个方法映射相同的 URI,不同的 HTTP method 类型,Spring MVC 根据请求的 method 类型是可以区分开这些方法的。
@RequestParam 和 @PathVariable
在 SpringMVC 中,两者的作用都是将 request 里的参数的值绑定到 Controller 里的方法参数中,区别在于 URL 的写法不同。
- 使用 @RequestParam 时,URL 是这样的:
http://host:port/path?参数名=参数值
- 使用 @PathVariable 时,URL 是这样的:
http://host:port/path/参数值
@ResponseBody
该注解用于将 Controller 中方法返回的对象,通过适当的 HttpMessageConverter 转换为指定的格式后,写入到 Response 对象的 bodys 数据区。
@Value
在 Spring 3.0 中,可以通过使用 @Value,对一些如 xxx.properties 文件中的文件,进行键值对的注入。
@Autowired
@Autowired 可以对成员变量、成员方法和构造函数进行标注,来完成自动装配工作。
@Autowired 和 @Resource 的区别
@Autowired
- 是 Spring 提供的注解
- 采用的策略是按照类型注入的
存在问题:同一类型有多个 Bean,可以使用 @Qualifier 具体去装配哪个对象。public class UserService{
@Autowired
userDao; //在 Spring 容器中找到类型为 userDao 的类,将其注入
}
public class UserService{
@Autowired
@Qualifier(name="userDao")
userDao; //在 Spring 容器中找到类型为 userDao 的类,将其注入
}
@Resource
- J2EE 提供的注解
默认是按照名称注入的
Service{
@Resource
userDao; //自动按名称进行装配
@Resource(name="studentDao")
studentDao; //按名称进行装配,找不到会抛出异常
@Resource(type="TeacherDao")
teacherDao; //按类型进行装配,找不到或者找到多个都会抛出异常
@Resource(name="manDao",type="ManDao")
manDao;//找唯一匹配的 Bean 进行装配,如果找不到则会抛出异常
}