如何把Bean塞到Spring容器里
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,本篇内容介绍了"如何把Bean塞到Spring容器里"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代
千家信息网最后更新 2025年11月15日如何把Bean塞到Spring容器里
Bean注册
本篇内容介绍了"如何把Bean塞到Spring容器里"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
代理Bean注册到Spring容器

关于Bean注册的技术场景,在我们日常用到的技术框架中,MyBatis 是最为常见的。通过在使用 MyBatis 时都只是定义一个接口不需要写实现类,但是这个接口却可以和配置的 SQL 语句关联,执行相应的数据库操作时可以返回对应的结果。那么这个接口与数据库的操作就用到的 Bean 的代理和注册。 我们都知道类的调用是不能直接调用没有实现的接口的,所以需要通过代理的方式给接口生成对应的实现类。接下来再通过把代理类放到 Spring 的 FactoryBean 的实现中,最后再把这个 FactoryBean 实现类注册到 Spring 容器。那么现在你的代理类就已经被注册到 Spring 容器了,接下来就可以通过注解的方式注入到属性中。
按照这个实现方式,我们来操作一下,看看一个 Bean 的注册过程在代码中是如何实现的。
1. 定义接口
public interface IUserDao {
String queryUserInfo();
}
先定义一个类似 DAO 的接口,基本这样的接口在使用 MyBatis 时还是非常常见的。后面我们会对这个接口做代理和注册。
2. 类代理实现
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class>[] classes = {IUserDao.class};
InvocationHandler handler = (proxy, method, args) -> "你被代理了 " + method.getName();
IUserDao userDao = (IUserDao) Proxy.newProxyInstance(classLoader, classes, handler);
String res = userDao.queryUserInfo();
logger.info("测试结果:{}", res);
Java 本身的代理方式使用起来还是比较简单的,用法也很固定。 InvocationHandler 是个接口类,它对应的实现内容就是代理对象的具体实现。 最后就是把代理交给 Proxy 创建代理对象, Proxy.newProxyInstance。
3. 实现Bean工厂
public class ProxyBeanFactory implements FactoryBean {
@Override
public Object getObject() throws Exception {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class[] classes = {IUserDao.class};
InvocationHandler handler = (proxy, method, args) -> "你被代理了 " + method.getName();
return Proxy.newProxyInstance(classLoader, classes, handler);
}
@Override
public Class> getObjectType() {
return IUserDao.class;
}
}
FactoryBean 在 spring 起到着二当家的地位,它将近有70多个小弟(实现它的接口定义),那么它有三个方法; T getObject() throws Exception; 返回bean实例对象 Class> getObjectType(); 返回实例类类型 boolean isSingleton(); 判断是否单例,单例会放到Spring容器中单实例缓存池中 在这里我们把上面使用Java代理的对象放到了 getObject() 方法中,那么现在再从 Spring 中获取到的对象,就是我们的代理对象了。
4. Bean 注册
public class RegisterBeanFactory implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(ProxyBeanFactory.class);
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(beanDefinition, "userDao");
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry);
}
}
在 Spring 的 Bean 管理中,所有的 Bean 最终都会被注册到类 DefaultListableBeanFactory 中,以上这部分代码主要的内容包括:
实现 BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry方法,获取 Bean 注册对象。 定义 Bean,GenericBeanDefinition,这里主要设置了我们的代理类工厂。 创建 Bean 定义处理类,BeanDefinitionHolder,这里需要的主要参数;定义 Bean 和名称 setBeanClass(ProxyBeanFactory.class)。最后将我们自己的bean注册到spring容器中去,registry.registerBeanDefinition()
测试验证
在上面我们已经把自定义代理的 Bean 注册到了 Spring 容器中,接下来我们来测试下这个代理的 Bean 被如何调用。
1. 定义 spring-config.xml
这里我们把 RegisterBeanFactory 配置到 spring 的 xml 配置中,便于启动时加载。
2. 单元测试
@Test
public void test_IUserDao() {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring-config.xml");
IUserDao userDao = beanFactory.getBean("userDao", IUserDao.class);
String res = userDao.queryUserInfo();
logger.info("测试结果:{}", res);
}
「测试结果」
22:53:14.759 [main] DEBUG o.s.c.e.PropertySourcesPropertyResolver - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source
22:53:14.760 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'userDao'
22:53:14.796 [main] INFO org.itstack.interview.test.ApiTest - 测试结果:你被代理了 queryUserInfo
Process finished with exit code 0
从测试结果可以看到,我们已经可以通过注入到Spring的代理Bean对象,实现我们的预期结果。 其实这个过程也是很多框架中用到的方式,尤其是在一些中间件开发,类似的 ORM 框架都需要使用到。
"如何把Bean塞到Spring容器里"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
代理
接口
容器
对象
测试
结果
方式
接下来
内容
实例
就是
方法
框架
过程
配置
代码
可以通过
工厂
常见
技术
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中国网络技术联盟ccna
网络安全物联网科创板股票
班队课网络安全ppt
潮州app软件开发制作公司
中国最好的软件开发的公司
鸠鸠互联网科技简介
党政机关单位开展网络安全检查
上海俊硕软件开发分公司
天津hp服务器虚拟化设计
服务器安全狗centos
广州云养邦互联网科技有限公司
后台数据库制作
garrymod多人服务器推荐
网络安全短标语
php提示数据库不存在
网络安全舆情监督交流
java编程自学软件开发
xp系统安装服务器
网络安全如何加固
网络安全及防溺水主题班会
mir3数据库更新
十八大网络安全保障措施
挖钻石换东西的服务器
云探索网络技术有限公司
深圳java软件开发价格
美国有关网络安全的电视剧
内容安全和网络安全的区别
服务器门户
网络安全简单漂亮字少的手抄报
泰福特电子同步服务器说明书