package org.demo.spring;
import lombok.extern.slf4j.Slf4j;
import org.example.rest.User;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@Service
@Slf4j
public class ManualOperationBeanUtil {
@Resource
private ApplicationContext applicationContext;
/**
* 可重入读写锁
*/
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
/**
* @param beanName bean名称
*/
public void registryBean(String beanName) {
log.info("开始注册[{}]。", beanName);
lock.writeLock().lock();
try {
DefaultListableBeanFactory beanFactory = getBeanFactory();
//注册DataSourceBean
GenericBeanDefinition dataSourceBeanDefinition = this.buildBeanDefinition(beanName);
beanFactory.registerBeanDefinition(beanName, dataSourceBeanDefinition);
log.info("注册[{}]成功!", beanName);
} finally {
lock.writeLock().unlock();
}
}
/**
* @param beanName bean名称
*/
public void unRegistryBean(String beanName) {
log.info("开始注销bean[{}]。", beanName);
lock.writeLock().lock();
try {
DefaultListableBeanFactory beanFactory = getBeanFactory();
if (beanFactory.containsBeanDefinition(beanName)) {
beanFactory.destroySingleton(beanName);
beanFactory.removeBeanDefinition(beanName);
log.info("注销[{}]成功!", beanName);
} else {
log.info("不存在[{}],不需要注销!", beanName);
}
} finally {
lock.writeLock().unlock();
}
}
/**
* 获取SpringBean注册器
*
* @return BeanDefinitionRegistry
*/
private DefaultListableBeanFactory getBeanFactory() {
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
return (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
}
/**
* 获取bean
*
* @param name bean的id
* @param <T>
* @return
*/
public <T> T getBean(String name) {
return (T) applicationContext.getBean(name);
}
private GenericBeanDefinition buildBeanDefinition(String beanName) {
GenericBeanDefinition definition = null;
switch (beanName) {
case "user":
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
definition.setBeanClass(User.class);
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_NAME);
/* 依赖其他bean,这个要先注册
definition.getPropertyValues().add("dataSource", this.applicationContext
.getBean(otherBeanName), OtherBeanName.class));*/
// 属性赋值
definition.getPropertyValues().add("id", "1")
.add("name", "张三")
.add("password", "123")
.add("mail", "zhangsan@qq.com");
break;
default:
throw new RuntimeException("创建bean异常");
}
return definition;
}
}
@Data
public class User extends Base implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String password;
private String mail;
}
单侧:
public class ManualOperationBeanUtilTest extends BaseTest {
@Autowired
ManualOperationBeanUtil manualOperationBeanUtil;
@Test
public void test() {
manualOperationBeanUtil.registryBean("user");
User user = manualOperationBeanUtil.getBean("user");
System.out.println(user);
manualOperationBeanUtil.unRegistryBean("user");
// NoSuchBeanDefinitionException
user = manualOperationBeanUtil.getBean("user");
System.out.println(user);
}
}