BeanDefinitionRegistryPostProcessor
会调用postProcessBeanDefinitionRegistry方法实现bean的注入
import com.zk.study.myproxy.ManFactory;
import com.zk.study.myproxy.Person;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;
/**
* @author
* @since 2022/7/22 14:47:31
*/
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
// 使用 FactoryBean 实际会注入俩个bean,一个是实际对象一个是工厂对象
BeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClassName(ManFactory.class.getName());
// 通过构造函数赋值
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(Person.class);
beanDefinitionRegistry.registerBeanDefinition(Person.class.getName(), beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}
代理实现
接口类
/**
* @author
* @since 2022/7/22 15:04:10
*/
public interface Person {
void walk();
void run();
void say();
}
具体实现类
/**
* @author
* @since 2022/7/22 15:09:45
*/
public class PersonMethods {
public void say(){
System.out.println("say");
}
public void walk(){
System.out.println("walk");
}
public void run(){
System.out.println("run");
}
}
动态代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author
* @since 2022/7/22 15:05:22
*/
public class PersonProxy implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
PersonMethods personMethods = new PersonMethods();
// 通过反射获取具体方法然后执行
Method actualMethod = personMethods.getClass().getMethod(method.getName());
return actualMethod.invoke(personMethods);
}
@SuppressWarnings("unchecked")
public <T> T newProxyInstance(Class<T> clazz){
return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this);
}
}
工厂类
import org.springframework.beans.factory.FactoryBean;
/**
* @author
* @since 2022/7/22 15:42:17
*/
public class ManFactory implements FactoryBean {
private Class clazz;
public ManFactory(Class clazz){
this.clazz = clazz;
}
@Override
public Object getObject() throws Exception {
// 通过工厂类生成动态代理对象
return new PersonProxy().newProxyInstance(this.clazz);
}
@Override
public Class<?> getObjectType() {
return this.clazz;
}
}