Java 动态代理的简单理解

动态代理作用

动态代理是 Java SE 1.3 新增的特性,利用动态代理可以在运行时创建一个实现了一组给定接口的新类。因此动态代理代理的是接口,不是类。

使用动态代理的场景:
* 一个接口的实现在编译时无法知道,需要在运行时才能实现
* 实现更加通用的适配器(Adapter)和装饰器(Decorator)
* 面向切面编程的支持

Read more   2016/4/23 posted in  Java学习
 

Spring-AMQP 的使用记录

Spring-AMQP 特性

  • Listener container 使用 POJO 异步处理消息
  • 提供一个高度抽象的 template(RabbitTemplate)发送和接收消息
  • 使用 RabbitAdmin 来自动声明队列、Exchange 和 Binding

队列、Exchange 和 Binding 的设置

  • Spring way
    使用 spring-boot-starter-amqp 会自动配置 ConnectionFactoryRabbitTemplateAmqpAdmin 三个 Bean。

    @Configuration
    public class RabbitConfiguration {
      @Bean
      public DirectExchange exchange() {
          return new DirectExchange("infrastructure.direct");
      }
    
      @Bean
      public Queue queue(){
          return new Queue("queueName");
      }
    
      @Bean
      public Binding binding(){
          return BindingBuilder.bind(queue()).to(exchange()).with("routeKey");
      }
    }
    
  • Just java

    ConnectionFactory connectionFactory = new CachingConnectionFactory();
    RabbitAdmin amqpAdmin = new RabbitAdmin(connectionFactory);
    
    Queue queue = new Queue("quueuName");
    DirectExchange exchange = new DirectExchange("exchangeName");
    amqpAdmin.declareQueue(queue);
    amqpAdmin.declareExchange(exchange);
    amqpAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange).with("routeKey"));
    
Read more   2016/3/21 posted in  Java学习
 

Spring Boot Integration 测试

  1. 新建一个测试配置类 TestApplication

    @Configuration
    @EnableAutoConfiguration
    @ComponentScan(
          excludeFilters = @ComponentScan.Filter(value = {
                  Application.class,
                  ApplicationChecker.class
          }, type = FilterType.ASSIGNABLE_TYPE))
    public class TestApplication {
      // 配置测试使用内存数据库
      @Bean
      public DataSource dataSource() {
          return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
      }
    }
    
Read more   2016/2/1 posted in  Java学习
 

Spring-data-redis 的使用记录

开始向导

添加 dependency spring-boot-starter-redis,它默认使用 jedis(还支持 JRedis,SRP 和 Lettuce)
一个简单的 Hash 示例:

@SpringBootApplication
public class RedisDemo implements CommandLineRunner {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    public static void main(String[] args) {
        SpringApplication.run(RedisDemo.class).close();
    }

    public void run(String... args) throws Exception {
        BoundHashOperations<String, String, String> ops = stringRedisTemplate.boundHashOps("com.tjj");
        ops.put("name", "tangjiujun");
        ops.put("sex", "man");
        System.out.println(ops.entries()); // 打印结果:{name=tangjiujun, sex=man}
    }
}
Read more   2016/1/9 posted in  Java学习
 

使用 Spring JPA 建立一对一双向关联

使用注意

User user = new User();
user.setUsername("tangjiujun");
Email email = new Email();
email.setUser(user);  // 必须显示设置 user,否则关联字段值会为空
email.setEmail("jiujun.tang@gmail.com");
user.setEmail(email); 
userRepository.save(user);
Read more   2015/11/25 posted in  Java学习