java 注解篇

35 阅读7分钟

JAVA QQ技术群(984253785)

  1. 什么是注解

// 注解是代码标记 格式 @注解名称(属性名称=属性值,属性名称=属性值,…)

// 注解 可以在类 方法 属性上 都可以加注解

// 注解的目的: 简化xml配置

// @Component (把普通实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>)
// @Service   // 一般用在 实现层
// @Controller  // 一般用在控制层  //把当前类 注入到 spring 管理
// @Repository  // 用在 DAO层
// 以上注解 都可以用来创建bean 实例 功能是一样的

//@ResponseBody // 代表这个类下面所有的返回值 都是 直接写给浏览器的 不是跳转到某个页面

@RestController //这个注解就是 @Controller 和@ResponseBody 两个注解的合体应用

    // @Autowired  根据属性类型进行自动注入  只针对 对象
    
    // @Qualifier  根据属性名称进行注入 只针对 对象
    // @Qualifier 注解使用 和 @Autowired 一起使用
    // 当 一个接口有多个实现类时 就需要需要使用这个注解 指定 你要使用的 哪个类
    // @Qualifier(value = "userDaoImpl1111")  value 指定的类名


    // @Resource   可以根据类型注入 也可以根据名称注入 只针对 对象
    //  他属于 javax 里的注解 不属于 spring里的注解 所以一般不建议使用

    // @Value 注入普通类型属性

@Configuration //把当前类作为 配置类 替代xml配置文件

@ComponentScan(basePackages = {“com.spring.json.aopSpring”})

//@ComponentScan 代替得就是 xml配置文件中 开启组件扫描

// <context:component-scan base-package=“com.spring.json.aopSpring” ></context:component-scan>

//标签

@Aspect //生成代理对象 用于 aop

@EnableAspectJAutoProxy //开启 Aspect 生成代理对象

//代替的就是 aop:aspectj-autoproxy</aop:aspectj-autoproxy> 这个标签

//前置通知 value 可省略  用于 aop
@Before(value = "execution(* com.spring.json.aopSpring.User.add(..))")


//后置通知 或者(返回通知) 在返回值之后 执行 有异常不会通知
@AfterReturning("execution(* com.spring.json.aopSpring.User.add(..))")

//最终通知 有异常也会执行
@After("execution(* com.spring.json.aopSpring.User.add(..))")

//异常通知 如果这个通知执行了   Around 环绕之后 和 AfterReturning() 后置通知 不会执行
@AfterThrowing("execution(* com.spring.json.aopSpring.User.add(..))")

//环绕通知 在方法之前 和 方法之后都通知
@Around("execution(* com.spring.json.aopSpring.User.add(..))")

//相同切入点 抽取  可以把相同切入点 提取出来 封装 一下
@Pointcut(value = "execution(* com.spring.json.aopSpring.User.add(..))")

@order(数字类型值)  有多个增强类 对同一个方法进行增强 设置增强优先级  数字类型越小 优先级越高

@Transactional //事务注解 可以添加到类上面 也可以添加 到方法上面

    // 这个注解有相关参数
    //1. propagation  事务传播行为
    //  多事务调用方法的过程  叫做 事务传播行为
    //  通俗讲解 就是 一个加事务注解 调用没有事务注解的方法的过程
    // 事务有7中传播类型  以下 前两种 最常见
    //REQUIRED      add 方法有事务 调用 没有事务的update方法 update 使用的 add 事务
    //REQUIRES_NEW  add 方法调用update方法 如果add无论是否有事务 都会创建新的事务
    //2. isolation    事务隔离级别
    // 事务有特性位隔离性 多事务操作之间不会产生影响  不考虑隔离会产生很多问题
    // 有三个读得问题  脏读 、 不可重复读、 虚(幻)读  一般在并发情况下会出现
    // 通过设置事务得隔离级别 可以解决这三个问题
    // 脏读   一个未提交事务读取到另一提交事务修改得数据
    // 不可重复读  一个未提交得事务 读取到了一个提交过事务得数据 这是一种现象
    //  虚(幻)读  一个未提交事务读取到另一提交事务添加数据
    //                              脏读    不可重复读    虚(幻)读
    // read uncommitted(读未提交)    有        有            有
    // read committed(读已提交)      无        有            有
    // repeatable read(可重复读)     无        无            有    mysql 默认隔离级别
    // serializable(串行化)          无         无           无

    //3. timeout    超时时间 单位 秒  spring 默认 -1 永不超时
    // 事务要在一定得时间内进行提交 如果在一定时间内不提交 就会回滚
    //4. readOnly  是否只读  默认 false  如果为 true 只能读操作
    //5. rollbackFor  回滚
    // 设置出现哪些异常进行回滚
    //6. noRollbackFor  不回滚
    // 这只出现哪些异常进行不回滚

