下面列出了org.springframework.beans.factory.support.GenericBeanDefinition#setPropertyValues ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Convert from a DTO to an internal Spring bean definition.
*
* @param beanDefinitionDto The DTO object.
* @return Returns a Spring bean definition.
*/
public BeanDefinition toInternal(BeanDefinitionInfo beanDefinitionInfo) {
if (beanDefinitionInfo instanceof GenericBeanDefinitionInfo) {
GenericBeanDefinitionInfo genericInfo = (GenericBeanDefinitionInfo) beanDefinitionInfo;
GenericBeanDefinition def = new GenericBeanDefinition();
def.setBeanClassName(genericInfo.getClassName());
if (genericInfo.getPropertyValues() != null) {
MutablePropertyValues propertyValues = new MutablePropertyValues();
for (Entry<String, BeanMetadataElementInfo> entry : genericInfo.getPropertyValues().entrySet()) {
BeanMetadataElementInfo info = entry.getValue();
propertyValues.add(entry.getKey(), toInternal(info));
}
def.setPropertyValues(propertyValues);
}
return def;
} else if (beanDefinitionInfo instanceof ObjectBeanDefinitionInfo) {
ObjectBeanDefinitionInfo objectInfo = (ObjectBeanDefinitionInfo) beanDefinitionInfo;
return createBeanDefinitionByIntrospection(objectInfo.getObject());
} else {
throw new IllegalArgumentException("Conversion to internal of " + beanDefinitionInfo.getClass().getName()
+ " not implemented");
}
}
private BeanDefinition createBeanDefinitionByIntrospection(Object object, NamedBeanMap refs,
ConversionService conversionService) {
validate(object);
GenericBeanDefinition def = new GenericBeanDefinition();
def.setBeanClass(object.getClass());
MutablePropertyValues propertyValues = new MutablePropertyValues();
for (PropertyDescriptor descriptor : BeanUtils.getPropertyDescriptors(object.getClass())) {
if (descriptor.getWriteMethod() != null) {
try {
Object value = descriptor.getReadMethod().invoke(object, (Object[]) null);
if (value != null) {
if ("id".equals(descriptor.getName())) {
} else {
propertyValues.addPropertyValue(descriptor.getName(),
createMetadataElementByIntrospection(value, refs, conversionService));
}
}
} catch (Exception e) {
// our contract says to ignore this property
}
}
}
def.setPropertyValues(propertyValues);
return def;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public List<BeanDefinitionHolder> createBeans(Map<String, Object> parameters) throws RuntimeConfigException {
GenericBeanDefinition def = new GenericBeanDefinition();
def.setBeanClassName(className);
MutablePropertyValues propertyValues = new MutablePropertyValues();
List<NamedObject> namedObjects = new ArrayList<NamedObject>();
if (checkCollection(BEAN_REFS, NamedObject.class, parameters) != Priority.NONE) {
namedObjects.addAll((Collection) parameters.get(BEAN_REFS));
}
for (String name : parameters.keySet()) {
if (!ignoredParams.contains(name)) {
propertyValues.addPropertyValue(name, beanDefinitionDtoConverterService
.createBeanMetadataElementByIntrospection(parameters.get(name), namedObjects));
}
}
def.setPropertyValues(propertyValues);
BeanDefinitionHolder holder = new BeanDefinitionHolder(def, (String) parameters.get(BEAN_NAME));
List<BeanDefinitionHolder> holders = new ArrayList<BeanDefinitionHolder>();
holders.add(holder);
return holders;
}
@PostConstruct
public void registerWithServer() {
AutowireCapableBeanFactory factory = context
.getAutowireCapableBeanFactory();
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) factory;
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(RmiServiceExporter.class);
beanDefinition.setAutowireCandidate(true);
MutablePropertyValues propertyValues = new MutablePropertyValues();
Class<?> serviceInterface = this.getClass().getInterfaces()[0];
propertyValues.addPropertyValue("serviceInterface", serviceInterface);
String serviceName = serviceInterface.getCanonicalName();
propertyValues.addPropertyValue("serviceName", serviceName);
propertyValues.addPropertyValue("service", this);
propertyValues.addPropertyValue("registryPort", "1099");
beanDefinition.setPropertyValues(propertyValues);
registry.registerBeanDefinition(serviceName, beanDefinition);
context.getBean(serviceName); // Need this else
// NotBoundException
getService().registerClient(getHostAddress());
}
/**
* Register a singleton bean with the underlying bean factory.
* <p>For more advanced needs, register with the underlying BeanFactory directly.
* @see #getDefaultListableBeanFactory
*/
public void registerSingleton(String name, Class<?> clazz, MutablePropertyValues pvs) throws BeansException {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setBeanClass(clazz);
bd.setPropertyValues(pvs);
getDefaultListableBeanFactory().registerBeanDefinition(name, bd);
}
/**
* Register a prototype bean with the underlying bean factory.
* <p>For more advanced needs, register with the underlying BeanFactory directly.
* @see #getDefaultListableBeanFactory
*/
public void registerPrototype(String name, Class<?> clazz, MutablePropertyValues pvs) throws BeansException {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setScope(GenericBeanDefinition.SCOPE_PROTOTYPE);
bd.setBeanClass(clazz);
bd.setPropertyValues(pvs);
getDefaultListableBeanFactory().registerBeanDefinition(name, bd);
}
/**
* Register a singleton bean with the underlying bean factory.
* <p>For more advanced needs, register with the underlying BeanFactory directly.
* @see #getDefaultListableBeanFactory
*/
public void registerSingleton(String name, Class<?> clazz, MutablePropertyValues pvs) throws BeansException {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setBeanClass(clazz);
bd.setPropertyValues(pvs);
getDefaultListableBeanFactory().registerBeanDefinition(name, bd);
}
/**
* Register a prototype bean with the underlying bean factory.
* <p>For more advanced needs, register with the underlying BeanFactory directly.
* @see #getDefaultListableBeanFactory
*/
public void registerPrototype(String name, Class<?> clazz, MutablePropertyValues pvs) throws BeansException {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setScope(GenericBeanDefinition.SCOPE_PROTOTYPE);
bd.setBeanClass(clazz);
bd.setPropertyValues(pvs);
getDefaultListableBeanFactory().registerBeanDefinition(name, bd);
}
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(CommonAnnotationBeanPostProcessor.class);
beanDefinition.setSynthetic(true);
MutablePropertyValues values = new MutablePropertyValues();
values.addPropertyValue("callback", new SpringBootAnnotationResolver());
beanDefinition.setPropertyValues(values);
registry.registerBeanDefinition("commonAnnotationBeanPostProcessor", beanDefinition);
}
/**
* 向spring中注入dao代理
* @param beanFactory
*/
private void registryMangoDao(DefaultListableBeanFactory beanFactory){
for (Class<?> daoClass : findMangoDaoClasses(config.getScanPackage())) {
GenericBeanDefinition bf = new GenericBeanDefinition();
bf.setBeanClassName(daoClass.getName());
MutablePropertyValues pvs = bf.getPropertyValues();
pvs.addPropertyValue("daoClass", daoClass);
bf.setBeanClass(factoryBeanClass);
bf.setPropertyValues(pvs);
bf.setLazyInit(false);
beanFactory.registerBeanDefinition(daoClass.getName(), bf);
}
}
/**
* Register a singleton bean with the underlying bean factory.
* <p>For more advanced needs, register with the underlying BeanFactory directly.
* @see #getDefaultListableBeanFactory
*/
public void registerSingleton(String name, Class<?> clazz, MutablePropertyValues pvs) throws BeansException {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setBeanClass(clazz);
bd.setPropertyValues(pvs);
getDefaultListableBeanFactory().registerBeanDefinition(name, bd);
}
/**
* Register a prototype bean with the underlying bean factory.
* <p>For more advanced needs, register with the underlying BeanFactory directly.
* @see #getDefaultListableBeanFactory
*/
public void registerPrototype(String name, Class<?> clazz, MutablePropertyValues pvs) throws BeansException {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setScope(GenericBeanDefinition.SCOPE_PROTOTYPE);
bd.setBeanClass(clazz);
bd.setPropertyValues(pvs);
getDefaultListableBeanFactory().registerBeanDefinition(name, bd);
}
/**
* Register a singleton bean with the underlying bean factory.
* <p>For more advanced needs, register with the underlying BeanFactory directly.
* @see #getDefaultListableBeanFactory
*/
public void registerSingleton(String name, Class<?> clazz, MutablePropertyValues pvs) throws BeansException {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setBeanClass(clazz);
bd.setPropertyValues(pvs);
getDefaultListableBeanFactory().registerBeanDefinition(name, bd);
}
/**
* Register a prototype bean with the underlying bean factory.
* <p>For more advanced needs, register with the underlying BeanFactory directly.
* @see #getDefaultListableBeanFactory
*/
public void registerPrototype(String name, Class<?> clazz, MutablePropertyValues pvs) throws BeansException {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setScope(GenericBeanDefinition.SCOPE_PROTOTYPE);
bd.setBeanClass(clazz);
bd.setPropertyValues(pvs);
getDefaultListableBeanFactory().registerBeanDefinition(name, bd);
}
protected BeanDefinition createBeanDefinition(Class<?> beanType) {
GenericBeanDefinition beanDef = new GenericBeanDefinition();
beanDef.setBeanClass(beanType);
MutablePropertyValues values = new MutablePropertyValues();
beanDef.setPropertyValues(values);
return beanDef;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
DefaultListableBeanFactory dlbf = (DefaultListableBeanFactory) beanFactory;
for (Class<?> daoClass : findMangoDaoClasses()) {
GenericBeanDefinition bf = new GenericBeanDefinition();
bf.setBeanClassName(daoClass.getName());
MutablePropertyValues pvs = bf.getPropertyValues();
pvs.addPropertyValue("daoClass", daoClass);
bf.setBeanClass(factoryBeanClass);
bf.setPropertyValues(pvs);
bf.setLazyInit(false);
dlbf.registerBeanDefinition(daoClass.getName(), bf);
}
}
@Override
public void registerClient(String clientAddress) {
System.out.println("Client from " + clientAddress);
ApplicationContext context = ServerApp.getApplicationContext();
AutowireCapableBeanFactory factory = context
.getAutowireCapableBeanFactory();
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) factory;
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(RmiProxyFactoryBean.class);
beanDefinition.setAutowireCandidate(true);
Class<EM> entityModelInterfaceClass = getEntityModelInterfaceClass();
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.addPropertyValue("serviceInterface",
entityModelInterfaceClass);
propertyValues.addPropertyValue("serviceUrl", "rmi://" + clientAddress
+ ":1099/" + entityModelInterfaceClass.getCanonicalName());
beanDefinition.setPropertyValues(propertyValues);
registry.registerBeanDefinition(
entityModelInterfaceClass.getCanonicalName(), beanDefinition);
EM entityModel = context.getBean(entityModelInterfaceClass);
registerEntityModel(entityModel);
System.out.println(entityModel);
}
/**
* Creates the rpc proxy factory bean.
*
* @param rpcProxy the rpc proxy
* @param beanFactory the bean factory
* @param rpcClientOptions the rpc client options
* @param namingServiceUrl naming service url
* @return the rpc proxy factory bean
*/
protected RpcProxyFactoryBean createRpcProxyFactoryBean(RpcProxy rpcProxy,
Class serviceInterface,
DefaultListableBeanFactory beanFactory,
RpcClientOptions rpcClientOptions,
String namingServiceUrl) {
GenericBeanDefinition beanDef = new GenericBeanDefinition();
beanDef.setBeanClass(RpcProxyFactoryBean.class);
MutablePropertyValues values = new MutablePropertyValues();
for (Field field : rpcClientOptions.getClass().getDeclaredFields()) {
try {
if (field.getType().equals(Logger.class)) {
// ignore properties of org.slf4j.Logger class
continue;
}
field.setAccessible(true);
values.addPropertyValue(field.getName(), field.get(rpcClientOptions));
} catch (Exception ex) {
LOGGER.warn("field not exist:", ex);
}
}
values.addPropertyValue("serviceInterface", serviceInterface);
values.addPropertyValue("namingServiceUrl", namingServiceUrl);
values.addPropertyValue("group", rpcProxy.group());
values.addPropertyValue("version", rpcProxy.version());
values.addPropertyValue("ignoreFailOfNamingService", rpcProxy.ignoreFailOfNamingService());
values.addPropertyValue("serviceId", rpcProxy.name());
// interceptor
String interceptorNames = parsePlaceholder(rpcProxy.interceptorBeanNames());
if (!StringUtils.isBlank(interceptorNames)) {
List<Interceptor> customInterceptors = new ArrayList<Interceptor>();
String[] interceptorNameArray = interceptorNames.split(",");
for (String interceptorName : interceptorNameArray) {
Interceptor interceptor = beanFactory.getBean(interceptorName, Interceptor.class);
customInterceptors.add(interceptor);
}
values.addPropertyValue("interceptors", customInterceptors);
} else {
values.addPropertyValue("interceptors", interceptors);
}
beanDef.setPropertyValues(values);
String serviceInterfaceBeanName = serviceInterface.getSimpleName();
beanFactory.registerBeanDefinition(serviceInterfaceBeanName, beanDef);
return beanFactory.getBean("&" + serviceInterfaceBeanName, RpcProxyFactoryBean.class);
}
/**
* Creates the rpc proxy factory bean.
*
* @return the rpc proxy factory bean
*/
private RpcProxyFactoryBean createRpcProxyFactoryBean(RpcProxy rpcProxy,
DefaultListableBeanFactory beanFactory,
Class serviceInterface) {
GenericBeanDefinition beanDef = new GenericBeanDefinition();
beanDef.setBeanClass(RpcProxyFactoryBean.class);
beanDef.setDependsOn("brpcApplicationContextUtils");
MutablePropertyValues values = new MutablePropertyValues();
BrpcConfig brpcConfig = getServiceConfig(beanFactory, serviceInterface);
for (Field field : RpcClientOptions.class.getDeclaredFields()) {
try {
if (field.getType().equals(Logger.class)) {
// ignore properties of org.slf4j.Logger class
continue;
}
field.setAccessible(true);
values.addPropertyValue(field.getName(), field.get(brpcConfig.getClient()));
} catch (Exception ex) {
log.warn("field not exist:", ex);
}
}
values.addPropertyValue("serviceInterface", serviceInterface);
values.addPropertyValue("serviceId", rpcProxy.name());
if (brpcConfig.getNaming() != null) {
values.addPropertyValue("namingServiceUrl", brpcConfig.getNaming().getNamingServiceUrl());
values.addPropertyValue("group", brpcConfig.getNaming().getGroup());
values.addPropertyValue("version", brpcConfig.getNaming().getVersion());
values.addPropertyValue("ignoreFailOfNamingService",
brpcConfig.getNaming().isIgnoreFailOfNamingService());
}
// interceptor
String interceptorNames = brpcConfig.getClient().getInterceptorBeanNames();
if (!StringUtils.isBlank(interceptorNames)) {
List<Interceptor> customInterceptors = new ArrayList<>();
String[] interceptorNameArray = interceptorNames.split(",");
for (String interceptorBeanName : interceptorNameArray) {
Interceptor interceptor = beanFactory.getBean(interceptorBeanName, Interceptor.class);
customInterceptors.add(interceptor);
}
values.addPropertyValue("interceptors", Arrays.asList(customInterceptors));
}
beanDef.setPropertyValues(values);
String serviceInterfaceBeanName = serviceInterface.getSimpleName();
beanFactory.registerBeanDefinition(serviceInterfaceBeanName, beanDef);
return beanFactory.getBean("&" + serviceInterfaceBeanName, RpcProxyFactoryBean.class);
}