1. Spring笔记07-Hibernate JPA与Spring Data

    7.1 映射JPA实体

    JPA: Java Persistence API 它是从EJB3中抽取出来的。

    • EntityManagerFactory
    • EntityManager
    • persistence.xml
    • @Entity
    • @Column
    • @Table

    要使用JPA,我们需要添加依赖:

    compile group: 'javax', name: 'javaee-api', version: '7.0'
    

    我们来新建数据:

    @Entity
    public class Account {
        @Id
        private Long id;
        private BigDecimal balance;
    
       //...
    }
    

    然后配置数据源:

    @Configuration
    @ComponentScan(basePackages = "lx.spring.core")
    @PropertySource("classpath:prod.properties")
    @EnableTransactionManagement
    public ...
    Tagged as : Java Spring
  2. Spring笔记06-使用JdbcTemplate进行数据访问

    6.1 实例化和配置

    没有Spring的情况下,JDBC非常难用;有了Spring,JDBC就变得比较靠谱可用了。

    这里我们在Bean中使用DataSourceJdbcTemplate进行初始化。

    @Repository
    @Profile("test")
    public class JdbcAccountRepository implements AccountRepository {
    
        private JdbcTemplate template;
        private static long nextId = 4;
    
        @Autowired
        public JdbcAccountRepository(DataSource dataSource) {
            template = new JdbcTemplate(dataSource);
        }
    }
    

    后面我们看如何配置多个DataSource

    6.2 定义数据源Data Source

    之前我们已经讲了@Component,但是在实际中我们更多的遇到的是@Service@Repository@Controller ...

    Tagged as : Java Spring
  3. Spring笔记05-Spring事务

    5.1 声明事务管理

    ACID 属性:

    Atomic原子:All or Nothing

    Consistent一致性: DB integrity constraints never violated

    Isolated: How transactions see work done by others

    Durable: Committed changes are permanent

    我们一般是在Service层声明事务。

    5.1.1 @Transactional注解

    @Transactional注解允许我们管理一个事务管理器。Spring不直接提供事务管理器,它提供一个hook连接到已经存在的事务管理器,比如我们使用关系数据库,那Spring就是使用关系数据库的事务管理器。Spring的Bean和Entity允许我们请求事务管理器,设置属性(比如超时、只读等)。

    应用Spring的事务需要两步:

    1. 应用Transactional注解 a. XML格式 b ...
    Tagged as : Java Spring
  4. Spring笔记04-使用Spring进行测试

    4.1 标准测试注解和injecting fixture

    Spring的一个特点是测试Component非常方便。

    现在我们为BaseballGame创建BaseballGameTest。然后做测试:

    public class BaseballGameTest {
        private Game game;
        private ApplicationContext ctx;
    
        @Before
        public void setUp() throws Exception {
            ctx = new AnnotationConfigApplicationContext(AppConfig.class);
            game = ctx.getBean("game", Game.class);
        }
    
        @Test
        public void playGame() throws Exception {
            String home = game.getHomeTeam().getName();
            String away = game ...
    Tagged as : Java Spring
  5. Spring笔记03-面向切面编程AOP

    3.1 AOP的概念

    AOP适用于以下场景:代码交织(code tangling)和代码分散(code scattering)

    代码交织是指一个方法完成多个功能,这几个功能之间又没有必然联系,比如我们需要做日志、检查授权和执行业务逻辑,如果我们不用AOP的话那这三个就混在一起了。

    代码分散式指比如我们有多处需要做日志,然后这些代码在多个地方重复。

    AOP允许我们将这些动作封装成一个类,然后告诉Spring我们希望在多个地方调用这个类(成为Aspect),从而避免代码交织和分散。

    AOP会设计到一下几个概念:

    • 连接点Join Point
    • 切入点Point Cut
    • Advice
    • Aspect
    • Weaving

    3.1.1 连接点(Join Point)和切入点(Point Cut)

    连接点,指的是我们能够应用我们Aspect的地方。这是告诉我们where to use the Aspects. 在一般概念的AOP上,我们可以在任何地方用Aspect,但是Spring对这一规则做了限制,我们只能用在Spring管理的Bean的公共方法中。

    切入点一般来说可以认为和连接点类似 ...

    Tagged as : Java Spring
  6. Spring笔记02-配置Bean

    2.1 构造函数和Setter注入

    之前我们基于注解的配置是这样的:

    @Configuration
    @ComponentScan(basePackages = "lx.spring.core")
    public class AppConfig {
    
        @Autowired
        private DataSource dataSource;
    
        @Autowired @Qualifier("redSox")
        private Team home;
    
        @Autowired @Qualifier("cubs")
        private Team away;
    
        @Bean
        public Game game() {
            BaseballGame game = new BaseballGame(home, away);
            game.setDataSource(dataSource);
            return game;
        }
    }
    

    我们知道如果没有@Qualifier注解,就会报错。但是如果我们把home ...

    Tagged as : Java Spring
  7. Spring笔记01-构建应用

    1.1 一个Spring的简单Java应用

    1.1.1 创建应用

    这里,我们用Gradle创建Spring的应用。

    group 'lx.spring.core'
    version '1.0-SNAPSHOT'
    
    apply plugin: 'java'
    
    sourceCompatibility = 1.8
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        compile group: 'org.springframework', name: 'spring-context', version: '4.3.2.RELEASE'
        testCompile group: 'org.springframework', name: 'spring-test', version: '4.3.2.RELEASE'
        testCompile group: 'junit ...
    Tagged as : Java Spring
  8. Netty笔记03-Netty组件和设计

    本章包含:

    • Netty的技术与架构
    • Channel, EventLoop, 和 ChannelFuture
    • ChannelHandlerChannelPipeline
    • Bootstrapping

    3.1 Channel, EventLoop和ChannelFuture

    Channel, EventLoopChannelFuture可以看成是Netty对网络的抽象:

    • Channel:Socket
    • EventLoop: 控制流、多线程和并发
    • ChannelFuture:异步通知

    3.1.1 Channel接口

    基本IO操作(bind(), connect(), read(), write())依赖于底层网络传输。在基于Java的网络中,基础组成是Socket类。Netty的Channel接口提供了的API能大幅度减少直接操作Socket的复杂度。此外,Channel是所有扩展类的根类。下面是一些继承的类:

    • EmbeddedChannel ...
    Tagged as : Netty
  9. Netty笔记02-第一个Netty应用

    本章包含: - 设置开发环境 - 一个Echo服务和客户端 - 构建和测试应用

    2.1 设置开发环境

    下载安装JDK和MAVEN,设置JAVA_HOME,并且设置M2_HOME

    2.2 Netty的客户端和服务器概览

    下图是我们的Echo服务器和客户端一览。虽然我们大部分是在写web应用,但实现服务器和客户端有助于更好的理解Netty API. Alt text

    2.3 编写Echo服务器

    所有的Netty Server都需要: - 至少一个ChannelHandler:这个组建实现了服务端用于处理客户端提交的数据,它是业务逻辑。 - Bootstrapping:用来配置服务的启动代码。最少的启动代码是绑定端口。

    2.3.1 ChannelHandler和业务逻辑

    上一篇中,我们介绍了Future和回调,并且介绍了他们用于事件驱动设计。我们也讨论了ChannelHandler,用于接收和响应事件通知。在Netty应用中,所有的数据处理逻辑都是包含在这个核心概念里面的。

    因为Echo服务用于响应进来的消息,它需要实现 ...

    Tagged as : Netty
  10. Netty笔记01-Netty简介

    Netty(http://netty.io )是一个用来快速开发可维护高性能服务器和客户端应用的异步事件驱动网络应用框架。

    高性能系统不仅需要我们有优秀的编码技巧,还需要对网络、多线程与并发有相关的经验。

    1.1 Java网络

    早期版本Java的java.net支持本地系统的socket库提供的阻塞函数。

    Alt text

    • accept()一直阻塞直到ServerSocket简历了链接,它返回一个Socket对象用来在客户端和服务器之间进行通信。
    • BufferedRead用来从Socket中读取文本;PrintWriter用来写入。
    • readLine阻塞直到发送了回车换行

    上面的代码每次只能处理一个链接。要管理多个并发的客户端,需要为每一个新的Socket来分配一个Thread,如图: Alt text

    我们来思考一下这个方法: - 首先,很多时间线程处于等待状态,这是一种资源的浪费; - 每个线程需要在内存上分配64k到1M的空间; - 即使JVM支持大量的线程,但上下文之间的切换耗时。

    1.1.1 Java NIO

    setsockopt ...

    Tagged as : Netty

Page 1 / 13