我們之后可能用SpringBoot創建專案,但是里面有些注解其實是SpringFramework的,簡單講幾個
@Configuration
此注解可以替代組態檔,就是那個Spring的xml檔案配置,也可以理解成<beans>標簽
@Configuration
public class AppConfig {
}
//使用注解配置之后,實作類就不是ClassPathXmlApplicationContext而是AnnotationConfigApplicationContext
//配置類本身也是組件,所以容器中會注冊此物件
ApplicationContext context=new AnnotationConfigApplicationContext(AppConfig.class);
或者注解配置類的包路徑
ApplicationContext context=new AnnotationConfigApplicationContext("com.ty");
//查看容器里面的組件
for (String beanDefinitionName : context.getBeanDefinitionNames()) {
System.out.println(beanDefinitionName);
}
@Bean
創建物件,等同于組態檔中<bean>標簽
@Bean
public User user(){
return new User();
}
//測驗
ApplicationContext context=new AnnotationConfigApplicationContext(AppConfig.class);
Object user = context.getBean("user");
System.out.println(user);

@Bean可以指定id名字:@Bean("id")

@Import還可以搭配ImportSelector和ImportBeanDefinitionRegistrar
- ImportSelector:回傳所需匯入組件的全類名陣列
- ImportBeanDefinitionRegistrar:手動注冊到bean容器
ps:在Spring5.2之后此注解搭配@Configuration使用時,@Configuration注解可以添加proxyBeanMethods引數
默認值是true,用來檢查在容器中是否有這個組件
public class User {
private Integer id;
private String username;
private Book book;
/*getter/setter/toString/構造方法
public class Book {
private String name;
/*getter/setter/toString/構造方法
@Configuration(proxyBeanMethods = true)
public class MyConfig {
@Bean
public User getUser() {
User user = new User(18, "james");
//getUser組件依賴了getBook組件
user.setBook(getBook());
return user;
}
@Bean
public Book getBook() {
return new Book("三國");
}
}
//測驗
@Test
public void test3() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
User user = (User) context.getBean("getUser");
Book userBook = user.getBook();
Book book = (Book) context.getBean("getBook");
System.out.println(userBook == book); //true
}
說明:
-
當proxyBeanMethods = true時,代表Full模式,保證每個@Bean方法被呼叫多少次回傳的組件都是單實體的
- 配置類組件之間有依賴關系,方法會被呼叫得到之前單實體組件,用Full模式
-
當proxyBeanMethods = false時,代表Lite模式,每個@Bean方法被呼叫多少次回傳的組件都是新創建的
- 配置類組件之間無依賴關系用Lite模式加速容器啟動程序,減少判斷
@ComponentScan
注解掃描,作用和組態檔中的<context:component-scan />標簽相同
@ComponentScan(basePackages = "com.ty.bean")

同樣跟組態檔一樣,可以用過濾規則指定掃描包,即排除過濾和包含過濾
@ComponentScan(basePackages = "com.ty",excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ,pattern = "com.ty.bean.*"))
@ComponentScan(basePackages = "com.ty", useDefaultFilters = false, includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = https://www.cnblogs.com/hanyu-2020/p/Repository.class))

過濾規則有多個的時候,可以用大括號,比如:
@ComponentScan(basePackages = "com.ty.dao", useDefaultFilters = false, includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = https://www.cnblogs.com/hanyu-2020/p/{Repository.class, Service.class}),
@ComponentScan.Filter(type = FilterType.ASPECTJ, pattern ="*..UserDaoImpl2")})
@Import
給容器中自動匯入創建出所需的組件、默認組件的名字就是全類名
@Configuration
@Import({Book.class, Log4jMDCAdapter.class})
public class AppConfig {
}
@Conditional
條件裝配:滿足Conditional指定的條件,則進行組件注入
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/240761.html
標籤:Java
