IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring注解 -> 正文阅读

[Java知识库]Spring注解

一、Spring bean注解

1、@SpringBootApplication

让spring boot自动给程序进行必要的配置,这个配置等同于:@configuration,@EnableAutoConfiguration和@ComponentScan三个配置。

2、@Component

泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller,@service等的时候),我们就可以使用@Component来标注这个类,把普通pojo实例化到容器中,相当于配置文件中的:。

3、@ComponentScan

@ComponentScan主要就是定义扫描的路径从中找出标识了需要装备的类自动装配到spring的bean容器中。前面说到过@Controller注解,@Service,@Repository注解,它们其实都是组件,属于@Component注解,而@ComponentScan注解默认会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。

  // 扫描com.demo下的组件
  @ComponentScan(value="com.demo")
  @Configuration
  public class myConfig{
  }

4、@Service

一般用于修饰service层的组件

5、@EnableAutoConfiguration

SpringBoot自动配置(auto-configuration):尝试根据你添加的jar依赖自动配置你的Spring应用。

6、@Resource、@Autowired

@Resource和@Autowired都是做bean注入时使用。两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
@Autowired:注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
@Resource:默认按照名称(byName)自动注入。@Resource有两个重要的属性:nume和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

7、@Repository

用于注解dao层,在daoImpl类上面注解。

8、@Bean

产生一个Bean对象,然后这个Bean对象交给Spring管理。用@Bean标注方法等于XML中配置的bean。
产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个bean对象放在自己的IOC容器中。SpringIOC容器管理一个或者多个bean,这些bean都需要在@Configuration注解下进行创建,在一个方法上使用@Bean注解就表明这个方法交给Spring进行管理。

9、@Value

@Value的作用是通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值。
(1)普通注入
(2)bean属性、系统属性、表达式注入,使用@Value(“#{}”)。bean属性注入需要注入者和被注入者属于同一个IOC容器,或者父子IOC容器关系,在同一个作用域内。
(3)配置文件属性注入@Value(“${}”)读取配置文件中的值,注入到变量中去。配置文件分为默认配置文件application.properties和自定义配置文件。

二、切面(AOP)相关注解

在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程,简称AOP(aspect object programming)。AOP编程,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。这些系统性的编程工作都可以独立编码实现,然后通过AOP技术切入进系统即可。从而达到了 将不同的关注点分离出来的效果。
aop技术的功能是让关注点与业务逻辑代码进行分离;而重复的代码就是关注点;关注点形成的类,就是切面(类)
Spring支持AspectJ的注解式aop编程,需要在java的配置类中使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持。下面介绍下aop编程的相关注解。

1、@EnableAspectJAutoProxy

先说说@EnableAspectJAutoProxy注解,看看它的源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
    /**
     * Indicate whether subclass-based (CGLIB) proxies are to be created as opposed
     * to standard Java interface-based proxies. The default is {@code false}.
     */
    boolean proxyTargetClass() default false;
    /**
     * Indicate that the proxy should be exposed by the AOP framework as a {@code ThreadLocal}
     * for retrieval via the {@link org.springframework.aop.framework.AopContext} class.
     * Off by default, i.e. no guarantees that {@code AopContext} access will work.
     * @since 4.3.1
     */
    boolean exposeProxy() default false;
}

这里有两个方法,一个是控制aop的具体实现方式,为true 的话使用cglib,为false的话使用java的Proxy,默认为false,第二个参数控制代理的暴露方式,解决内部调用不能使用代理的场景,默认为false。

2、@Aspect

声明一个切面(类)上,作用是把当前类标识为一个切面供容器读取。在切面类中需要定义切面方法用于响应响应的目标方法,切面方法即为通知方法,通知方法需要用注解标识,AspectJ 支持 5 种类型的通知注解:
2.1、@Before:前置通知, 在方法执行之前执行。
2.2、@After:后置通知, 在方法执行之后执行。
2.3、@AfterRunning:返回通知, 在方法返回结果之后执行。
2.4、@AfterThrowing:异常通知, 在方法抛出异常之后。
2.5、@Around:环绕通知, 围绕着方法执行。

3、@PointCut

声明切点,是植入Advice(通知)的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。

/**
 * 日志切面
 */
