/** * 给容器中注册组件; * 1)、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类] * 2)、@Bean[导入的第三方包里面的组件] * 3)、@Import[快速给容器中导入一个组件] * 1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名 * 2)、ImportSelector:返回需要导入的组件的全类名数组; * 3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中 * 4)、使用Spring提供的 FactoryBean(工厂Bean); * 1)、默认获取到的是工厂bean调用getObject创建的对象 * 2)、要获取工厂Bean本身,我们需要给id前面加一个& * &colorFactoryBean */
在spring容器中,给容器注册组件的常用的方式概括起来有四种:
第一种,使用包扫描的方法注册,使用@ComponentScan注解或者@ComponentScans注解,对使用@Component注解的类进行注册,其中@Controller @Service等注解是组合注解,其内部含有@Component。
第二种,在配置信息种注册bean,在含有@Configuration的配置类中使用@Bean注解进行注册
第三种,是通过@Import注解注册,有三种注册方式,1、直接加载类名进行注册,2、实现 ImportSelector接口中的 selectImports方法,3、实现 ImportBeanDefinitionRegistrar接口中的 registerBeanDefinitions方法,我们重点描述后两种,好了,还是直接上代码吧。
public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.yuan.model.AAA"}; } }
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { /* AnnotationMetadata:当前的注解信息 BeanDefinitionRegistry:BeanDefinition的注册类 */ @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean b = registry.containsBeanDefinition("com.yuan.model.AAA"); if (b) { //制定bean的定义信息 (bean的类型) RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(BBB.class); //注册一个bean。制定bean名 registry.registerBeanDefinition("b",rootBeanDefinition); } } }
public class MyApp { public static void main(String[] args) { AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class); String[] beanDefinitionNames = context.getBeanDefinitionNames(); for (String bean:beanDefinitionNames) { System.out.println(bean); } AAA bean = context.getBean(AAA.class); System.out.println(bean); } }
运行结果:
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
myConfig
com.yuan.model.AAA
b
AAA{id=1, name=‘123456‘}
AAA类和b都已注册到了spring容器中。
第四种,实现 FactoryBean接口,实现其方法
public class CCCFactoryBean implements FactoryBean { //返回是否单例 @Override public boolean isSingleton() { return true; } //返回一个CCC的对象,加载到容器中 @Override public Object getObject() throws Exception { System.out.println("CCCFactoryBean ..."); return new CCC(); } //返回类型 @Override public Class<?> getObjectType() { return CCC.class; } }
public class MyConfig { @Bean public CCCFactoryBean cccFactoryBean(){ return new CCCFactoryBean(); } }
public static void main(String[] args) { AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class); String[] beanDefinitionNames = context.getBeanDefinitionNames(); for (String bean:beanDefinitionNames) { System.out.println(bean); } AAA bean = context.getBean(AAA.class); System.out.println(bean); Object cCCFactoryBean = context.getBean("cccFactoryBean"); System.out.println(cCCFactoryBean); Object cCCFactoryBean1 = context.getBean("&cccFactoryBean"); System.out.println(cCCFactoryBean1); }
运行结果
原文地址:https://www.cnblogs.com/mingyuan1031/p/11302274.html