@SpringBootApplication :
用在引导类上
-
@SpringBootConfiguration
:声明当前类是SpringBoot应用的配置类,项目中只能有一个。所以一般我们无需自己添加。 -
@EnableAutoConfiguration
:开启spring应用程序的自动配置,SpringBoot基于你所添加的依赖和你自己定义的bean,试图去猜测并配置你想要的配置。比如我们引入了spring-boot-starter-web
,而这个启动器中帮我们添加了tomcat、SpringMVC的依赖。此时自动配置就知道你是要开发一个web应用,所以就帮你完成了web及SpringMVC的默认配置了!这个自动配置可以在依赖spring-boot-autoconfigure中查看 -
@ComponentScan
:开启注解扫描,如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包。被@controller
、@service
、@repository
、@component
、@Configuration
注解的类,都会把这些类纳入进spring容器中进行管理,可以无需使用@Bean
。
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
@RestController
在XxxxController类使用,相当于@ResponseBody
+ @Controller
联用
在什么情况下使用@ResponseBody 注解?
@RestController
public class HelloController {
@GetMapping("show")
public String test(){
return "hello Spring Boot!";
}
}
@service
用于事务
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User queryById(Long id){
return this.userMapper.selectByPrimaryKey(id);
}
@Transactional
public void deleteById(Long id){
this.userMapper.deleteByPrimaryKey(id);
}
}
@repository
持久层
@component
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
//拦截器
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle method is running!");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle method is running!");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion method is running!");
}
}
java配置
@Configuration:声明一个类作为配置类,然后Spring容器会根据它来生成IoC容器去配置Bean。用于XxxxConfiguration类中。
@PropertySource:指定外部属性文件。@PropertySource("classpath:jdbc.properties")
@Value:属性注入
@Bean:声明在方法上,将方法的返回值加入Bean容器,Spring会自动调用该方法,将方法的返回值加入Spring容器中。如果没有带参数,则会以函数名(如例子中的dataSource)作为Bean的名称保存,也可以对name属性进行赋值,主动配置名字。
@Autowired:在任意位置从Spring容器中提取并注入到属性当中
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfiguration {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
测试
@RestController
public class HelloController {
@Autowired
private DataSource dataSource;
@GetMapping("show")
public String test(){
return "hello Spring Boot!";
}
}
Spring其他装配Bean的方法
除了@Bean外,Spring还允许扫描装配Bean到IoC容器中。
@Component:标明哪个类被扫描进入Spring IoC容器中。
@ComponentScan:标明采用何种策略去扫描装配Bean。一般直接用@SpringBootApplication代替
SpringBoot的属性注入方式
@ConfigurationProperties(prefix = "jdbc")
SpringBoot的属性注入方式,支持各种java基本数据类型及复杂类型的注入。要求修饰的类里面的命名与配置一致,且必须有set方法,从而可以省去@Value
@EnableConfigurationProperties(JdbcProperties.class)
在其他类注入@ConfigurationProperties配置过的类时,需要添加该注解。
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
// ... 略
// getters 和 setters
}
注入
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
@Autowired
private JdbcProperties jdbcProperties;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(jdbcProperties.getUrl());
dataSource.setDriverClassName(jdbcProperties.getDriverClassName());
dataSource.setUsername(jdbcProperties.getUsername());
dataSource.setPassword(jdbcProperties.getPassword());
return dataSource;
}
}
@RequestMapping
配置 Web 请求的映射,用{}来表明它的变量部分
@RequestMapping(value = {
"",
"/page",
"page*",
"view/*,**/msg"
})
@GetMapping
@GetMapping
是一个组合注解,是@RequestMapping(method = RequestMethod.GET)
的缩写。
@PostMapping
@PostMapping
是一个组合注解,是@RequestMapping(method = RequestMethod.POST)
的缩写。
@PathVariable
@RestController
@RequestMapping("test")
public class MyController {
@Autowired
private User user;
@GetMapping("{subPath}")
public String test(@PathVariable("subPath") String subPath) {
if (subPath.equals("all")) {
return user.toString();
} else if (subPath.equals("name")) {
return user.getUserName();
} else {
return null;
}
}
}
@RequestMapping("/user/{username}/blog/{blogId}")
@ResponseBody
public String getUerBlog(@PathVariable String username , @PathVariable int blogId) {
return "user: " + username + "blog->" + blogId;
}
这种情况下,Spring能够根据名字自动赋值对应的函数参数值,也可以在@PathVariable中显示地表明具体的URL变量值。
在默认情况下,@PathVariable注解的参数可以是一些基本的简单类型:int,long,Date,String等,Spring能根据URL变量的具体值以及函数参数的类型来进行自动转换,例如/user/fpc/blog/1,会将“fpc”的值赋给username,而1赋值给int变量blogId。
@RequestParam
@RestController
@RequestMapping("/test")
public class Test {
@GetMapping("test.do")
// 指定将username参数的值传递到该方法的name参数上
public void test(@RequestParam(name = "username") String name) {
System.out.println(name);
}
@GetMapping("user.do")
// 指定将username参数的值传递到该方法的user参数上,alias参数的值则传递到该方法的a参数上
public void userAndAlias(@RequestParam(name = "username")String user, @RequestParam(name = "alias")String a) {
System.out.println(user);
System.out.println(a);
}
}