注解的定义
Annotation(注解),用于为Java代码提供元数据。简单理解注解可以看做是一个个标签,用来标记代码。是一种应用于类、方法、参数、变量、构造器及包的一种特殊修饰符。
1.@Target
表示该注解类型所使用的程序元素类型,结合ElementType.XXX来使用。
2.Override
用于告知编译器,我们需要覆写超类的当前方法
3.@Deprecated
使用这个注解,用于告知编译器,某一程序元素(比如方法,成员变量)不建议使用了(即过时了)。
4.@Component
把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
5.@Autowired
这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。
6.@MapperScan
扫描mapper类包的路径,还可以扫描多个包。
7.@Id
标注用于声明一个实体类的属性映射为数据库的主键列该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。 @Id标注也可置于属性的getter方法之前。
8.@Bean
注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。它是一个方法级别上的注解,主要用在@Configuration注解的类里
9.@Configuration
这个注解类标识这个类可以使用Spring IOC容器作为bean定义的来源。
10.@EnableAutoConfiguration
能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。
11.@ComponentScan
会自动扫描指定包下的全部标有@Component的类,并注册成bean
12.@SpringBootApplication
来标注这是一个springboot的应用,被标注的类是一个主程序
这个注解相当于@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的结合
实例:
@SpringBootApplication
public class App{
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
13.@RunWith
是一个运行器
14.@RunWith(JUnit4.class)
是指用JUnit4来运行
15.@RunWith(SpringJUnit4ClassRunner.class)
让测试运行于Spring测试环境
16.@RunWith(Suite.class)
是一套测试集合
17.@SpringBootTest
进行单元测试
18.@GeneratedValue
存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键),@GeneratedValue提供了主键的生成策略。@GeneratedValue注解有两个属性,分别是strategy和generator,其中generator属性的值是一个字符串,默认为"",其声明了主键生成器的名称(对应于同名的主键生成器@SequenceGenerator和@TableGenerator)。
19.@Service
加上这一行以后,将自动扫描路径下面的包,如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了
20.@Controller
被@Controller标记的类实际上就是个SpringMVC Controller对象,它是一个控制器类,而@Contoller注解在org.springframework.stereotype包下。其中被@RequestMapping标记的方法会被分发处理器扫描识别,将不同的请求分发到对应的接口上。
实例:
@Controller
public class TestController {
private static final Log logger = LogFactory.getLog(TestController.class);
@RequestMapping(value = "/hello")
public ModelAndView hello () {
logger.info("hello() 方法被调用");
ModelAndView mv = new ModelAndView();
mv.addObject("message", "Hello, Ma Yuzhe!");
mv.setViewName("/WEB-INF/views/hello.jsp");
return mv;
}
}
TestController即为一个自定类。在该类的前面标记@Controller,该类就成了一个控制器类。
在浏览器地址栏中输入http://localhost:8080/hello,即对hello()方法进行调用,前台返回hello.jsp界面
21.@RequestMapping
开发者需要在控制器内部为每一个请求动作开发相应的处理方法。org.springframework.web.bind.annotation.RequestMapping 注解类型指示Spring用哪一个类或方法处理请求动作,该注解可用于类和方法。
@RequestMapping可以用来注释一个控制器类,在这种情况下,所有方法都将映射为相对于类级别的请求,表示该控制器处理的所有请求都被映射到value属性所指示的路径下。示例代码如下:
实例:
@Controller
@RequestMapping(value="/user")
public class UserController{
@RequestMapping(value="/register")
public String register(){
return "register";
}
@RequestMapping(value="/login")
public String login(){
return "login";
}
22.@ResponseBody
@ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
实例:
@RequestMapping("/login")
@ResponseBody
public User login(User user){
return user;
}
//User字段:userName pwd
//那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'
//效果等同于如下代码:
@RequestMapping("/login")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
23.@Repository
实现dao访问,用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
24.@RestController
Spring4之后新加入的注解,原来返回json需要@ResponseBody和@Controller配合。
即@RestController是@ResponseBody和@Controller的组合注解。
实例:
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
与下面的代码作用一样
@Controller
@ResponseBody
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
25.@RequestMapping
此注解可以作用在控制器的某个方法上,也可以作用在此控制器类上。当控制器在类级别上添加@RequestMapping注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的@RequestMapping注解会对类级别上的@RequestMapping的声明进行补充。
实例:
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("{id}")
@HystrixCommand(fallbackMethod = "queryByIdFallback")
public String queryById(@PathVariable("id") Long id) {
String url = "http://user-service/user/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
public String queryByIdFallback(Long id) {
return "服务器忙!";
}
}
26.@GetMapping与 @PostMapping
都是是一个组合注解,都是@RequestMapping(method = RequestMethod.GET)的缩写。
27.@EnableEurekaServer
启动EurekaServer
28.@EnableDiscoveryClient与@EnableEurekaClient
开启客户端
@EnableDiscoveryClient注解是基于spring-cloud-commons依赖,并且在classpath中实现;
@EnableEurekaClient注解是基于spring-cloud-netflix`依赖,只能为eureka作用;
如果你的classpath中添加了eureka,则它们的作用是一样的。
29.@LoadBalanced
在使用springcloud ribbon客户端负载均衡的时候,可以给RestTemplate bean 加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载均衡的能力
实例:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
// 这次我们使用了OkHttp客户端,只需要注入工厂即可
return new RestTemplate();
}
30.@EnableCircuitBreaker
启动断路器
方法RestTemplate restTemplate():初始化RestTemplate 对象,并使用 @LoadBalanced作负载均衡
实例:
@SpringBootApplication
@EnableCircuitBreaker
@EnableEurekaClient // 配置本应用将使用服务注册和服务发现
public class HystrixSimpleCloudConsumerApplication {
public static void main(String[] args) {
args = new String[1];
args[0] = "--spring.profiles.active=hystrix-simple";
SpringApplication.run(HystrixSimpleCloudConsumerApplication.class, args);
}
/**
* 初始RestTemplate
* @return
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
/**
* 使用fastjson做为json的解析器
* @return
*/
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastConverter;
return new HttpMessageConverters(converter);
}
}
31.@EnableHystrix
启动熔断降级服务
32.@SpringCloudApplication
因为一个标准的Eureka服务,一般都需要@EnableDiscoveryClient、@SpringBootApplication以及@EnableCircuitBreaker三个注解,所以Spring官方提供了这个注解
实例:
@SpringCloudApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
// 这次我们使用了OkHttp客户端,只需要注入工厂即可
return new RestTemplate();
}
}
33.@HystrixCommand
在hiService方法上加上@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法,熔断方法直接返回了一个字符串,字符串为"hi,"+name+",sorry,error!",代码如下:
实例:
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "hiError")
public String hiService(String name) {
return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
}
public String hiError(String name) {
return "hi,"+name+",sorry,error!";
}
}
34.@DefaultProperties
读取properties文件
如果每一个方法都提供一个熔断处理方法,那么会显的类特别的臃肿,所以我们可以提供一个通用的处理方式,也就是在类上面添加一个注解@DefaultProperties
实例:
@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "defaultFallback")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("{id}")
@HystrixCommand//开启启用
public String queryById(@PathVariable("id") Long id) {
String url = "http://user-service/user/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
public String defaultFallback() {
return "抱歉,服务器hin忙!";
}
}
35.@HystrixProperty
设置熔断等级
实例:
@GetMapping("{id}")
@HystrixCommand(
commandProperties = {
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")
})
public String queryById(@PathVariable("id") Long id) {
if(id % 2 == 0) {
throw new RuntimeException("");
}
String url = "http://user-service/user/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
36.@FeignClient
指明要访问的服务名称
37.@EnableFeignClient
在启动类上,添加注解,开启Feign功能
实例:
@SpringCloudApplication
@EnableFeignClients//开启feign
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
/* 如果前面有测试注意不会受影响
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
// 这次我们使用了OkHttp客户端,只需要注入工厂即可
return new RestTemplate();
}*/
}
38.@EnableZuulProxy
通过@EnableZuulProxy注解开启Zuul的功能
实例:
@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
39.@EnableFurekaServer
在顶目启动类上使用@EnableEurekaServer,可以将项目作为SpringCloud中的注册中心
40.@EnableDiscoveryClient、 @EnableEurekaClient
在启动类上面添加 @EnableDiscoveryClient、 @EnableEurekaclient 这二个注解作用,都可以让该服务注册到注册中心上去。
@EnableEurekaClient 只支持Eureka注册中心,@EnableDiscoveryClient 支持Eureka、 Zookeeper、Consul 这二个注册中心