关于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. idea 启动命令行的时候提示不能创建PTY

    问题描述: 昨天上午,凯哥还在好好的使用idea,中午的时候,360扫描,好像要升级还是要干嘛的,没细看,然后凯哥就点击确定.结果到下午使用idea的Terminal 命令行的时候提示,如下图错误: ...

  2. nginx下通过子路径配置多个vue单页应用的方法

    千辛万苦在Stack Overflow上找来的,记下吧. https://stackoverflow.com/q/31519505/13651734 我的需求是 首页:/ 项目a:/aaa 项目 b: ...

  3. 使用jdk1.8 stream特性对参数名称进行排序

    在对外对接的时候,通常会碰到签名方式, 然后签名的时候,要求按照参数名称进行排序. 比如参数为 c=22&a=1, 需要将结果排序为a=1&c=22, 然后再进行别的运算. 可以使用j ...

  4. CSS布局之Flex布局

    Flex布局,可以简便.完整.响应式地实现各种页面布局. 浏览器支持:得到所有浏览器的支持.(注:Flex布局将成为未来布局的首选方案)   一. Flex布局的概念 Flex是Flexible Bo ...

  5. Php7安装pdo_pgsql,pgsql扩展

    通过地址http://pecl.php.net/package/PDO_PGSQL下载PDO扩展包 找到php自带的ext目录里的pgsql库 第二步: 切换目录到pgsql 第三步: 找到phpiz ...

  6. 数据库连接池 Druid和C3p0

    datasource.properties数据源 #数据源 datasource.peoperties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc: ...

  7. 十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的

    需求是 上传Excel 读取里面的数据.根据Excel中某一个字段,与数据表中的一个字段的唯一性.然后把 Excel表中数据和数据库表中数据一次更改.本次测试一次更新31条数据. 本次测试基于帝国cm ...

  8. 用python简单爬取一个网页

    1打开编辑器 2撸几行代码 import urllib.request import urllib.error def main(): askURl("http://movie.douban ...

  9. 西门子S7-300 PLC视频教程(百度网盘)收集于网络-供参考学习

    百度网盘地址: 西门子300 PLC视频教程 群文件里面可以找到. 下载: https://blog.csdn.net/txwtech/article/details/93016190

  10. Beta冲刺<6/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第六天(05.24) 作业正文 如下 其他参考文献 ... B ...