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

  • 相关阅读:
    小米手机做USB电脑摄像头啦,亲测可用,附有详细教程!
    【DIY文章列表标签】dt_gry_list
    Oracle 10g 设置 PL/SQL 远程
    关于硬盘“4K扇区”对齐的查看与设置方法
    oracle数据误操作恢复【flashback闪回操作】
    CENTOS下安装LNMP环境随笔
    深喉咙使用心得(陆续更新ing....)
    CENTOS6.3环境下安装VSFTPD 便于开通FTP功能随笔
    MYSQL/SQL_SERVER/ORACLE三种数据库自动备份方法
    U盘安装 ubuntu 12.04随笔
  • 原文地址:https://www.cnblogs.com/swave/p/14890169.html
Copyright © 2011-2022 走看看