目录
一、@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);
}