一.Spring如何管理bean
1.@Resource 默认根据name匹配,未找到再根据type匹配;
2.@Autowired 根据类型匹配;
3.无实现类,根据接口生成代理类,把代理类放到FactoryBean的实现中,最后把FactoryBean的实现类注册到Spring容器中,本篇具体讲第三种方式。
二.核心步骤方法
public interface ITestDao {
String test();
}
public class ProxyBeanFactory implements FactoryBean {
/**
* 返回实例对象
* @return
* @throws Exception
*/
@Override
public Object getObject() throws Exception {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class[] classes = {ITestDao.class};
InvocationHandler handler = (proxy, method, args) -> "你被代理了 " + method.getName();
return Proxy.newProxyInstance(classLoader, classes, handler);
}
/**
* 返回实例类型
* @return
*/
@Override
public Class<?> getObjectType() {
return ITestDao.class;
}
/**
* 是否单例
* @return
*/
@Override
public boolean isSingleton() {
return true;
}
}
@Component
public class RegisterBeanFactory implements BeanDefinitionRegistryPostProcessor
{
/**
* 实现 BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry方法,获取 Bean 注册对象。
* 定义 Bean,GenericBeanDefinition,这里主要设置了我们的代理类工厂。
* 创建 Bean 定义处理类,BeanDefinitionHolder,这里需要的主要参数;定义 Bean 和名称 setBeanClass(ProxyBeanFactory.class)。
* 将 bean注册到spring容器中去,registry.registerBeanDefinition()
* @param beanDefinitionRegistry
* @throws BeansException
*/
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(ProxyBeanFactory.class);
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(beanDefinition, "testDao");
System.out.println("注册 testDao" + definitionHolder);
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, beanDefinitionRegistry);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}
@Test
public void test() {
AnnotationConfigApplicationContext application = new AnnotationConfigApplicationContext(RegisterBeanFactory.class);
ITestDao testDao = (ITestDao) application.getBean("testDao");
String result = testDao.test();
System.out.println(result);
}