@Component
@Aspect
public class LoggingAspect {
    /**
     * 前置通知:目标方法执行之前执行以下方法体的内容
     */
    @Before("execution(* com.qcc.beans.aop.*.*(..))")
    public void beforeMethod(JoinPoint jp){
        String methodName = jp.getSignature().getName();
        System.out.println("【前置通知】the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
    }
    /**
     * 返回通知:目标方法正常执行完毕时执行以下代码
     */
    @AfterReturning(value="execution(* com.qcc.beans.aop.*.*(..))",returning="result")
    public void afterReturningMethod(JoinPoint jp, Object result){
        String methodName = jp.getSignature().getName();
        System.out.println("【返回通知】the method 【" + methodName + "】 ends with 【" + result + "】");
    }
    /**
     * 后置通知:目标方法执行之后执行以下方法体的内容,不管是否发生异常。
     * @param jp
     */
    @After("execution(* com.qcc.beans.aop.*.*(..))")
    public void afterMethod(JoinPoint jp){
        System.out.println("【后置通知】this is a afterMethod advice...");
    }
    /**
     * 异常通知:目标方法发生异常的时候执行以下代码
     */
    @AfterThrowing(value="execution(* com.qcc.beans.aop.*.*(..))",throwing="e")
    public void afterThorwingMethod(JoinPoint jp, NullPointerException e){
        String methodName = jp.getSignature().getName();
        System.out.println("【异常通知】the method 【" + methodName + "】 occurs exception: " + e);
    }
}

三、全局异常处理

1、@ControllerAdvice

包含@Component。可以被扫描到。统一处理异常。

2、@ExceptionHandler(Exception.class)

用在方法上面表示遇到这个异常就执行以下方法。
如何使用呢?举个例子。如果方法参数不对的话就会抛出MethodArgumentNotValidException,我们来处理这个异常。

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
?
    /**
     * 请求参数异常处理
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, HttpServletRequest request) {
       ......
    }
}

四、SpringMVC相关注解

1、@RestController

Spring4,注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。

2、@Controller

在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。
用于定义控制器类,在spring 项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping。

3、@RequestMapping

提供路由信息,是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性,下面我们把她分成三类进行说明(下面有相应示例)。
1、 value, method;
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
2、consumes,produces;
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、params,headers
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

@RestController
@RequestMapping("/home")
public class IndexController {
    /**
    * 将多个请求映射到一个方法上去
    */
    @RequestMapping(value = {
        “”,/page”,
        "page*,
        "view/*,**/msg"
    })
    String indexMultipleMapping() {
        return "Hello from index multiple mapping.;
    }
    /**
    * 是否是必须传参
    * /home/name?person=xyz 或 /home/name
    */
    @RequestMapping(value =/name”)
    String getName(@RequestParam(value = "person”, required = false) String personName) {
        return "Required element of request param”;
    }
    /**
    * 请求类型,请求参数,默认值
    */
    @RequestMapping(value = "/name", method = RequestMethod.GET)
    String getName(@RequestParam(value = "person", defaultValue = "John") String personName) {
        return "Required element of request param";
    }
    /**
    * 产生一个 JSON 响应
    */
    @RequestMapping(value = "/prod", produces = {
        "application/JSON"
    })
    @ResponseBody
    String getProduces() {
        return "Produces attribute";
    }
    /**
    * 可以同时处理请求中的 JSON 和 XML 内容
    */
    @RequestMapping(value = "/cons", consumes = {
        "application/JSON",
        "application/XML"
    })
    String getConsumes() {
        return "Consumes attribute";
    }
    /**
    * 根据请求中的消息头内容缩小请求映射的范围
    */
    @RequestMapping(value =/head”, headers = {
        "content-type=text/plain”,
        "content-type=text/html"
    })
    String post() {
        return "Mapping applied along with headers;
    }
    /**
    * 可以让多个处理方法处理到同一个URL 的请求, 而这些请求的参数是不一样的
    */
    @RequestMapping(value =/fetch”, params = {
        "personId=10"
    })
    String getParams(@RequestParam(“personId”) String id) {
        return "Fetched parameter using params attribute = " + id;
    }
    /**
    * 使用正则表达式来只处理可以匹配到正则表达式的动态 URI
    */
    @RequestMapping(value =/fetch/{id:[a-z]+}/{name}, method = RequestMethod.GET)
    String getDynamicUriValueRegex(@PathVariable(“name”) String name) {
        System.out.println(Name is " + name);
        return "Dynamic URI parameter fetched using regex”;
    }
    /**
    * 向 /home 发起的一个请求将会由 default() 来处理,因为注解并没有指定任何值
    */
    @RequestMapping()
    String
    default () {
        return "This is a default method for the class;
    }
}

4、@GetMapping

@GetMapping(“users”)等价于@RequestMapping(value="/users",method=RequestMethod.GET)

5、@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

6、@ResponseBody

Spring4后出现的注解。
作用: 该注解用于将Controller的方法返回的对象,用于构建RESTful的api,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用。

7、@CrossOrigin

@CrossOrigin注解将为请求处理类或请求处理方法提供跨域调用支持。如果我们将此注解标注类,那么类中的所有方法都将获得支持跨域的能力。使用此注解的好处是可以微调跨域行为。

五、SpringCloud注解

1、@EnableEurekaServer

用在springboot启动类上,表示这是一个eureka服务注册中心;

2、@EnableDiscoveryClient

用在springboot启动类上,表示这是一个服务,可以被注册中心找到;

3、@LoadBalanced

开启负载均衡能力;

4、@EnableCircuitBreaker

用在启动类上,开启断路器功能;

5、@HystrixCommand(fallbackMethod=”backMethod”)

用在方法上,fallbackMethod指定断路回调方法;

6、@EnableConfigServer

用在启动类上,表示这是一个配置中心,开启Config Server;

7、@EnableZuulProxy

开启zuul路由,用在启动类上;

8、@SpringCloudApplication:

@SpringBootApplication,@EnableDiscovertyClient,@EnableCircuitBreaker
分别是SpringBoot注解、注册服务中心Eureka注解、断路器注解。对于SpringCloud来说,这是每一微服务必须应有的三个注解,所以才推出了@SpringCloudApplication这一注解集合。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:26:52  更:2022-01-25 10:28:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:03:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码