接口动态代理IOC注入到spring容器中

2021-09-16 19:13

阅读:765

标签:sse   als   调用   throwable   代理   contex   interface   reflect   rtb    public interface StudentService { public void add(String studentName); }   定义一个spring的FactoryBean,FactoryBean在通过spring实例化生成的不是自己本身,而是通过调用的getObject方法返回的对象,该FactoryBean为接口生成一个动态代理的实现。 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.springframework.beans.factory.FactoryBean; public class StudentServiceFactoryBean implements FactoryBean{ private String studentName; @Override public StudentService getObject() throws Exception { //生成数据库访问代理(相当于Mapper的代理) StudentService studentService = (StudentService)Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{StudentService.class}, new MapperInvocationHandler(studentName)); return studentService; } @Override public Class getObjectType() { return StudentService.class; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } public static class MapperInvocationHandler implements InvocationHandler{ private String mapperName; public MapperInvocationHandler(String mapperName) { super(); this.mapperName = mapperName; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String sql = method.getName(); if (sql.equals("add")) { System.out.println(mapperName+"execute add method"+args[0]); } return null; } } }   把该FactoryBean注入到Spring的BeanDefinitionRegistry中:   import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { try { BeanDefinition sbd = new RootBeanDefinition(StudentServiceFactoryBean.class); sbd.getPropertyValues().addPropertyValue("studentName", "zhangsan"); BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(sbd ,"StudentService"); BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry); }catch(Exception e) { } } }   测试代码: @Component public class MyIncludeBean implements InitializingBean{ @Autowired private StudentService studentService; @Override public void afterPropertiesSet() throws Exception { System.out.println("MyIncludeBean:init"); studentService.add("student111"); } }   控制台成功打印: MyIncludeBean:initzhangsanexecute add methodstudent111  接口动态代理IOC注入到spring容器中标签:sse   als   调用   throwable   代理   contex   interface   reflect   rtb   原文地址:https://www.cnblogs.com/swave/p/14890169.html


评论


亲,登录后才可以留言!