關于Java注解
注解定義
- 標記注解 - 沒有元素
@interface Marker {
}
- 單元素注解 - 只有一個元素
@interface Single {
String value() default "name";
}
- 普通注解 - 除了上面兩種
@interface Normal {
String id();
String name();
}
@interface NormalWithValue {
String id() default "id";
String value();
}
注解使用
1. 標記注解 由 @Marker() 可以簡化為 @Marker
2. 按照約定,單元素注解的名稱定義為 value ,這樣 Single(value="https://www.cnblogs.com/eaglelihh/p/123") 可以簡化為 @Single("123")
3. 對于普通注解,必須給出注解中名稱以及對應的值,當然有默認值的除外,如果普通注解含有 value 名稱,并且其他名稱都有默認值,也可以簡化為 @Normal("123")
實體如下:
@Marker
@Single("123")
@Normal(id = "123", name = "123")
@NormalWithValue("123")
class AnnotationMain {
}
Annotation Types
Annotations
Spring 中的注解
- 元注解(Meta-Annotations)
在另一個注解上宣告的注解,所以說任何一個注解都可以成為元注解
在下面這個例子中,@Target、@Retention、@Documented、@Indexed都是元注解
如果@Component又跑到別的注解頭上了,那它也是元注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
}
- 角色注解(Stereotype Annotations)
代表著一種固有的形象
比如@Component代表組件,@Repository代表DAO,@service代表服務等等
- 組合注解(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,一個自動注入的注解
- 可以在建構式中注入
@Service
@Getter
public class MyService1 {
private MyDao1 myDao1;
@Autowired
public MyService1(MyDao1 myDao1) {
this.myDao1 = myDao1;
}
}
- 可以在方法中注入
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;
}
}
- 也可以在屬性上注入
@Getter
public class MyService3 {
@Autowired
private MyDao1 myDao1;
}
- 也可以混合注入
@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;
}
}
- 其他注意的地方
- 使用
@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中
Java-based Container Configuration
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/148755.html
標籤:Java
上一篇:求助句柄問題
