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

  • 相关阅读:
    bash shell学习shell基础 (笔记)
    Linux入门 (笔记)
    《Effective C++》 阅读小结 (笔记)
    趣味PAT循环19. 币值转换(20)
    git学习小结 (笔记)
    一个新手Java编程的初次感受
    201671010112 第四周的感悟
    201671010112 老同学的java学习之路
    全民IT时代到来了?学计算机很有前途?——淘宝2011校园招聘笔试感想
    编写友好的命令行应用程序
  • 原文地址:https://www.cnblogs.com/swave/p/14890169.html
Copyright © 2011-2022 走看看