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

  • 相关阅读:
    java实现简单web服务器(分析+源代码)
    Java中常见的5种WEB服务器介绍
    Android ViewDragHelper完全解析 自定义ViewGroup神器
    设置SVN,Git忽略MAC的.DS_Store文件的方法
    Android中图片大小和屏幕密度的关系讲解
    Android组件化方案及组件消息总线modular-event实战
    机器学习在美团配送系统的实践:用技术还原真实世界
    智能支付稳定性测试实战
    数据库智能运维探索与实践
    【人物志】技术十年:美团第一位前端工程师潘魏增
  • 原文地址:https://www.cnblogs.com/swave/p/14890169.html
Copyright © 2011-2022 走看看