spring-注册组件的4种方法

目录

一、@ComponentScan

二、@Bean

三、@Import

四、FactoryBean(工厂bean)


一、@ComponentScan

通过@ComponentScan扫描指定包,将包下的标注@Controller、@Service、@Repository、@Component的bean注册到IOC容器中

@Configuration
@ComponentScan("com.mzp.bean")
public class TestLifeCycleConfig {
}
@Component
public class MyBean {
}

二、@Bean

在配置类中使用@Bean注解将方法返回值对象注册到IOC容器中,id默认是方法名称,可通过value参数指定id

@Configuration
public class TestLifeCycleConfig {
    @Bean(value={"dog1","dog2"}, initMethod = "initMethod", destroyMethod="destroyMethod")
    public Dog getDog(){
        return new Dog();
    }
}

三、@Import

通过@Import注解将Bean注册到IOC容器中

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

	/**
	 * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
	 * or regular component classes to import.
	 */
    //组件的class、ImportSelector、ImportBeanDefinitionRegistrar的实现类
	Class<?>[] value();

}

@Import({Blue.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MyImportSelector implements ImportSelector {
    /**
     *
     * @param importingClassMetadata 当前标识Import注解的类的所有注解信息
     * @return 返回组件的全类名
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.mzp.component.service.Red"};
    }
}
public class  MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     *
     * @param importingClassMetadata 标识Import注解的类的所有注解信息
     * @param registry Bean定义的注册类
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //定义bean,例如该bean的作用域
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainRow.class);
        registry.registerBeanDefinition("rain",rootBeanDefinition);
    }
}

四、FactoryBean(工厂bean)

通过工厂bean将bean注册到容器中

实现FactoryBean接口

/**
 * 通过IOC容器根据id(myFactoryBean)获取的是Dog对象
 * 若想获取MyFactoryBean本身的bean对象,可通过id(&+工厂id),即&myFactoryBean
 */
@Component
public class MyFactoryBean implements FactoryBean<Dog> {
    /**
     * 通过该方法返回实际bean对象
     * @return
     * @throws Exception
     */
    @Override
    public Dog getObject() throws Exception {
        return new Dog();
    }

    /**
     * 实际bean的class类型
     * @return
     */
    @Override
    public Class<?> getObjectType() {
        return Dog.class;
    }

    /**
     * 设置bean作用域:单例、多实例
     * @return
     */
    @Override
    public boolean isSingleton() {
        return true;
    }
}
@Test
    public void test8(){
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestLifeCycleConfig.class);
        Object bean = applicationContext.getBean("myFactoryBean");
        System.out.println(bean);
        Object bean1 = applicationContext.getBean("&myFactoryBean");
        System.out.println(bean1);
    }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值