码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-06-17 16:26:25      阅读:0      评论:0      收藏:0      [点我收藏+]

标签: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<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

 

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

标签:sse   als   调用   throwable   代理   contex   interface   reflect   rtb   

原文地址:https://www.cnblogs.com/swave/p/14890169.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!