@Bean

// 表示 在 ioc 容器中进行创建对象

注解 @Bean是一个方法级别的注解,

主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名。

相当于xml配置文件

@Bean是将组件注册到Bean,让IOC容器知道这个组件存在。

Spring中@AutoWired和@Bean的区别

@AutoWired是组件和组件相互调用的时候,自动从ioc中取出来需要用的组件。比如Service,Controller,Dao的关系,这三个组件都分别加上了注册的注解:@Service,@Controller,@Component,ioc中已经有了注册信息,但是Service要用到Dao操作数据,所以在Service中的Dao头上就要用@Autowired来给Dao自动赋值,来供Service用,同理,Controller中也要用到Service,那么就要在Service上边加上@Autowired

@Component 和@Bean 区别

  1. 作用对象不同: @Component 注解作用于类,而@Bean注解作用于方法。

2.@Component通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。

@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了Spring这是某个类的示例,当我需要用它的时候还给我。

  1. @Bean 注解比 Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。

  2. 比如引入了第三方的 sdk 或者 依赖类 这时候 有些类 需要交给 spring 管理 就可以创建一个方法

  3. 方法里new 一个这样的类 然后在方法上打上 bean 注解 就可以交给 spring管理了

  4. 就比如 以下这个 创建数据库连接池的例子

  //创建数据库连接池
    //  注解 @Bean是一个方法级别的注解,
    //  主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名。
    // 表示  在 ioc 容器中进行创建对象
    @Bean
    public DruidDataSource getDruidDataSource(){
        DruidDataSource druidDataSource=new DruidDataSource();
        druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
        druidDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java_test");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("");
        return druidDataSource;
    }

//如果容器中存在某个组件(对象) 再去执行某个方法或者某个类

    @ConditionalOnBean(name = "tom")

//如果容器中不存在某个组件(对象) 再去执行某个方法或者某个类

    @ConditionalOnMissingBean(name = "tom")

当然 还有判断 类的 不存在某个类的 存在某个类 等等

这些 都属于 @Conditional 的子注解 用的适合可以详细百度

@ImportResource("classpath:beans.xml")// 导入一个 资源
前提时 这个类 必须交给 spring 管理
@ConfigurationProperties(prefix = "mycar")   //根据配置文件的前缀  
把配置文件 配置参数 赋值到 对象属性上
//1. 开启car 的配置绑定功能
//2. 把这个car这个组件自动注册到容器中
@EnableConfigurationProperties(Car.class)  // 应用场景 比如 你用的时第三方的包
 需要把配置信息注入到第三方里 就可以使用这种
@PathVariable("name") String name  //获取url路径中的值
@RequestHeader("Host") String host  //获取请求头里的值
@RequestParam("age") String age  //获取请求参数 
@CookieValue("_ga") String SFS    //获取cookie
@RequestBody           //获取请求体里的值

//矩阵变量

// url 里 已分号 分割的 参数 叫做 矩阵变量

// cars/path;low=3;brand=bay,auid,yd; 一个变量多个值 可以用逗号分隔

// 在页面开发中 cookie 被禁用了 session 里面内容怎么使用 ?

// 就可以使用 这种方式 获取 路径重写

// springboot 默认禁用了 矩阵变量 所以要开启

@MatrixVariable("low") Integer low    
@ControllerAdvice 用法
顾名思义,@ControllerAdvice就是@Controller 的增强版。@ControllerAdvice主要用来处理全局数据,一般搭配@ExceptionHandler@ModelAttribute以及@InitBinder使用。
@ControllerAdvice最常见的使用场景就是全局异常处理
@ExceptionHandler注解我们一般是用来自定义异常的。