关于Java注解

注解定义

  1. 标记注解 - 没有元素
@interface Marker {
}
  1. 单元素注解 - 只有一个元素
@interface Single {
String value() default "name";
}
  1. 普通注解 - 除了上面两种
@interface Normal {
String id();
String name();
} @interface NormalWithValue {
String id() default "id";
String value();
}

注解使用

1. 标记注解 由 @Marker() 可以简化为 @Marker
2. 按照约定,单元素注解的名称定义为 value ,这样 Single(value="123") 可以简化为 @Single("123")
3. 对于普通注解,必须给出注解中名称以及对应的值,当然有默认值的除外,如果普通注解含有 value 名称,并且其他名称都有默认值,也可以简化为 @Normal("123")

实例如下:

@Marker
@Single("123")
@Normal(id = "123", name = "123")
@NormalWithValue("123")
class AnnotationMain {
}

Annotation Types

Annotations

Spring 中的注解

  1. 元注解(Meta-Annotations)
在另一个注解上声明的注解,所以说任何一个注解都可以成为元注解

在下面这个例子中,@Target、@Retention、@Documented、@Indexed都是元注解
如果@Component又跑到别的注解头上了,那它也是元注解 @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
}
  1. 角色注解(Stereotype Annotations)
代表着一种固有的形象
比如@Component代表组件,@Repository代表DAO,@service代表服务等等
  1. 组合注解(Composed Annotations)
将一个或多个注解注解到一个注解上
在Spring中,注解上的任何一个注解都是可以被感知到的,就代表这个注解拥有了上述几个注解的所有功能 在下面这个例子中,@EnableAutoConfiguration组合了@AutoConfigurationPackage和@Import
使用@EnableAutoConfiguration的类会被Spring认为@EnableAutoConfiguration和@AutoConfigurationPackage也是存在的
因此@EnableAutoConfiguration就具备了@AutoConfigurationPackage的功能以及@Import的功能
这个实现好像是通过缓存实现的,具体也不太了解,有大佬知道的可以在评论里告知一下~ @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

Spring-Annotation-Programming-Model

MergedAnnotation-API-internals

Spring中的 @Autowired,一个自动注入的注解

  1. 可以在构造函数中注入
@Service
@Getter
public class MyService1 {
private MyDao1 myDao1; @Autowired
public MyService1(MyDao1 myDao1) {
this.myDao1 = myDao1;
}
}
  1. 可以在方法中注入
Spring 会自动自动执行方法,并把myDao注入住到方法参数里面

@Getter
public class MyService2 {
private MyDao1 myDao1;
private MyDao2 myDao2; @Autowired
public void setMyDao1(MyDao1 myDao1) {
this.myDao1 = myDao1;
} @Autowired
public void fun(MyDao2 myDao2) {
this.myDao2 = myDao2;
}
}
  1. 也可以在属性上注入
@Getter
public class MyService3 {
@Autowired
private MyDao1 myDao1;
}
  1. 也可以混合注入
@Getter
public class MyService4 {
@Autowired
private MyDao1 myDao1;
private MyDao2 myDao2;
private MyDao3 myDao3; @Autowired
public void fun(MyDao2 myDao2) {
this.myDao2 = myDao2;
} @Autowired
public MyService4(MyDao3 myDao3) {
this.myDao3 = myDao3;
}
}
  1. 其他注意的地方
  • 使用@Autowired时,容器里必须要存在这个类型的实例的,如果没有就会报错,如果不是必须要注入此类,可以将required设置为false,默认为true
@Getter
public class MyService5 {
private MyDao1 myDao1; @Autowired(required = false)
public MyService5(MyDao1 myDao1) {
this.myDao1 = myDao1;
}
}
  • 如果在多个构造函数上使用@Autowired,则所有的@Autowired必须将required设置为false,将会选一个参数较多的构造函数进行注入
@Getter
public class MyService6 {
private MyDao1 myDao1;
private MyDao2 myDao2; @Autowired(required = false)
public MyService6() {
} @Autowired(required = false)
public MyService6(MyDao1 myDao1) {
this.myDao1 = myDao1;
} @Autowired(required = false)
public MyService6(MyDao2 myDao2) {
this.myDao2 = myDao2;
}
}
  • 如果只有一个构造函数,不用加@Autowired也会自动注入,下面的例子中的所有属性将会注入
@Getter
public class MyService6 {
private MyDao1 myDao1;
private MyDao2 myDao2; public MyService6(MyDao1 myDao1, MyDao2 myDao2) {
this.myDao1 = myDao1;
this.myDao2 = myDao2;
}
}

beans-autowired-annotation

使用Java编程获取Spring bean

  • @Bean 用于标记一个bean 定义
  • @Configuration 里面有很多 @Bean 标记的方法
