有4種方式給spring容器添加Bean
直接使用包掃描 + 組件注解標(biāo)注(@mapperScan + @Controller/@Service/@Repository/@component),這種方式適合自己創(chuàng)建的組件.
使用@Configuration 注解, @Bean注解,導(dǎo)入第三方組件.
-
使用@import注解,快速導(dǎo)入第三方組件,id默認(rèn)為類的全類名
使用import 直接導(dǎo)入第三方組件
-
使用@importSelect注解,直接返回需要導(dǎo)入的全類名數(shù)組
-
第一步實(shí)現(xiàn)ImportSelector這個(gè)接口,編寫一個(gè)類型
public class MyImportSelect implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { System.out.println(importingClassMetadata); return new String[] {"com.wzl.yanyan.spring01.program.Java","com.wzl.yanyan.spring01.program.Html"}; } }
-
2. 第二部 作為import的用法導(dǎo)入進(jìn)來
```java
@Configuration
@Conditional({WzlCondition.class})
@Import({MyImportSelect.class,Red.class,Yellow.class})
public class MainConfig {
public static final Log LOG = LogFactory.getLog(MainConfig.class);
@Conditional({WzlCondition.class})
@Bean
public Person bean1(){
return new Person("BruseWang",32);
}
}
```
3. 進(jìn)行測(cè)試
```java
package com.wzl.yanyan;
import com.wzl.yanyan.spring01.config.MainConfig;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringTest5 {
public static AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);
@Test
public void context(){
SpringTest4.printlnBeans(ac);
}
}
```
4. 使用ImportBeanDefinitionRegistrar方法,注冊(cè)一個(gè)bean,代碼邏輯
```java
package com.wzl.yanyan.spring01.select;
import com.wzl.yanyan.spring01.program.Css;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
*
* @param importingClassMetadata 當(dāng)前類的注解信息
* @param registry BeanDefinitionRegistry 注冊(cè)類
* 調(diào)用 BeanDefinitionRegistry的方法,手動(dòng)進(jìn)行注冊(cè)
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean java = registry.containsBeanDefinition("com.wzl.yanyan.spring01.program.Java");
boolean html = registry.containsBeanDefinition("com.wzl.yanyan.spring01.program.Html");
if (java && html){
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Css.class);
registry.registerBeanDefinition("Css",rootBeanDefinition);
}
}
}
```
5. 使用FactoryBean進(jìn)行組件的添加
- 新增一個(gè)類,實(shí)現(xiàn)FactoryBean接口
```java
package com.wzl.yanyan.spring01.select;
import com.wzl.yanyan.spring01.program.Javascript;
import org.springframework.beans.factory.FactoryBean;
public class MyFactoryBean implements FactoryBean<Javascript> {
@Override
public Javascript getObject() throws Exception {
return new Javascript();
}
@Override
public Class<?> getObjectType() {
return Javascript.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
```
- 在配置類中,new 一個(gè)此類到ioc容器之中
```java
@Bean
public MyFactoryBean myFactoryBean(){
return new MyFactoryBean();
}
```
- 獲取bean,使用getBean("myFactoryBean")獲取的對(duì)象是泛型類的對(duì)象.使用getBean("&myFactoryBean")獲取的對(duì)象是FactoryBean對(duì)象