zoukankan      html  css  js  c++  java
  • 接口动态代理IOC注入到spring容器中

    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<StudentService>{
        
        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:init
    zhangsanexecute add methodstudent111

  • 相关阅读:
    k-d tree
    K近邻算法-KNN
    ORB特征提取与匹配
    ZeroMQ一个更小、更快、更简单的智能传输层协议
    ROS导航之参数配置和自适应蒙特卡罗定位
    cmake实战第二篇:让我们的代码更像个工程
    gcc/g++实战之动态链接库与静态链接库编写
    gcc/g++ 实战之编译的四个过程
    通过 LPeg 介绍解析表达式语法(Parsing Expression Grammars)
    Forth 语言概要
  • 原文地址:https://www.cnblogs.com/swave/p/14890169.html
Copyright © 2011-2022 走看看