JAVA Spring-6-源码解析AOP及扩展知识
原创原理图
https://www.processon.com/apps/5d1c16dde4b076f4fd3f5c40



package com.beanPostProcessor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.PriorityOrdered;
import org.springframework.stereotype.Component;
@Component
public class Lwj_BeanPostPocessor implements BeanPostProcessor, PriorityOrdered {
//实现PriorityOrdered,实现getOrder该方法返回一个与第一次执行时一样小的值
@Override
public int getOrder() {
return 102;
}
//先前植入的切割方法的初始化
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if("wjwTest".equals(beanName)){
System.out.println("Lwj_BeanPostPocessor以前的方法以前的方法");
}
return bean;
}
//第七节第7节第七部分第7部分
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if("wjwTest".equals(beanName)){
System.out.println("Lwj_BeanPostPocessor在方法之后的方法之后的方法");
}
return bean;
}
}

此方式是spring克服独特的网络挑战克服不同的网络挑战克服独特的联网挑战克服与众不同的网络挑战spring中有五种类型的扩展模块在中总共存在五种扩展模块在中总共存在五种扩展模块
重新应用程序中的单个实例(重新应用程序中的单个实例(重新应用程序中的单个实例(singleton)调用Prototype()调用Prototype()以调用Prototype()调用原型(prototype可以以两种方式使用)可以使用两种方法
**Lookup 方式 成功的女性网络工作者的秘诀成功女性网络工作者的秘密成功的女性网络工作者的秘密成功女性网络人的秘密@Lookup只能在方法上批注,这次可以在抽象方法上批注。**
实现ApplicationContextAware接口实现set方法,这是重新创建方法的一种方式,这是重新创建方法的一种方式,它重新创建一个方法,该方法重新创建beanFactory那就从工厂再买一台吧bean此时这个newBean原植物在与原植物在原植物中oldBean类型相同,但类型一致,类型相同,但JVM在不属于相同的堆中,在不属于相同的堆中
spring最重要的课最重要的课最重要的课
configurationClassPostProcessor
引出 ImportBeanDefinitionRegistrar 此接口的实现允许您获取beanFactory中的map(容器),之后可以注册(容器),之后可以注册bean对象到map中
spring初始化内部重要初始化内部重要初始化内部重要6个类对象 是在 ApplicationContext初始化前,使用初始化前,使用AnnotatedBeanDefinitionReader方法,将spring会将内置的前处理读入,将内置的前处理读入map中
internalConfigurationAnnotationProcessor
internalAutowiredAnnotationProcessor
internalCommonAnnotationProcessor
internalEventListenerProcessor
PersistenceAnnotationBeanPostProcessor
internalEventListenerFactory
spring-扩展
扩展接口
BeanPostProcessor,可以在bean初始化前后干扰初始化前后干扰初始化前后干扰bean中的逻辑 postProcessBeforeInitialization() postProcessAfterInitialization()
PriorityOrdered,可以按顺序加载您可以按顺序加载您可以按顺序加载它们bean getOrder()
ImportBeanDefinitionRegistrar,spring-mtbaits它的用法是放一放它的用法是设置它的用法这是放一放BeanDefinition工厂动态添加工厂动态添加到工厂添加到工厂动态添加到工厂添加到工厂map中 registerBeanDefinitions()
BeanFactoryPostProcessor,是bean初始化前允许的最后一次修改初始化前的最后允许更改BeanDefinition信息,可直接从DefinitionFactory中获取BeanDefinition然后修改属性(不推荐使用此方法)postProcessBeanFactory()
模拟spring-mybatis代码
当做SqlSessionFactory
package com.dao;
public interface MapperDao {
public void query();
}
实现ImportBeanDefinitionRegistrar 重写 registerBeanDefinitions方法
package com.MyImport;
import com.dao.MapperDao;
import com.mapperFactoryBean.MapperFactoryBean;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class ImplMapperImportBean implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
/**
* 在这里,您可以获取当前包下的一个类,并执行一个循环来注册您自己的类bean
* 思路:
* 1,创建,创建,创建definition
* 2、制定definition的BeanClass属性的属性的属性bean指定一个类指定一个类(实现FactoryBean注意以下特征注意以下特征注意下面的特征注意下面的特征beanName为例getBean("mapperDao")获取的是factoryBean中的getObject()返回的对象返回的对象)
* 3、为这个bean指定return构造函数参数值,因为构造可以不带参数,也可以带参数,所以我们使用构造函数中参数对象的数量和类型来确定调用的构造方法,即我们getBean获取的对象获取的对象获取的对象
* 4、使用beanfactory中的registerBeanDefinition方法将BeanDefinition注册到我们的工厂注册到我们的工厂
* */
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(MapperDao.class);
GenericBeanDefinition genericBeanDefinition = (GenericBeanDefinition) beanDefinitionBuilder.getBeanDefinition();
System.out.println(genericBeanDefinition.getBeanClassName());
genericBeanDefinition.setBeanClass(MapperFactoryBean.class);
genericBeanDefinition.getConstructorArgumentValues().addGenericArgumentValue("com.dao.MapperDao");
registry.registerBeanDefinition("mapperDao",genericBeanDefinition);
}
}
FactoryBean
package com.mapperFactoryBean;
import org.springframework.beans.factory.FactoryBean;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MapperFactoryBean implements FactoryBean, InvocationHandler {
/**
* 这里是扩展,这里是扩展,这里是扩展
* 此处利用spring自动装配中的自动装配中的自动装配(类型3种:ByName、ByType、Constructor)我们想要注入到我们想要注入到我们想要注入的构造中的构造IOC容器中的bean
* spring总共有五种组装方法,五种组装方法,五种组装方法
* 分别是
* on Spring框架的默认设置框架的默认设置
* byName 如果你不明白,你不需要学习这段话
* byType 如果你不明白,你不需要学习这段话
* constructor 如果你不明白,你不需要学习这段话
* AutoDetect 如果没有无参数构造,则默认使用constructor方法,或者如果有无参数构造,则使用byType方式setter注入
* 我们这里用构式,我们这里用构式
* */
Class clazz;
public MapperFactoryBean(Class clazz) {
this.clazz = clazz;
}
//实现InvocationHandle接口重写invoke方法,这是我们将调用方法的地方,这是我们将调用方法的地方,这里是我们调用方法的地方,这里是我们将调用bean对象的逻辑方法对象的逻辑方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getDeclaringClass().getName()+"类的"+method.getName()+"方法!");
return proxy;
}
/**
* factoryBean界面特征Re界面特征Re界面特征再次界面特征getBean()“在组织的各个层面,女性更有可能被征求意见,”卡博尼说.“当被问及说不的坏处时,我采访的每一位女性都说她们会感觉很糟糕”但她强调,研究结果很清楚:升至高层的女性高管在如何花费时间方面“更具战略性和深思熟虑”。组织可以通过跟踪看不见的合作工作,确保它在男性和女性员工之间平均分配,并推动所有领导人,特别是女性,毫不掩饰地优先考虑他们最重要的任务,从而尽到自己的责任.
* 思路:
* 1我们充分利用我们充分利用我们充分利用factoryBean接口的性质与反射相结合,返回一个代理类,充当bean添加到工厂添加到工厂
* */
@Override
public Object getObject() throws Exception {
Class [] classes = new Class[]{clazz};
Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(),classes,this);
return proxy;
}
@Override
public Class> getObjectType() {
return clazz;
}
}
测试
AnnotationConfigApplicationContext acc = new AnnotationConfigApplicationContext(Appconfig.class);
MapperDao dao = (MapperDao) acc.getBean("mapperDao" );
dao.query();
//注解
@Import(ImplMapperImportBean.class)
原理图:https://www.processon.com/view/link/5d25bc1be4b0ae3317dfc340
转载于:https://www.cnblogs.com/gnwzj/p/11163023.html
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123