关于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. apollo与springboot集成实现动态刷新配置

    分布式apollo简介 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性. 本 ...

  2. 如何快速的找到好玩的旅游景点信息?Python爬虫帮你轻松解决

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 喜欢的朋友欢迎关注小编 当我们出去旅游时,会看这个地方有哪些旅游景点,景点 ...

  3. iic uart spi

    第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口);     I2C(INTER IC BUS)     UART(Universal Asynch ...

  4. 如何在centos7安装dnf软件包

    想在自己的笔记本CentOS7上安装dnf玩玩儿,但是根据百度出来的方法没有成功. yum install epel-release -y yum install dnf 现在将解决办法转载过来,如下 ...

  5. [转] linux操作系统下c语言编程入门--基础知识

    点击阅读原文 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 1. 源程序编译        2. Makefile的编写        3. 程序库 ...

  6. 获取随机User-Agent的请求头

    ''' 获取随机User-Agent的请求头 ''' import random #用户代理User-Agent列表 USER_AGENTS = [ "Mozilla/5.0 (Macint ...

  7. Arduino控制超声波检测与0.96OLED及串口显示

    Arduino控制超声波检测与0.96OLED及串口显示代码使用库共享(包括超声波检测与U8glib): 使用元件: 0.96寸 12864 I2C OLED 128x64规格 超声波检测模块 湿度模 ...

  8. Android学习笔记Intent二

    上篇随笔大概写了了Intent学习的大纲,这篇通过代码理解下Intent的ComponentName属性的使用 ComponentName,中文意思是组件名称,通过Intent的setsetCompo ...

  9. tarjan算法求scc & 缩点

    前置知识 图的遍历(dfs) 强连通&强连通分量 对于有向图G中的任意两个顶点u和v存在u->v的一条路径,同时也存在v->u的路径,我们则称这两个顶点强连通.以此类推,强连通分量 ...

  10. opencv Scalar

    template<typename _Tp> class Scalar_ : public Vec<_Tp, 4> { public: //! various construc ...