Actframework依赖注入 II - 注入对象类型

1. 框架内置绑定

在ActFramework中有大量的服务和组件都可以直接使用依赖注入,其中包括

  • ActionContext - Encapsulate all data/info relevant to an HTTP request context
  • H.Session - HTTP request session. Also available via actionContext.session()
  • H.Flash - HTTP request flash. Also available via actionContext.flash()
  • H.Request - HTTP request. Also available via actionContext.req()
  • H.Response - HTTP response. Also available via actionContext.resp()
  • CliContext - Encapsulate all data/facilities relevant to a CLI session
  • CliSession (Since act-0.6.0) - CLI session
  • MailerContext - Mailer method context
  • ActContext - A generic ActContext depends on the current computation environment, could be either ActionContext, CliContext or MailerContext or null
  • Logger - The Act.LOGGER instance
  • UserAgent - The user agent if in a request handling context
  • AppConfig - The application configuration object
  • AppCrypto - The application crypto object
  • CacheService - The App.cache() cache service
  • EventBus - The application's event bus
  • Locale - Could be ActContext.locale() or AppConfig.locale() if there is no context

1.1 应用服务组件

  • DbServiceManager
  • MailerService
  • Router
  • CliDispatcher
  • AppJobManager

2. Dao

目前支持EbeanDaoMorphiaDao两种分别用于访问SQL和MongoDB数据库

// Demonstrate inject to field
@Controller("user")
public class UserService {

    @javax.inject.Inject
    private MorphiaDao<User> userDao;

    @PostAction
    public void create(User user) {
        userDao.save(user);
    }

}
// Demonstrate inject to parameter
@Controller("user")
public class UserService {

    @PostAction
    public void create(User user, MorphiaDao<User> userDao) {
        userDao.save(user);
    }

}

如果应用有自定义的Dao,可以直接注入:

// The Model
@Entity("user")
public class User extends MorphiaModel<User> {
    
    public String email;
    ...

    public static class Dao extends MorphiaDao<User> {
        public User findByEmail(String email) {
            return findOneBy("email", email);
        }
    }
}
// The controller
@Controller("user")
public class UserService {

    @javax.inject.Inject
    private User.Dao userDao;

    @GetAction("{email}")
    public User findByEmail(String email) {
        return userDao.findByEmail(email);
    }

}

3. 可构造对象

任何拥有public缺省构造函数或者带有@Inject构造函数的类均可被注入, 例如:

// A class with public default constructor
public class Foo {
    public Foo() {...}
}
// A class with Inject constructor
public class Bar {
    @javax.inject.Inject
    public Bar(Foo foo) {...}
}

上面的FooBar都可以用于依赖注入:

public class XxxController {
    @Inject Foo foo;
    @Inject Bar bar;

    ...
}

注意 可构造对象不能直接用于参数注入

public class XxxController {

    // foo and bar won't be able to injected throght DI
    // instead they will be deserialized from form parameters
    @PostAction("/xxx")
    public void xxxAction(Foo foo, Bar bar) {
    }
}

但是可以通过@Provided注解来指定使用依赖注入

public class YyyController {

    // this time foo and bar will be injected through DI
    @PostAction("/yyy")
    public void xxxAction(@Provided Foo foo, @Provided Bar bar) {
    }
}

4. 应用自定义的绑定

假设应用自己定义了接口或抽象类, 并且定义了绑定, 可以直接使用依赖注入

// The interface
public interface MyService {
    void service();
}
// The implemention one
public class OneService implements MyService {
    public void service() {Act.LOGGER.info("ONE is servicing");}
}
// The implemention two
public class TwoService implements MyService {
    public void service() {Act.LOGGER.info("TWO is servicing");}
}
// Define bindings
public class MyModule extends org.osgl.inject.Module {
    protected void configure() {
        bind(MyService.class).to(OneService.class);
        bind(MyService.class).named("two").to(TwoService.class);
    }
}
// Inject the service
public class Serviced {
    @Inject
    private MyService one;

    @Inject
    @Named("two")
    private MyService two;
}

链接

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Kubernetes

kube-proxy源码分析

##kube-proxy介绍 请参考我的另一篇博文:kube-proxy工作原理 ##源码目录结构分析 cmd/kube-proxy //负责kub...

7385
来自专栏码匠的流水账

聊聊lettuce的sentinel连接

lettuce-core-5.0.4.RELEASE-sources.jar!/io/lettuce/core/RedisClient.java

2802
来自专栏DT乱“码”

JSP+ajax+springMVC+MayBatis处理excel上传导入

jsp <div class="subtext1"> <div cla...

2999
来自专栏nice_每一天

spring+spring mvc+mybatis 实现主从数据库配置

@DataSourceChange(slave = true)只对service(业务)层起作用。

1753
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件

结果条件 在Java中,如果有重复的代码我们会考虑进行重构,抽取公共方法或继承父类,以减少相同的代码在多处出现,达到代码的最优管理和不必要的麻烦。Drools同...

2569
来自专栏Java成神之路

Java微信公众平台开发_03_消息管理之被动回复消息

上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图,这个url就是回调url,是开发者用来接收微信消息和事件的接口URL 。也就是说,用户...

1.6K5
来自专栏码匠的流水账

聊聊eureka的delta配置

eureka-client-1.8.8-sources.jar!/com/netflix/discovery/DiscoveryClient.java

1001
来自专栏jeremy的技术点滴

mybatis-generator使用备忘

4004
来自专栏lgp20151222

学习sharding-jdbc 分库分表扩展框架

https://gitee.com/a247292980/sharding-jdbc

1473
来自专栏后端沉思录

mybatis拦截器分表

mybatis提供了拦截器插件用来处理被拦截的方法的某些逻辑.下面会通过创建8张表,当用户注册时,根据对手机号取余入不同的表.

8053

扫码关注云+社区

领取腾讯云代金券