<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文用範例介紹SpringBoot如何向容器註冊bean(即:將物件加入容器)。
(@Controller/@Service/@Repository也可以,因為它裡邊包含@Component)
預設是載入和Application類所在同一個目錄下的所有類,包括所有子目錄下的類。
當啟動類和@Component分開時,如果啟動類在某個包下,需要在啟動類中增加註解@ComponentScan,設定需要掃描的包名。例如:
@SpringBootApplication(scanBasePackages="com.test.chapter4")
此註解其實是@ComponentScan的basePackages,通過檢視scanBasePackages即可得知。
@SpringBootApplication只會掃描@SpringBootApplication註解標記類包下及其子包的類,將這些類納入到spring容器,只要類有@Component註解即可。
有的註解的定義中已加入@Component,所以這些註解也會被掃描到:@Controller,@Service,@Configuration,@Bean
@ComponentScan+@Configuration+@Component
DemoConfig在掃描路徑之內
@Configuration @ComponentScan(basePackages = { "com.example.demo.mybeans" }) public class DemoConfig { }
MyBean1在com.example.demo.mybeans下
@Component public class MyBean1{ }
使用場景:將沒有Component等註解的類匯入。例如:第三方包裡面的元件、將其他jar包中的類。
public class User { //@Value("Tom") public String username; public User(String s) { this.username = s; } } @Configuration public class ImportConfig { @Bean public User user(){ return new User("Lily"); } } @RestController public class ImportDemoController { @Autowired private User user; @RequestMapping("/importDemo") public String demo() throws Exception { String s = user.username; return "ImportDemo@SpringBoot " + s; } }
簡介
@Import(要匯入到容器中的元件);容器會自動註冊這個元件,id預設是全類名。(@Import是Spring的註解。)
ImportSelector:返回需要匯入的元件的全類名陣列;
ImportBeanDefinitionRegistrar:手動註冊bean到容器中
@Import方式
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import({ImportDemoConfig.class}) public @interface EnableImportDemo { } public class ImportDemoConfig{ @Bean public User user(){ return new User("Lily"); } } @EnableImportDemo @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } @RestController public class ImportDemoController { @Autowired private User user; @RequestMapping("/importDemo") public String demo() { String s = user.getName(); return "user.getName():" + s; } }
ImportSelector方式
//自定義邏輯返回需要匯入的元件 public class MyImportSelector implements ImportSelector { //返回值,就是到匯入到容器中的元件全類名 //AnnotationMetadata:當前標註@Import註解的類的所有註解資訊 @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { //當前類的所有註解 Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes(); System.out.println("當前設定類的註解資訊:"+annotationTypes); //注意不能返回null,不然會報NullPointException return new String[]{"com.paopaoedu.springboot.bean.user01","com.paopaoedu.springboot.bean.user02"}; } } public class User01 { public String username; public User01() { System.out.println("user01...constructor"); } } public class User02 { public String username; public User02() { System.out.println("user02...constructor"); } } @Configuration @Import({ImportDemo.class, MyImportSelector.class}) public class ImportConfig { @Bean public User user(){ return new User("Lily"); } } @RestController public class ImportDemoController { @Autowired private User user; @Autowired private ImportDemo importDemo; @Autowired private User01 user01; @RequestMapping("/importDemo") public String demo() throws Exception { importDemo.doSomething(); user01.username = "user01"; String s = user.username; String s1 = user01.username; return "ImportDemo@SpringBoot " + s + " " + s1; } }
ImportBeanDefinitionRegistrar方式
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { /** * AnnotationMetadata:當前類的註解資訊 * BeanDefinitionRegistry:BeanDefinition註冊類; * 把所有需要新增到容器中的bean;呼叫 * BeanDefinitionRegistry.registerBeanDefinition手工註冊進來 */ @Override public 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){ //指定Bean定義資訊作用域都可以在這裡定義;(Bean的型別,Bean。。。) RootBeanDefinition beanDefinition = new RootBeanDefinition(User03.class); //註冊一個Bean,指定bean名 registry.registerBeanDefinition("User03", beanDefinition); } } }
public class User03 { public String username; public User03() { System.out.println("user03...constructor"); } }
使用上和前面的類似就不舉例了。
預設獲取到的是工廠bean呼叫getObject建立的物件。
要獲取工廠Bean本身,我們需要給id前面加一個&。例如:&xxxFactoryBean 注意類名是X,這裡就是小寫的x
public class UserFactoryBean implements FactoryBean<User04> { @Override public User04 getObject() throws Exception { // TODO Auto-generated method stub System.out.println("UserFactoryBean...getObject..."); return new User04("User04"); } @Override public Class<?> getObjectType() { // TODO Auto-generated method stub return User04.class; } //是否單例? //true:這個bean是單範例,在容器中儲存一份 //false:多範例,每次獲取都會建立一個新的bean; @Override public boolean isSingleton() { return true; } } public class User04 { public String username; public User04(String s) { String nowtime= DateUtil.now(); username=s+" "+nowtime; } } @Configuration @Import({ImportDemo.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class}) public class ImportConfig { // 要獲取工廠Bean本身,需要給id前面加一個&,&userFactoryBean @Bean public UserFactoryBean userFactoryBean(){ return new UserFactoryBean(); } @Bean public User user(){ return new User("Lily"); } } @RestController public class ImportDemoController { @Autowired private User user; @Autowired private ImportDemo importDemo; @Autowired private User01 user01; @Autowired private UserFactoryBean userFactoryBean; @RequestMapping("/importDemo") public String demo() throws Exception { importDemo.doSomething(); user01.username = "user01"; String s = user.username; String s1 = user01.username; String s4 = userFactoryBean.getObject().username; return "ImportDemo@SpringBoot " + s + " " + s1 + " " + s4; } } @SpringBootApplication public class SpringBootLearningApplication { public static void main(String[] args) { SpringApplication.run(SpringBootLearningApplication.class, args); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.paopaoedu.springboot.config"); ImportDemo importDemo = context.getBean(ImportDemo.class); importDemo.doSomething(); printClassName(context); Object bean1 = context.getBean("userFactoryBean"); Object bean2 = context.getBean("userFactoryBean"); System.out.println(bean1 == bean2); } private static void printClassName(AnnotationConfigApplicationContext annotationConfigApplicationContext){ String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames(); for (int i = 0; i < beanDefinitionNames.length; i++) { System.out.println("匹配的類"+beanDefinitionNames[i]); } } }
測試結果
以上就是SpringBoot向容器註冊bean的方法詳解的詳細內容,更多關於SpringBoot註冊bean的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45