AOP

Google Guice

Jboot 的AOP功能,是使用了Google的Guice框架来完成的,通过AOP,我们可以轻易的在微服务体系中监控api的调用,轻易的使用@Cacheable@CachePut@CacheEvict等注解完成对代码的配置。

@Inject@Bean

和Spring一样,Jboot是通过注解 @Inject 来对变量进行赋值注入的,例如:

  1. public class AopDemo extends JbootController {
  2. @Inject
  3. CategoryService service;
  4. public void index() {
  5. renderHtml("service:" + service.hello(""));
  6. }
  7. public static void main(String[] args) {
  8. Jboot.run(args);
  9. }
  10. }

但是,必须强调的是:CategoryService接口能够被注入,其实必须有实现类,同时实现类必须通过 @Bean 进行配置,例如:

接口代码:

  1. public interface CategoryService {
  2. public String hello(String text);
  3. }

实现类代码:

  1. @Bean //必须通过 @Bean 进行配置,让CategoryServiceImpl处于自动暴露状态
  2. public class CategoryServiceImpl implements CategoryService {
  3. @Override
  4. public String hello(String text) {
  5. return "CategoryServiceImpl say hello " + text;
  6. }
  7. }

但是,当@Inject注入的不是一个接口类,而是一个普通类,那么无需 @Bean 的配合。例如:

  1. public class AopDemo extends JbootController {
  2. @Inject
  3. MyServiceImpl myService;
  4. public void index() {
  5. renderHtml("service:" + myService);
  6. }
  7. public static void main(String[] args) {
  8. Jboot.run(args);
  9. }
  10. }

在以上代码中,由于 MyServiceImpl 不是已经接口,而是一个类,此时无需在 MyServiceImpl 这个类上配置
@Bean 注解。

当一个接口有多个实现类的时候,可以通过配合@Named配合进行注入,例如:

  1. public class AopDemo extends JbootController {
  2. @Inject
  3. CategoryService service;
  4. @Inject
  5. @Named("myCategory") //通过@Named指定使用哪个实现类
  6. CategoryService nameservice;
  7. public void index() {
  8. renderHtml("service:" + service.hello("")
  9. + "<br /> nameservice:" + nameservice.hello(""));
  10. }
  11. public static void main(String[] args) {
  12. Jboot.run(args);
  13. }
  14. }

以下是实现类的代码:

  1. @Bean
  2. public class CategoryServiceImpl implements CategoryService {
  3. @Override
  4. public String hello(String text) {
  5. return "CategoryServiceImpl say hello " + text;
  6. }
  7. }
  1. @Bean(name = "myCategory")
  2. public class NamedCategoryServiceImpl implements CategoryService {
  3. @Override
  4. public String hello(String text) {
  5. return "NamedCategoryServiceImpl say hello " + text;
  6. }
  7. }

两个类都实现了CategoryService接口,不同的是 NamedCategoryServiceImpl 实现类在配置 @Bean 的时候传了参数 name = "myCategory",这样,注入的时候就可以配合 @Named 进行对实现类的选择。

@RpcService

通过以上 @Inject@Bean 的配合,我们很方便的在项目中自由的对代码进行注入,但是,如果注入的是一个RPC的服务,那么需要通过 @RpcService 进行注入。更多关于RPC部分,请查看RPC章节。