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 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

spring-boot 速成(8) 集成druid+mybatis

spring-boot与druid、mybatis集成(包括pageHelper分页插件), 要添加以下几个依赖项: compile('mysql:my...

8779
来自专栏流柯技术学院

Java Selenium封装--RemoteWebDriver

851
来自专栏日常分享

JavaWeb 基于Session的用户登陆注销实现

  通过Session来存储用户的部分登陆信息来验证用户是否在线,这应该时最容易实现的一种Web端方案,本文以SSM(Spring、SpringMVC、myBa...

711
来自专栏Jaycekon

Spring-Blog:个人博客(一)-Mybatis 读写分离

概述: 2018,在平(tou)静(lan)了一段时间后,开始找点事情来做。这一次准备开发一个个人博客,在开发过程之中完善一下自己的技术。本系列博客只会提出一...

3239
来自专栏码匠的流水账

聊聊webflux参数校验

javax.validation虽然是方便,但是具体业务场景非常复杂,不是简单的单个字段校验就完事的,有的需要关联校验,这个时候javax.validation...

712
来自专栏一枝花算不算浪漫

[Spring框架] Spring中的 ContextLoaderListener 实现原理.

2777
来自专栏颇忒脱的技术博客

Spring MVC异步处理简介

本文讲到的所有特性皆是基于Servlet 3.0 Async Processing的,不是基于Servlet 3.1 Async IO的。

753
来自专栏用户画像

Ping++ 支付接口对接

431
来自专栏Java3y

Struts2【拦截器】

什么是拦截器 拦截器Interceptor…..拦截器是Struts的概念,它与过滤器是类似的…可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Str...

2875
来自专栏Java开发者杂谈

Jetty入门

总述 同tomcat一样,jetty也是一个servlet引擎,jetty的神奇之处在于,jetty不仅可以作为一个web应用的容器,它甚至还可以作为一个程序中...

3536

扫码关注云+社区