2019.6.29 Spring注解-Bean的注册
6.29
-
向容器中注入组件的几种方式:
-
@Controller、@Service、@Respority、@Component
-
@Bean
-
@Import,接受class数组,组件名是数组内class的全类名
-
注解中的那些类也可以是ImportSelector接口的实现类,需要实现一个selectImports方法,这个方法的返回值是一个要注解类的全类名(String[])数组
-
注解中的类也可以是ImportBeanDefinationRegistrar接口的实现类,需要实现registerBeanDefinations方法,这个方法的形参是AnnotationMetadata(当前类的注册信息)和BeanDefinationRegistry(BeanDefination注册类)。BeanDefinationRegister对象的registerBeanDefination方法可以将bean注册,该方法除了需要注解bean的id,还需要BeanDefination对象,这个对象是对注解类的包装,可以使用这个类的有参构造器(参数就是要注解的类)来进行初始化
public class My implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { BeanDefinition b = new RootBeanDefinition(Color.class); beanDefinitionRegistry.registerBeanDefinition("color",b); } }
-
-
BeanFactory(工厂Bean)
-
类实现FactoryBean接口,需要一个类的泛型,这个类就是注入的bean
-
在配置类里面用@Bean的方式去注入这个FactoryBean的实现类,
-
注意:容器中注入的Bean的id是方法名,但是实际注入的Bean的类型是这个工厂Bean的泛型
-
如果需要获取这个工厂Bean,需要在GetBean方法的形参内添加“&”
public class MyColorFactory implements FactoryBean<Color> { @Override public Color getObject() throws Exception { return new Color(); } @Override public Class<?> getObjectType() { return Color.class; } @Override public boolean isSingleton() { return false; } }
Object getcolor = applicationContext.getBean("&getcolor");
-
-
-
Bean生命周期:创建、初始化、销毁。
- 初始化和销毁的方式分别是在原来xml配置的方式中是通过
<Bean>
标签的init-method、destroy-method来指定对应方法的。方法不能有参数,但可以抛异常。 - 也可以通过@Bean注解的init-method、destroy-method来制定对应的方法。
- 注意:多实例模式下,当执行
ApplicationContext.close()
方法时,容器不会调用销毁方法。需要自己手动调用。
- 初始化和销毁的方式分别是在原来xml配置的方式中是通过
-
将需要注入的Bean手动实现InitializingBean和DisposableBean接口来实现。
-
使用JSR250中的@PostConstruct(Bean属性配置完成)和@PreDestroy(注解到相应的方法)(销毁容器之前调用)来实现