Spring Boot
结构供给了许多注解来简化装备和开发进程。
什么是注解式编程
注解 annotation
用来界说一个类、特点和一些办法,以便程序能够被编译处理。
它相当于一个阐明文件,告诉应用程序某个类或许特点是什么,要怎么处理。注解能够用于标示包、类、办法和变量等。
注解式编程是一种根据注释的程序编码风格。它运用特定的注释来装备和界说应用程序的行为,而不需求显式编写很多的装备代码。
比方:
@RestController
public class Jimmy {
@RequestMapping("/jimmy")
public String sayHi() {
return "Hello, Jimmy."
}
}
常用注解
注解分不同场景运用,运用在类名上,运用在办法上等。
运用在类名上的注解
注解 | 运用方位 | 阐明 |
---|---|---|
@RestController |
类名上 | 效果相当于 @ResponseBody 加 @Controller
|
@Controller |
类名上 | 声明此类是一个 SpringMVC Controller 目标 |
@Service |
类名上 | 声明一个业务处理类(实现非接口类) |
@Repository |
类名上 | 声明数据库拜访类(实现非接口类) |
@Component |
类名上 | 代表其是 Spring 管理类,常用在无法用 @Service 、@Repository 描绘的 Spring 管理类上,相当于通用的注释 |
@Configuration |
类名上 | 声明此类是一个装备类,常与 @Bean 合作运用 |
@Resource |
类名上 | 默许按 byName 主动注入 |
@Autowired |
类名上、特点或构造函数参数上 | 默许按 byType 主动注入 |
@RequestMapping |
类名或办法上 | 用在类上,则表明一切响应恳求的办法都是以该地址作为父途径的 |
@Transactional |
类名或办法上 | 用于处理业务 |
@Qualifier |
类名或特点上 | 为 Bean 指定称号,随后再通过称号引用 Bean
|
下面咱们一个个来解析:
@RestController
用于回来 JSON
、XML
等数据,可是不能回来 HTML
页面。相当于 @ResponseBody
和 @Controller
合在一起的效果。
JSON – JavaScript Object Notation, JS 目标符号; XML – eXtensible Markup Language;HTML – HyperText Markup Language
@RestController
public class Hello {
@RequestMapping("/jimmy")
public String sayHi() {
return "Hello, Jimmy.";
}
}
@Controller
用于标示控制器层,在 MVC
开发形式中代表 C
(控制器)。
上面 @RestController
的比方,等价于下面的写法:
@Controller
public class Hello {
@RequestMapping("/jimmy")
@ResponseBody
public String sayHi() {
return "Hello, jimmy";
}
}
@Service
用于声明一个业务处理类(实现非接口类),用于标示服务层,处理业务逻辑。
@Service
public class ArticleServiceImpl implements ArticleService {
@Autowired
private ArticleRepository articleRepository;
@Override
public Article findArticleById(long id) {
return articleRepository.findById(id);
}
}
@Repository
用于标示数据拜访层。
@Repository
public class UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
public User getUserById(long id) {
String sql = "SELECT * FROM users WHERE is = ?";
return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class));
}
}
@Component
@Component
是一个通用的注释,用于标识一个类是一个组件。运用 @Component
注释的类会被结构主动扫描,并创建为一个 Bean
,能够在应用程序的其他部分进行注入和运用。
@Component
public class EmailService {
public void sendEmail(String recipient, String message) {
// Send email logic
}
}
@Compoent
没有特定的业务意义。假如在应用程序中有更详细的组件类型,如数据拜访组件(@Repository
),服务组件(@Service
),控制器组件(@Controller
)等,推荐运用愈加详细的注释以更好表达其用处和语义。
@Resource
用来符号和注入依靠。它能够用于注入其他 Spring
管理的 Bean
、JNDI
资源、以及其他的依靠项。
@Service
public class UserService {
@Resource
private UserRepository userRepository;
}
@Configuration
用于标识一个类是装备类。装备类在应用程序中扮演着重要的角色,用于界说和组织应用程序的一些装备。它作为 Bean
的载体。
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
// create and setting datasource object
DataSource dataSource = new DataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("username");
dataSource.setPassword("password");
return dataSource;
}
}
@Autowired
表明被润饰的类需求注入目标。Spring
会扫描一切被 @Autowired
标示的类,然后根据类型在 loC
容器中找到匹配的类进行注入。被 @Autowired
注释后的类不需求再导入文件。
比方见
@Repository
@Resource
和@Autowired
都能够用来安装Bean
@RequestMapping
用来处理恳求地址映射,用在类或许办法上。假如用在类上,则表明类中的一切响应恳求的办法都是以该途径作为父途径的。
比方见
@RestController
其有六个特点:
-
Params: 指定
Request
中有必要包括某些参数值,才让该办法处理 -
Headers: 指定
Request
中有必要包括某些指定的header
值,才能让该办法处理恳求 -
Value: 指定恳求的实践地址,指定的地址能够是
URI Template
形式 -
Method: 指定恳求的
method
类型,如GET
,POST
,PUT
,DELETE
等 -
Consumes: 指定处理恳求的提交内容类型
Content-Type
,比方"application/json, text/html"
-
Produces: 指定回来的内容类型。只有当
Request
恳求头中的Accept
类型包括该指定类型时才回来
@Transactional
能够将一个办法或许类符号为业务性操作。
@Service
@Transactional
public class UserService {
@Autowired
private UserRepository userRepository;
public void updateUser(User user) {
// update user information
userRepository.save(user);
}
}
慎用,假如业务履行进程中报错,则需求运用
try{ } catch{ throw Exception }
捕获
@Qualifier
用于标示哪一个实现类才需求注入的。
@Qualifier
常和 @Autowored
一起运用:
@Component
public class PaymentService {
@Autowired
@Qualifier("paypalPaymentProcessor")
private PaymentProcessor paymentprocessor;
}
运用在办法上的注释
常用的比方:
注释 | 运用方位 | 阐明 |
---|---|---|
@RequestBody |
办法参数前 | 常用来处理 application 、application/xml 等 Content-Type 类型的数据,意味着 HTTP 消息是 JSON/XML 格局,需将其转换为制定类型参数 |
@PathVariable |
办法参数前 | 将 URL 获取的参数映射到办法参数上 |
@Bean |
办法上 | 声明该办法的回来结果是一个由 Spring 容器管理的 Bean
|
@ResponseBody |
办法上 | 通过恰当的 HttpMessageConverter 将控制器中办法回来的目标转换为指定格局 (JSON/XML) 后,写入 Response 目标的 body 数据区 |
@RequestBody
@RestController
@RequestMapping("/api")
public class UserController {
@PostMapping("/user")
public ResponseEntity<String> addUser(@RequestBody MyData myData) {
// handle data
return ResponseEntity.ok("Data received");
}
}
@PathVariable
用于获取参数中的途径。
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/users/{id}")
public ResponseEntity<String> getUserById(@PathVariable("id") Long userId) {
// ger user information by id
return ResponseEntity.ok("User Information");
}
}
留意:
-
@PathVariable
注解的参数称号有必要与URL
途径参数的称号相匹配。 - 假如参数称号与途径参数相同,则能够省略
@PathVariable
中的参数称号。
@Bean
用于封装数据,一般有 Setter
、Getter
办法。在 MVC
形式中对应的是 M(模型)
。
@Configuration
public class AppConfig {
@Bean
public Foo foo() {
return new Foo(bar())
}
}
@ResponseBody
运用该注解后,数据直接写入输入流中,不需求进行视图烘托。
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String sayHi() {
return "Hello, Jimmy.";
}
}
其他注解
比方:
标题 | 运用方位 | 阐明 |
---|---|---|
@EnableAutoConfiguration |
进口类/类名上 | 用来供给主动装备 |
@SpringBootApplication |
进口类/类名上 | 用来启动进口类 Application
|
@EnableScheduling |
进口类/类名上 | 用来敞开计划任务 |
@EnableAsync |
进口类/类名上 | 用来敞开异步注解功用 |
@ComponentScan |
进口类/类名上 | 用来扫描组件,可主动发现和安装一些 Bean 。 |
@Value |
特点上 | 用来获取装备文件中的值 |
参考
- 《Spring Boot 实战派》