自动装配
使用spring中底层组件
自定义组件想要使用spring容器底层的一些组件(ApplicationContext BeanFactory xxx)
方法:自定义组件实现xxxAware接口。在创建对象的时候,会调用捷库规定的方法注入相关组件。把spring底层的组件注入到自定义的bean中。 @Component
public class Red implements ApplicationContextAware , BeanNameAware, EmbeddedValueResolverAware{
private ApplicationContext applicationContext;
@Override
public void setApplicationContext ( ApplicationContext applicationContext) throws BeansException {
this . applicationContext= applicationContext;
System. out. println ( applicationContext) ;
}
@Override
public void setBeanName ( String name) {
System. out. println ( "当前bean的名字:" + name) ;
}
@Override
public void setEmbeddedValueResolver ( StringValueResolver stringValueResolver) {
String s = stringValueResolver. resolveStringValue ( "你好,${os.name},我是#{20*2}" ) ;
System. out. println ( s) ;
}
}
这些接口都是通过对应的Processor进行处理的
例如ApplicationContextAware是使用ApplicationContextAwareProcessor来进行处理的,通过后置处理器来进行解析实现
底层实现原理
使用后置处理器的方法,利用bean的生命周期进行设置
class ApplicationContextAwareProcessor implements BeanPostProcessor {
private final ConfigurableApplicationContext applicationContext;
private final StringValueResolver embeddedValueResolver;
public ApplicationContextAwareProcessor ( ConfigurableApplicationContext applicationContext) {
this . applicationContext = applicationContext;
this . embeddedValueResolver = new EmbeddedValueResolver ( applicationContext. getBeanFactory ( ) ) ;
}
@Nullable
public Object postProcessBeforeInitialization ( Object bean, String beanName) throws BeansException {
AccessControlContext acc = null;
if ( System. getSecurityManager ( ) != null && ( bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware || bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware || bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware ) ) {
acc = this . applicationContext. getBeanFactory ( ) . getAccessControlContext ( ) ;
}
if ( acc != null) {
AccessController. doPrivileged ( ( ) - > {
this . invokeAwareInterfaces ( bean) ;
return null;
} , acc) ;
} else {
this . invokeAwareInterfaces ( bean) ;
}
return bean;
}
private void invokeAwareInterfaces ( Object bean) {
if ( bean instanceof Aware ) {
if ( bean instanceof EnvironmentAware ) {
( ( EnvironmentAware) bean) . setEnvironment ( this . applicationContext. getEnvironment ( ) ) ;
}
if ( bean instanceof EmbeddedValueResolverAware ) {
( ( EmbeddedValueResolverAware) bean) . setEmbeddedValueResolver ( this . embeddedValueResolver) ;
}
if ( bean instanceof ResourceLoaderAware ) {
( ( ResourceLoaderAware) bean) . setResourceLoader ( this . applicationContext) ;
}
if ( bean instanceof ApplicationEventPublisherAware ) {
( ( ApplicationEventPublisherAware) bean) . setApplicationEventPublisher ( this . applicationContext) ;
}
if ( bean instanceof MessageSourceAware ) {
( ( MessageSourceAware) bean) . setMessageSource ( this . applicationContext) ;
}
if ( bean instanceof ApplicationContextAware ) {
( ( ApplicationContextAware) bean) . setApplicationContext ( this . applicationContext) ;
}
}
}
public Object postProcessAfterInitialization ( Object bean, String beanName) {
return bean;
}
}