@Configuration
在 Java 配置中,我们用一个 java 配置去代替 Spring 中 applicationContext.xml, 这时,就需要使用注解 @Configuration
:
@Configuration
public class JavaConfig{
@Bean
SayHello sayHello(){
return new SayHello();
}
}
使用注解 @Configuration
表示这个类是一个配置类,它的作用相当于 applicationContext.xml 。
然后定义方法,方法返回对象,方法上添加@Bean 注解,表示将这个方法的返回值注入到 Spring 容器中。也就是说,@Bean 对应的方法,就相当于 applicationContext.xml 中的 bean 节点。
@Service
如果希望将一个类自动注册到 Spring 容器中,那么可以给这个类添加一个注解 @Service .
和 @Service 注解功能类似的注解,一共有四个:
- @Component
- @Repository
- @Service
- @Controller
这四个中,其他三个都是基于 @Component 做出来的,源码基本一致,功能也是一致的。
为什么要区分出来,主要是为了在不同的类上面添加时方便:
- 在 Service 层上,添加注解,使用 @Service
- 在 Dao 层上,添加注解时,使用 @Repository
- 在 Controller 层上,添加注解时,使用 @Controller
- 在其他组件上添加注解时,使用 @Component
@ComponentScan
通过注解 @ComponentScan 指定要扫描的包:
@ComponentScan(basePackages = "com.example.demo")
这表示扫描 com.example.demo 下所有的 Bean。
@Autowired
注解 @Autowired 的作用是对象注入。自动扫描的对象注入有三种方式:
- @Autowired
- @Resources
- @Injected
如果一个对象只有一个实例,则用 @Autowired ,如果一个对象有多个实例,则用 @Resources ,或者 @Autowired + @Qualifier 结合起来使用。
@Profile
@Profile 是条件注解,可以用于多环境切换。
如:
@Bean
@Profile("dev") // 使用开发环境
DataSource devDataSource(){
...
}
@RequestMapping
这个注解用来标记一个请求 URL ,如:
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
这里的 @RequestMapping("/hello") 表示当请求地址为 /hello 时,这个方法会被触发。
@RequestMapping 还可以用于请求窄化(给请求添加一个前缀),示例:
@RestController
@RequestMapping("/api")
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
这个时候访问 hello ,地址就应该是:http://localhost:8080/api/hello
.
@GetMapping
@GetMapping用于将 HTTP get 请求映射到特定处理程序的方法注解。具体来说,@GetMapping 是一个组合注解,是 @RequestMapping(method = RequestMethod.GET) 的缩写。
如下面两行是等价的:
@RequestMapping(method = RequestMethod.GET, value = "/hello2")
@GetMapping("/hello2")
@GetMapping 可以看作是 @RequestMapping 的一个细分,自 Spring 4.3 版本,引入了如下 5 个注解。
- @GetMapping,
- @PostMapping、
- @PutMapping、
- @DeleteMapping
- @PatchMapping,
@RestController
注解 @RestController = @Controller + @ResponseBody,一般用在类上,表示将这个类自动注册到 Spring 容器中,并且该类下的所有方法都会返回 JSON 格式的数据。
@ResponseBody,一般是使用在单独的方法上的,需要哪个方法返回json数据格式,就在哪个方法上使用,具有针对性。
@RequestParam
当服务端的接口变量名和前端不一致时,可以使用注解 @RequestParam 来接解决,等价于 request.getParam,示例:
@ResponseBody
@RequestMapping("login")
public String login(@RequestParam("name") String username,
@RequestParam("password") String password) {
}
这表示用 username 来接收前端传来的 name 参数。
@Param 用于 DAO 层(也就是 Mapper 层),是 mybatis 中的注解。使得 mapper.xml 中的参数与后台的参数对应上,也增强了可读性。示例:
@Mapper
@Repository
public interface UserMapper {
@Select("SELECT * FROM user where username=#{username} and password=#{password}")
User login(@Param("username") String username,@Param("password") String password);
}
@PropertySource
通过注解 @PropertySource 来引入相关配置,进行属性注入。
每一个参数使用 @Value("${xxx.xx}")
形式进行注入。
@Component // 注入到 Spring 容器中
@PropertySource(value = {"classpath:book.properties"}, encoding = "UTF-8") // 自动加载 book.properties 文件
public class Book {
@Value("${book.id}")
private Integer id;
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
...
}
@ConfigurationProperties
@ConfigurationProperties 注解会将 Spring 容器中对应的数据注入到对象对应的属性中,就不用通过 @Value 注解挨个注入了。
@Component // 注入到 Spring 容器中
@PropertySource(value = {"classpath:book.properties"}, encoding = "UTF-8") // 自动加载 book.properties 文件
@ConfigurationProperties(prefix = "book") // 类型安全的属性注入,不再使用 @Value注解 挨个注入
public class Book {
private Integer id;
private String name;
private String author;
...
}
每天学习一点点,每天进步一点点。