文章目錄
- 1、組件注解
- 2、@Component + @Bean
- 3、@Import(PlaceHolderClass)快速導入一個組件
- 4、使用Spring提供的FactoryBean注入
1、組件注解
注解 | 描述 |
---|---|
@Component | 組件定義不清晰時候的注解 |
@Controller | 控制器層 |
@Service | 服務層 |
@Repository | 數據層 |
注:添加注解的類需要與啟動類在同一個包路徑下,如果在別的包下,需要在 啟動類
或 啟動類所在包下的存在以上注解的類
中添加 @ComponentScan
注解。
例如:
啟動類:
package com.springboottest;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
@ComponentScan(basePackages = {"com.springtest", "com.springboottest"})
public class SpringbootTestApplication {public static void main(String[] args) {SpringApplication.run(SpringbootTestApplication.class, args);}}
Student類(與啟動類不在同一個包路徑下):
package com.springtest;import lombok.Data;
import org.springframework.stereotype.Component;import java.lang.reflect.Field;@Data
@Component
public class Student {private String name;private String nickName;
}
2、@Component + @Bean
@Component
public class Test {@Beanpublic User user() {return new User();}
}
注:@Bean
注解的方法,返回值 User
作為注入的 Bean
對象。
3、@Import(PlaceHolderClass)快速導入一個組件
PlaceHolderClass | 描述 |
---|---|
一般Class | 直接注入 |
實現了ImportSelector接口的Class | 根據返回類的全限定名數組注入 |
實現了ImportBeanDefinitionRegistrar接口的Class | 獲取類描述信息,選擇性手動注入 |
@Configuration
@Import({ImportDemo.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class ImportConfig{@Beanpublic User user(){return new User();}
}
//自定義邏輯返回需要導入的組件
public class MyImportSelector implements ImportSelector {//返回值是導入到容器中的組件全限定名數組@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {//當前類的所有注解Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes();System.out.println("當前配置類的注解信息:"+annotationTypes);return new String[]{"com.paopaoedu.springboot.bean.user01","com.paopaoedu.springboot.bean.user02"};}
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {/*** AnnotationMetadata:當前類的注解信息* BeanDefinitionRegistry:BeanDefinition注冊類;* 把所有需要添加到容器中的bean;調用* BeanDefinitionRegistry.registerBeanDefinition手工注冊進來*/@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {boolean definition = registry.containsBeanDefinition("com.paopaoedu.springboot.bean.User01");boolean definition2 = registry.containsBeanDefinition("com.paopaoedu.springboot.bean.User02");if(definition && definition2){//創建一個類的BeanDefinition(Bean的描述信息對象)RootBeanDefinition beanDefinition = new RootBeanDefinition(User03.class);//注冊一個Bean,指定bean名registry.registerBeanDefinition("User03", beanDefinition);}}
}
4、使用Spring提供的FactoryBean注入
public class UserFactoryBean implements FactoryBean<User> {// 注入的Bean@Overridepublic User getObject() throws Exception {return new User();}// 注入的Bean類型@Overridepublic Class<?> getObjectType() {return User.class;}// 是否是單例@Overridepublic boolean isSingleton() {return true;}
}