/**
- auth :huf
*/
@Component
public class HufFatoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
Object object = Proxy.newProxyInstance(HufFatoryBean.class.getClassLoader(), new Class[]{StudentMapper.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName());
return null;
}
});
return object;
}
@Override
public Class<?> getObjectType() {
return StudentMapper.class;
}
}
这样我们就可以通过FactoryBean 再利用 JDK 代理; 把接口变成对象 并且注入到容器中;
为什么是null 因为我Factory返回出来就是Null;
我们继续扩展; 假设我们有多个Mapper 一个StudentMapper 一个 TeacherMapper … 多个Mapper.那怎么办?
===================================================================================================================================
答: 我们把FactoryBean 变成 BeanDefinition 就可以了; 以下是演进展示;
我们先把HufFatoryBean 写活; 通过构造方法传入即将要代理的类Class. 这样 我们就可以只用一个FactoryBean 进行全部Mapper的代理.
/**
- auth :huf
*/
@Component
public class HufFatoryBean implements FactoryBean {
private Class clazz;
public HufFatoryBean(Class clazz) {
this.clazz = clazz;
}
@Override
public Object getObject() throws Exception {
Object object = Proxy.newProxyInstance(HufFatoryBean.class.getClassLoader(), new Class[]{clazz}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName());
return null;
}
});
return object;
}
@Override
public Class<?> getObjectType() {
return clazz;
}
}
然后 我们注册BeanDefinition
=================================================================
/**
-
Application启动类;
-
auth : huf
*/
public class ApplictionMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext ap = new AnnotationConfigApplicationContext();
ap.register(AppConfig.class);
创建一个beanDefinition
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
传入我们的FactoryBean
beanDefinition.setBeanClass(HufFatoryBean.class);
通过构造方法 把Student传入
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(StudentMapper.class);
注册BeanDefinition 把创建好的 BeanDefinition 传入进去;
ap.registerBeanDefinition(“studentMapper”,beanDefinition);
-------------------------以下也是一样
AbstractBeanDefinition beanDefinition1 = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition1.setBeanClass(HufFatoryBean.class);
beanDefinition1.getConstructorArgumentValues().addGenericArgumentValue(TeacherMapper.class);
ap.registerBeanDefinition(“teacherMapper”,beanDefinition1);
启动
ap.refresh();
StudentService studentService = (StudentService) ap.getBean(“studentService”);
studentService.test();
}
}
这里 同学们应该都理解了吧? 到这里 其实思路就已经出来了; 我们不可能以这种方式去加载BeanDefinition; 以下 我介绍2种加载BeanDefinition的方式; 其实以前说过 再之前的篇章里边; 这里我写一次;
第二种BeanDefinitionRegistryPostProcessor
==================================================================================================
/**
- auth : huf
*/
public class HufBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
创建一个beanDefinition
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
传入我们的FactoryBean
beanDefinition.setBeanClass(HufFatoryBean.class);
通过构造方法 把Student传入
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(StudentMapper.class);
注册BeanDefinition 把创建好的 BeanDefinition 传入进去;
ap.registerBeanDefinition(“studentMapper”,beanDefinition);
-------------------------以下也是一样
AbstractBeanDefinition beanDefinition1 = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
2021年Java中高级面试必备知识点总结
在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。
本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。
目录:
(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)
部分内容:
对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。
不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注
90367073)]
部分内容:
[外链图片转存中…(img-mF7zvoQW-1711790367073)]
[外链图片转存中…(img-SLEK3kif-1711790367073)]
[外链图片转存中…(img-Qp7gKpv0-1711790367074)]
对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。
不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注