1.包掃描+組件標注注解
@Controller @service @repository @Component,這是我們常用的方式,此處不做過多描述
2.@Bean方式
首先我們有一個Person類
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
配置類
public class MainConfig {
@Bean
public Person getPerson() {
return new Person("zhangsan", 18);
}
}
測驗類:
public class IocTest {
@Test
public void test2() {
AnnotationConfigApplicationContext content = new AnnotationConfigApplicationContext(MainConfig.class);
Person person = content.getBean(Person.class);
System.out.println(person);
}
}
輸出:
Person{name='zhangsan', age=18}
3.@Import相關bean注冊的三種方式
1)通過@Import注入
這時候我們新建一個ImportTest 類
public class ImportTest {
}
首先我們先來看一下注入之前Bean容器中已經注入的Bean
public class MyTest {
@Test
public void main() {
AnnotationConfigApplicationContext content = new AnnotationConfigApplicationContext(MainConfig.class);
printBeans(content);
}
private void printBeans(AnnotationConfigApplicationContext context){
String[] names = context.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
這時候我們看一下輸出,可以看到這時候Bean容器中注冊的都是Spring自己的一些類以及我們通過注解注冊的一些Bean

這時候我們通過@Import注解將我們的ImportTest類注冊到Bean容器配置類中
@Import(ImportTest.class)
public class MainConfig {
@Bean
public Person getPerson() {
return new Person("zhangsan", 18);
}
}
再次查看輸出情況,可以看到我們的ImportTest類被注入成功了! 這里的id默認是全類名

2)通過實作ImportSelector介面注入
首先我們定義一個SelectorTest類實作ImportSelector介面
public class SelectorTest implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[0];
}
}
并且將該類配置到配置類當中

這時候在selectImports方法中定義我們新增的兩個類,Blue,Red(此處省略這兩個類)
public class SelectorTest implements ImportSelector {
/**
* 回傳值就是要匯入到容器中的組件全類名
* @param annotationMetadata
* @return
*/
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.zkk.AnnoBean.Red","com.zkk.AnnoBean.Blue"};
}
}
再次列印Bean容器中注冊的類,發現我們的類被注入成功了!

3)通過實作ImportBeanDefinitionRegistrar介面注入
首先我們定義一個BeanDefinitionTest類實作ImportBeanDefinitionRegistrar介面
public class BeanDefinitionTest implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
}
}
同樣將該類配置到配置類當中

這時候在registerBeanDefinitions方法中注入我們新增的類,Yellow(此處省略此類)
public class BeanDefinitionTest implements ImportBeanDefinitionRegistrar {
/**
*
* @param annotationMetadata 當前類資訊
* @param beanDefinitionRegistry beanDefinition注冊類
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
//判斷Bean容器中有沒有red跟blue這兩個類
boolean red = beanDefinitionRegistry.containsBeanDefinition("com.zkk.AnnoBean.Red");
boolean blue = beanDefinitionRegistry.containsBeanDefinition("com.zkk.AnnoBean.Blue");
//如果存在red跟blue 將Yellow注入到Bean容器中
if(red&&blue){
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Yellow.class);
beanDefinitionRegistry.registerBeanDefinition("yellow",rootBeanDefinition);
}
}
}
再次查看輸出:

我們可以看到yellow被注冊到了Bean容器中!
4.通過Spring提供的FactoryBean(工廠Bean)
定義一個ColorFactoryBean類實作FactoryBean介面,<>中的是我們要注入的類Color(此處省略此類)
public class ColorFactoryBean implements FactoryBean<Color> {
//回傳一個color物件 這個物件會被添加到容器中
@Override
public Color getObject() throws Exception {
return new Color();
}
@Override
public Class<?> getObjectType() {
return Color.class;
}
//是否是單例? true 單例 false 多實體
@Override
public boolean isSingleton() {
return true;
}
}
將ColorFactoryBean注冊到配置類中:
@Import({ImportTest.class,
SelectorTest.class,
BeanDefinitionTest.class,
ColorFactoryBean.class})
public class MainConfig {
@Bean
public Person getPerson() {
return new Person("zhangsan", 18);
}
@Bean
public ColorFactoryBean colorFactoryBean () {
return new ColorFactoryBean();
}
}
列印一下Spring容器中注冊的Bean,我們發現colorFactoryBean被注冊到了容器中

我們列印一下Bean的型別,我們發現雖然colorFactoryBean被注冊到了容器中
但是Bean的型別卻是我們的Color
Object colorFactoryBean = content.getBean("colorFactoryBean");
System.out.println("bean的型別"+colorFactoryBean.getClass());

總結:默認獲取到的是工廠Bean呼叫getObject創建的物件
當然如果想要獲取工廠Bean本身也是可以的,只需要給id前邊加一個&符
Object colorFactoryBean = content.getBean("&colorFactoryBean");
System.out.println("bean的型別"+colorFactoryBean.getClass());
這個時候我們在看一下控制臺輸出:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254527.html
標籤:java
