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

相关文章

来自专栏丑胖侠

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

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

2319
来自专栏IT笔记

SpringBoot开发案例之整合mongoDB

JDK1.7、Maven、Eclipse、SpringBoot1.5.2、mongodb3.4,Robomongo(可视化工具)

6316
来自专栏Java3y

从零开始写项目第一篇【搭建环境】

使用Maven搭建SSM环境 SSM需要的基础jar包有哪些??整理一下: c3p0数据连接池 springMVC的JSON springAOP springC...

49310
来自专栏Java成神之路

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

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

7745
来自专栏IT笔记

SpringBoot开发案例之整合mongoDB

? mongodb.jpg 开始前,建议大家去了解以下文章,当然不看也没问题: MongoDB从入门到“精通”之简介和如何安装 MongoDB从入门到“精通”...

5408
来自专栏蘑菇先生的技术笔记

多线程中的锁系统(四)-谈谈自旋锁

2707
来自专栏后端之路

SpringBoot之内容协商器

背景 使用了restful的小伙伴对于导出这些需求本能就是拒绝的~破坏了restful的url的一致性【严格矫正 不是http json就是restful 很多...

4827
来自专栏码匠的流水账

聊聊eureka的delta配置

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

721
来自专栏jeremy的技术点滴

mybatis-generator使用备忘

3474
来自专栏DT乱“码”

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

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

2539

扫码关注云+社区