• Guice总结


    Guice总结

    Jar包:guice-4.1.0.jar

    辅包:

    1. guava-15.0.jar
    2. aopalliance-.jar
    3. javaee-api-6.0-RC2.jar

    Guice的IoC

    两种模式,一种是基于Module的,Module的实现类将会在config()方法中进行配置,指定某一个基类/接口都应对应哪一个具体实现;这样,在通过@Inject来注解属性/构造函数的时候,就可以自动根据配置进行实例化。

    但是Guice实例和Spring一个很大区别在于获取实例的方式一定是通过如下方式获取(因为Guice没有扫描和自动发现功能):

    Public void config(Binder binder){
             Binder.bind(BaseClass.class).to(ImplClass.class);
    }
    … …
    
    injector = Guice.createInjector(new ObjectPool());
    BaseClass instace = injector.getInstance(BaseClass.class);

    在这个过程中才会应用config中的配置来对注解内容进行操作;instance的类型是ImplClass。OjectPool对象实现了Module,并重写了config()。

    当然,如果没有这种根据抽象类/接口来选择实现对象的场景,可以不使用Module,比如作为一个类,里面的属相可能就是比较直白的类,直接new就可以了,这个时候,你可以采用@Inject进行注解构造函数的方式,来进行自动实例化构造参数。

    Private C1 c1;
    Private C2 c2;
    
    @Inject
    Public MyClass(C1 c1, C2 c2){
    
    }
    
    ….
    
    Injector = Guice.createInjector();
    MyClass mc = Injector.getInstance(MyClass.class);
    …

    类似的,还可以直接进行字段注解,在getInstance()的过程中,将会自动对于字段进行实例化,这个过程有点像一个熔炉的感觉,扔进去一个类,出来的是一个经过处理的实例了。

    Guice的IoC有两大作用,一个是通过config来定义抽象类/接口的具体实现类,第二个是在构建实例的时候,自动来实例化参数以及字段,本质都是实例化,一个是选择性,一个是内部关联对象实例化。即一个是实例化那个,一个怎么实例化。

    另外,在怎么实例化的时候,在对于抽象列/接口类型字段/参数的时候也会有一个实例化那个的处理。

     

    创建AOP

    第一步,

    创建一个AOP的拦截对象,继承MethodInterceptor(需要引入aopalliance-.jar),重写invoke方法:

        @Override
        public Object invoke(MethodInvocation arg0) throws Throwable {
           doBefore(arg0);
           Object ret = arg0.proceed();
           doAfter(arg0);
           return ret;
        }

    实现doBefore以及doAfter来进行前置操作和后置操作;

    第二步,

    就是在Module的实现类中通过配置config函数来制定绑定AOP的规则,下面定义的规则就是注解“Data2Aop”的方法将会被使用Data2Aop来进行AOP(Data2Aop继承了MethodInterceptor并重写了invoke):

        @Override
    public void configure(Binder binder) {
      binder.bindInterceptor(Matchers.any(), Matchers.annotatedWith(Names.named("Data2Aop")), new Data2Aop());
    }

    第三步,

    在Data2Handler类中的handler方法体(真正要切的函数)上面通过@Named来进行注解。

    @Named("Data2Aop")
    protected void handleInternal(TransportSession tSession, CommandExchangeBuffer ceb) throws Exception {
      … …
    }

    第四步,

    在需要进行Data2Handler实例化的时候,通过Guice的Injector来进行获得(实践规则),即可实现AOP了。

    实例化之后,使用Guice来注入成员

    可以实例化之后,在通过injector.injectMembers(instance)来注入@Inject成员
    TaskContainer container = new TaskContainer();
    this.taskManager = new TaskManager(container);
    Platform.getInjector().injectMembers(taskManager);
  • 相关阅读:
    C#8.0新特性
    C#7.0新特性
    C#6.0新特性
    C#6.0到C#8.0的新特性
    纪念博客开通的6月29日
    什么是开发中经常说的'POCO'
    什么时候用Model,什么时候用Entity?
    C#数组的 Length 和 Count()
    C#中foreach的实现原理
    Windows Server 2012 R2远程桌面默认端口修改
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/6839107.html
Copyright © 2020-2023  润新知