public class MyDao {
} @Getter
@AllArgsConstructor
@NoArgsConstructor
public class MyService {
private MyDao myDao;
} @Configuration
public class AppConfig { @Bean
public MyService myService(MyDao myDao) {
return new MyService(myDao);
} @Bean
public MyDao myDao() {
return new MyDao();
}
} public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = applicationContext.getBean(MyService.class);
MyDao myDao = applicationContext.getBean(MyDao.class);
System.out.println(myService.getMyDao() == myDao);
}
}
输出:
true
说明 myService不为null,myDao不为null,myDao已经被注入到myService中

@Autowired 引发的一系列思考的更多相关文章

  1. 由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考

    背景   我们使用的HiveServer2的版本为0.13.1-cdh5.3.2,目前的任务使用Hive SQL构建,分为两种类型:手动任务(临时分析需求).调度任务(常规分析需求),两者均通过我们的 ...

  2. 一个detect问题引发的一系列思考

    在用BoneCP的时候,发现一个JVM日志中报了一个异常,大意是“探测(detect)到有数据库链接没有关闭”(不得不说JVM的强大),但是我用的是连接池里面的链接啊,怎么会需要关闭呢? 有问题首先找 ...

  3. iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. 在centos服务器上配置gitlab钩子引发的一系列问题

    为了给公司的服务器上搭建gitlab环境并且配置钩子(实现在本地git push之后服务器自动git pull),整了好久,最后终于把问题解决了,下面是记录安装gitlab之后引发的一系列问题: 首先 ...

  5. Feign 400错误引发的一系列问题

    Feign 400错误引发的一系列问题 问题介绍 在使用Feign进行远程调用的时候出现非常奇怪的400错误,错误信息大概如下: feign.FeignException: status 400 re ...

  6. CSS画三角形引发的一些思考

      今天刷知乎时看到了一个问题,有谁能详细讲一下css如何画出一个三角形?怎么想都想不懂? - 知乎.很巧,刚入前端坑的我前不久也遇到过这个问题,今天再来谈一谈这个问题则是因为知乎的一些答案引发了我的 ...

  7. long和BigDecimal引发的管理思考

    关于long.double.BigDecimal在效率.可用性.灵活性等等方面的技术性讨论和测试其实在网上已经很多了,本文也不是打算讨论他们的实现的,其实笔者也曾在很长的职业生涯周期中一度拘泥于此.但 ...

  8. display:inline-block引发的间隙思考

    一.导火线 没错,总有一类属性在助你轻松寻得捷径的同时,也可为你增添烦劳,比如本文的主谋display:inline-block.众前端们所诸知,其作用是将对象呈递为内联对象,但是对象的内容作为块对象 ...

  9. 记一次全站升级https引发的一系列问题

    中秋假期,闲来无事.花了一下午折腾了下https,说实话这年头还有网站不上https显然是折腾精神不够啊~ 1.SSL证书评估 看了市面上各种类型的证书,有收费的也有免费的,但是最终还是选择了腾讯云提 ...

随机推荐

  1. 使用vw进行移动端适配(nuxt项目)

    基于nuxt 2.0.0 一.安装postcss-px-to-viewport npm安装 npm install postcss-px-to-viewport --save-dev 或 yarn安装 ...

  2. MongoDB知识点总结

    一:MongoDB 概述    一.NoSQL 简介 1. 概念:NoSQL(Not Only SQL的缩写),指的是非关系型数据库,是对不同于传统的关系型数据库的数据库管理系统的统称.用于超大规模数 ...

  3. 2020阿里最新出品的泰山版Java开发手册,告别垃圾代码

    说起华山,我就想起岳不群,不,令狐冲:说起泰山,我就想起司马迁,他的那句名言"人总有一死,或重于泰山,或轻于鸿毛",真的发人深省啊.这就意味着,阿里出品的泰山版 Java 开发手册 ...

  4. 了解JSON Web令牌(JWT)

    JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. (一) 跨域身份验证 Internet服务无法与用户身份验证分开. 用户向服务器发送用户名和密码. 验证服务器后,相关数据( ...

  5. python常用模块-os

    得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删除多个目录 ...

  6. spark源码解析大全

      第1章 Spark 整体概述 1.1 整体概念   Apache Spark 是一个开源的通用集群计算系统,它提供了 High-level 编程 API,支持 Scala.Java 和 Pytho ...

  7. mysql字符串类型(char,varchar)

    原文链接:https://blog.csdn.net/puqutogether/article/details/45648879 MySQL中的字符串有两个常用的类型:char和varchar,二者各 ...

  8. Pikachu的暴力破解演示-----基于表单的暴力破解

    1 首先打开XAMMP与burpsuite 2 打开游览器输入127.0.0.1:88进入pikachu,(由于我的端口有80改成88所以输入127.0.0.1:88要是没有更改80只需要输入127. ...

  9. .Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

    前言 上一篇[.Net Core微服务入门全纪录(四)--Ocelot-API网关(上)]已经完成了Ocelot网关的基本搭建,实现了服务入口的统一.当然,这只是API网关的一个最基本功能,它的进阶功 ...

  10. 团队Github实践训练

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 团队名称 WeChair 这个作业要求在哪里 团队Github实践训练 这个作业的目标 通过github实现团队协作编码 作业正 ...