文章目录
-
-
- @Bean
- @Configuration
- @EnableAutoConfiguration
- @ComponentScan
- @SpringBootApplication
- @RunWith
- @SpringBootTest
- @Autowired
- @MapperScan
- @Table
- @Data
- @Id
- @GeneratedValue
- @Service
- @Controller
- @RequestMapping
- @ResponseBody
- @Repository
- @Component
- @RestController
- @RequestMapping
- @GetMapping与 @PostMapping
- @EnableEurekaServer
- @EnableDiscoveryClient与@EnableEurekaClient
- @LoadBalanced
- @EnableCircuitBreaker
- @EnableHystrix
- @SpringCloudApplication
- @HystrixCommand
- @DefaultProperties
- @HystrixProperty
- @FeignClient
- @EnableFeignClient
- @EnableZuulProxy
-
@Bean
注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。它是一个方法级别上的注解,主要用在@Configuration注解的类里
@Configuration
这个注解类标识这个类可以使用Spring IOC容器作为bean定义的来源。下面是@Configuration里的一个例子
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
这个配置就等同于之前在xml里的配置
<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
@EnableAutoConfiguration
能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。
@ComponentScan
会自动扫描指定包下的全部标有@Component的类,并注册成bean
@SpringBootApplication
这个注解相当于@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的结合
@SpringBootApplication
@MapperScan(value = {"com.mapper"})
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
@RunWith
-
@RunWith就是一个运行器
-
@RunWith(JUnit4.class)就是指用JUnit4来运行
-
@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境
-
@RunWith(Suite.class)的话就是一套测试集合
@SpringBootTest
进行单元测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HttpDemoApplication.class)
public class HttpDemoApplicationTests {
@Autowired
private RestTemplate restTemplate;
@Test
public void httpGet() {
User user = this.restTemplate.getForObject("http://localhost/hello/1", User.class);
System.out.println(user);
}
}
@Autowired
这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。
<bean id="userDao" class="..."/>
<bean id="userService" class="...">
<property name="userDao">
<ref bean="userDao"/>
</property>
</bean>
这样你在userService里面要做一个userDao的setter/getter方法。但如果你用了@Autowired的话,你只需要在UserService的实现类中声明即可。
@MapperScan
要扫描mapper类包的路径,还可以扫描多个包。如:
@MapperScan({"com.kfit.demo","com.kfit.user"})
如果mapper类没有在Spring Boot主程序可以扫描的包或者子包下面,可以使用如下方式进行配置:
@MapperScan({"com.kfit..mapper","org.kfit..mapper"})
@Table
常用的两个属性:
声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe)
- name 用来命名 当前实体类 对应的数据库 表的名字
@Table(name = "tab_user")
- uniqueConstraints 用来批量命名唯一键
其作用等同于多个:@Column(unique = true)
@Table(name = "tab_user",uniqueConstraints = {@UniqueConstraint(columnNames={"uid","email"})})
@Data
利用了lombok插件为我们加上了
- 所有的属性的get和set方法
- toString方法
- hashCode方法与equals方法
@Id
@Id 标注用于声明一个实体类的属性映射为数据库的主键列该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。 @Id标注也可置于属性的getter方法之前。
@GeneratedValue
存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键),@GeneratedValue提供了主键的生成策略。@GeneratedValue注解有两个属性,分别是strategy和generator,其中generator属性的值是一个字符串,默认为"",其声明了主键生成器的名称(对应于同名的主键生成器@SequenceGenerator和@TableGenerator)。
@Table(name="user")
@Data
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String userName;//用户名
private String password;//密码
private String name;//姓名
private Date birthday;//生日
private int gender;//性别: 0女性,1男性
private Date created;//创建时间
private Date updated;//更新时间
}
@Service
加上这一行以后,将自动扫描路径下面的包,如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了
@Service("courseDAO")
@Scope("prototype")
public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{
......
}
其作用就相当于applicationContext.xml文件里面的:
<bean id="courseDAO"
class="com.hzhi.course.dao.CourseDAOImpl" scope="prototype">
......
</bean>
@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界面
@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";
}
}
@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());
}
@Repository
实现dao访问,用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
@Component
把普通pojo实例化到spring容器中,相当于配置文件中的
<bean id="" class=""/>
@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";
}
}
@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 "服务器忙!";
}
}
@GetMapping与 @PostMapping
都是是一个组合注解,都是@RequestMapping(method = RequestMethod.GET)的缩写。
@EnableEurekaServer
启动EurekaServer
@SpringBootApplication
@EnableEurekaServer
public class Server {
//...
}
@EnableDiscoveryClient与@EnableEurekaClient
开启客户端
- @EnableDiscoveryClient注解是基于spring-cloud-commons依赖,并且在classpath中实现;
- @EnableEurekaClient注解是基于spring-cloud-netflix`依赖,只能为eureka作用;
如果你的classpath中添加了eureka,则它们的作用是一样的。
@LoadBalanced
在使用springcloud ribbon客户端负载均衡的时候,可以给RestTemplate bean 加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载均衡的能力
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
// 这次我们使用了OkHttp客户端,只需要注入工厂即可
return new RestTemplate();
@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);
}
}
@EnableHystrix
启动熔断降级服务
@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();
}
}
@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!";
}
}
@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忙!";
}
}
@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;
}
@FeignClient
@FeignClient(value = “eureka-client”, configuration = FeignConfig.class)value——指明要访问的服务名称
@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();
}*/
}
@EnableZuulProxy
通过@EnableZuulProxy
注解开启Zuul的功能
@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}