{"product_id":"real-world-java-isbn-9781394275724","title":"Real-World Java","description":"\u003cp\u003e\u003cb\u003eA concise handbook for the most common tools used in modern Java development\u003c\/b\u003e \u003c\/p\u003e\u003cp\u003eGood Java developers learn Java syntax, how to create loops and switches, and can work out a lambda filter stream. But great Java developers need to understand the vast ecosystem of tools and frameworks for collaboration, testing, building, and more. \u003c\/p\u003e\u003cp\u003eIn \u003ci\u003eReal-World Java\u003csup\u003e®\u003c\/sup\u003e: Helping You Navigate the Java Ecosystem\u003c\/i\u003e, a team of veteran Java developers delivers a concise and authoritative discussion of the most common frameworks, tools, and techniques used in enterprise Java development shops. The authors provide just enough background and examples to allow you to dive right into the expert guidance on annotations, logging frameworks, observability, performance tuning, testing tools, and collaboration, that real-life commercial Java development typically relies on. \u003c\/p\u003e\u003cp\u003eYou’ll expand your Java development toolkit with frameworks and utilities like Spring, Git, Prometheus, and Project Lombok. You’ll also discover links to tested, downloadable code examples that demonstrate the skills discussed in the book. \u003c\/p\u003e\u003cp\u003e\u003ci\u003eReal-World Java\u003csup\u003e®\u003c\/sup\u003e\u003c\/i\u003e is the perfect resource for everyone already somewhat comfortable with the language but who wants to familiarize themselves with the tools and frameworks used in contemporary Java software development. \u003c\/p\u003e\u003cp\u003eIntroduction xxix\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 1: How We Got Here: History of Java in a Nutshell 1\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eIntroduction 1\u003c\/p\u003e \u003cp\u003eUnderstanding the Stewardship of Java 2\u003c\/p\u003e \u003cp\u003eDifferentiating Key Java Versions 4\u003c\/p\u003e \u003cp\u003eCoding Generics in Java 5 4\u003c\/p\u003e \u003cp\u003eCoding with Functional Programming from Java 8 4\u003c\/p\u003e \u003cp\u003eCoding Modules from Java 11 5\u003c\/p\u003e \u003cp\u003eCoding Text Blocks and Records from Java 17 6\u003c\/p\u003e \u003cp\u003eLearning About Virtual Threads from Java 21 7\u003c\/p\u003e \u003cp\u003eWorking with Deprecation and Retirement 7\u003c\/p\u003e \u003cp\u003eIdentifying Renames 8\u003c\/p\u003e \u003cp\u003eChanging to Jakarta EE 8\u003c\/p\u003e \u003cp\u003eRenaming Certifications 8\u003c\/p\u003e \u003cp\u003eUnderstanding the Principles of Change 8\u003c\/p\u003e \u003cp\u003eFurther References 9\u003c\/p\u003e \u003cp\u003eSummary 9\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 2: Getting to Know Your Ide: the Secret to Success 11\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eUnderstanding IDE History 12\u003c\/p\u003e \u003cp\u003eStarting a New Project 13\u003c\/p\u003e \u003cp\u003eCreating a Project from Scratch 13\u003c\/p\u003e \u003cp\u003eCreating a Project from Existing Sources 14\u003c\/p\u003e \u003cp\u003eCreating a Project from Version Control 15\u003c\/p\u003e \u003cp\u003eAdding a Project to Version Control 15\u003c\/p\u003e \u003cp\u003eAdding a Module to an Existing Project 16\u003c\/p\u003e \u003cp\u003eCreating a Run Configuration 16\u003c\/p\u003e \u003cp\u003eGetting to Know Your Keyboard Shortcuts 18\u003c\/p\u003e \u003cp\u003eNavigating Your Codebase 19\u003c\/p\u003e \u003cp\u003eCopying and Pasting Shortcuts 20\u003c\/p\u003e \u003cp\u003eReordering Code 20\u003c\/p\u003e \u003cp\u003eUsing Other Helpful Shortcuts 21\u003c\/p\u003e \u003cp\u003eDebugging Your Code 22\u003c\/p\u003e \u003cp\u003eDebugging a Program 22\u003c\/p\u003e \u003cp\u003eSpeeding Up Debugger Performance 24\u003c\/p\u003e \u003cp\u003eRemote Debugging 25\u003c\/p\u003e \u003cp\u003eDebugging with Hot Swap 26\u003c\/p\u003e \u003cp\u003eRefactoring Your Code 26\u003c\/p\u003e \u003cp\u003eAvoiding Duplicate Code 26\u003c\/p\u003e \u003cp\u003eRenaming Members 31\u003c\/p\u003e \u003cp\u003eInlining 31\u003c\/p\u003e \u003cp\u003eChanging Signatures: Adding and Removing Parameters 32\u003c\/p\u003e \u003cp\u003eExploiting the Editor 32\u003c\/p\u003e \u003cp\u003eAutomated Reformatting of Code 32\u003c\/p\u003e \u003cp\u003eOrganizing Imports 32\u003c\/p\u003e \u003cp\u003eReformatting Code 32\u003c\/p\u003e \u003cp\u003eUnwrapping 33\u003c\/p\u003e \u003cp\u003eComparing Code 34\u003c\/p\u003e \u003cp\u003eUsing Column Mode 34\u003c\/p\u003e \u003cp\u003eExtending the IDE 35\u003c\/p\u003e \u003cp\u003ePeeking at Eclipse 36\u003c\/p\u003e \u003cp\u003ePeeking at VS Code 37\u003c\/p\u003e \u003cp\u003eComparing IDEs 39\u003c\/p\u003e \u003cp\u003eFurther References 40\u003c\/p\u003e \u003cp\u003eSummary 40\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 3: Collaborating Across the Enterprise with Git, Jira, and Confluence 41\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eCollaborating with Git 42\u003c\/p\u003e \u003cp\u003eIntroducing Git Basics 42\u003c\/p\u003e \u003cp\u003eLearning Key Concepts 42\u003c\/p\u003e \u003cp\u003eDifferentiating Commits 43\u003c\/p\u003e \u003cp\u003eDisplaying Git Status 43\u003c\/p\u003e \u003cp\u003eBranching 43\u003c\/p\u003e \u003cp\u003eTagging 43\u003c\/p\u003e \u003cp\u003eMerging 44\u003c\/p\u003e \u003cp\u003eReading Git Logs 44\u003c\/p\u003e \u003cp\u003eStaging Your Changes 44\u003c\/p\u003e \u003cp\u003eInstalling Git 45\u003c\/p\u003e \u003cp\u003eUnderstanding Git Workflow by Example 45\u003c\/p\u003e \u003cp\u003eFetching, Merging, and Pulling 51\u003c\/p\u003e \u003cp\u003ePlaying with Branches 53\u003c\/p\u003e \u003cp\u003eResolving Merge Conflicts 54\u003c\/p\u003e \u003cp\u003eUsing Pull\/Merge Requests 55\u003c\/p\u003e \u003cp\u003eUsing the Git Log 56\u003c\/p\u003e \u003cp\u003eRebasing 57\u003c\/p\u003e \u003cp\u003eCherry-Picking 60\u003c\/p\u003e \u003cp\u003eReverting and Resetting 60\u003c\/p\u003e \u003cp\u003eOptimizing with IDE Support 61\u003c\/p\u003e \u003cp\u003eLooking at the Commit Window 63\u003c\/p\u003e \u003cp\u003eUsing the Diff-Viewer Window 64\u003c\/p\u003e \u003cp\u003eCreating README Files with Markdown Language 69\u003c\/p\u003e \u003cp\u003eUsing Gitflow for Collaboration 70\u003c\/p\u003e \u003cp\u003eUsing Jira for Enterprise Process Collaboration 72\u003c\/p\u003e \u003cp\u003eGetting Started with Jira 72\u003c\/p\u003e \u003cp\u003eCreating a Project 73\u003c\/p\u003e \u003cp\u003eCreating an Issue 74\u003c\/p\u003e \u003cp\u003eLinking to an Epic 75\u003c\/p\u003e \u003cp\u003eWorking with Boards 76\u003c\/p\u003e \u003cp\u003eCreating a Sprint 76\u003c\/p\u003e \u003cp\u003eAdding Users 78\u003c\/p\u003e \u003cp\u003eAdding Columns 78\u003c\/p\u003e \u003cp\u003eUsing Filters 80\u003c\/p\u003e \u003cp\u003eSeeing My Issues 80\u003c\/p\u003e \u003cp\u003eQuerying with JQL 80\u003c\/p\u003e \u003cp\u003eMaking Bulk Changes 82\u003c\/p\u003e \u003cp\u003eConnecting to Git 83\u003c\/p\u003e \u003cp\u003eWorking with Confluence, the Enterprise Knowledge Management System 83\u003c\/p\u003e \u003cp\u003eFurther References 86\u003c\/p\u003e \u003cp\u003eSummary 86\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 4: Automating Your Ci\/cd Builds with Maven, Gradle, and Jenkins 87\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eBuilding with Maven 88\u003c\/p\u003e \u003cp\u003eBuilding a Basic Maven Project 89\u003c\/p\u003e \u003cp\u003eUnderstanding the Maven Repository and Dependencies 90\u003c\/p\u003e \u003cp\u003eDifferentiating Life-Cycle Phases 92\u003c\/p\u003e \u003cp\u003eExploring the POM 93\u003c\/p\u003e \u003cp\u003eWorking with Properties 93\u003c\/p\u003e \u003cp\u003eSpecifying Project Information 93\u003c\/p\u003e \u003cp\u003eUnderstanding Version Numbers 94\u003c\/p\u003e \u003cp\u003eUsing Common Plugins 94\u003c\/p\u003e \u003cp\u003eConfiguring a Plugin 94\u003c\/p\u003e \u003cp\u003eRecognizing Common Plugins 97\u003c\/p\u003e \u003cp\u003eWorking with a Parent POM 98\u003c\/p\u003e \u003cp\u003eCreating Your Own Parent POM 98\u003c\/p\u003e \u003cp\u003eInheriting from the Parent 98\u003c\/p\u003e \u003cp\u003eWorking with a Multimodule Project 100\u003c\/p\u003e \u003cp\u003eUsing Other Maven Features 102\u003c\/p\u003e \u003cp\u003eSetting System Properties 102\u003c\/p\u003e \u003cp\u003eUsing a Bill of Materials 102\u003c\/p\u003e \u003cp\u003eReleasing Your Project 103\u003c\/p\u003e \u003cp\u003eGetting to Know Maven in the IDE 103\u003c\/p\u003e \u003cp\u003eUsing IntelliJ 103\u003c\/p\u003e \u003cp\u003eUsing Eclipse 104\u003c\/p\u003e \u003cp\u003eUsing VS Code 104\u003c\/p\u003e \u003cp\u003eConfiguring Maven Settings for the Enterprise 106\u003c\/p\u003e \u003cp\u003eBuilding with Gradle 106\u003c\/p\u003e \u003cp\u003eBuilding a Basic Gradle Project 107\u003c\/p\u003e \u003cp\u003eUnderstanding the Gradle Local Repository and Dependencies 109\u003c\/p\u003e \u003cp\u003eSpecifying Variables 110\u003c\/p\u003e \u003cp\u003eUsing the Java Plugin 110\u003c\/p\u003e \u003cp\u003eGetting to Know Gradle in the IDE 111\u003c\/p\u003e \u003cp\u003eFinding a Dependency 112\u003c\/p\u003e \u003cp\u003eIntegrating with Jenkins 114\u003c\/p\u003e \u003cp\u003eInstalling Jenkins 114\u003c\/p\u003e \u003cp\u003eLearning Jenkins Terminology 116\u003c\/p\u003e \u003cp\u003eCreating Jobs 116\u003c\/p\u003e \u003cp\u003eCreating a Simple Freestyle Job 117\u003c\/p\u003e \u003cp\u003eCreating a Maven Freestyle Job 119\u003c\/p\u003e \u003cp\u003eCreating a Gradle Freestyle Job 122\u003c\/p\u003e \u003cp\u003eCreating a Maven Pipeline 122\u003c\/p\u003e \u003cp\u003eCreating a Gradle Pipeline 124\u003c\/p\u003e \u003cp\u003eLearning About Common Plugins 125\u003c\/p\u003e \u003cp\u003eUnderstanding Other Jenkins Capabilities 126\u003c\/p\u003e \u003cp\u003eOrganizing Jobs 126\u003c\/p\u003e \u003cp\u003eNotifying Users 126\u003c\/p\u003e \u003cp\u003eReading Changes 126\u003c\/p\u003e \u003cp\u003eScanning with Sonar 127\u003c\/p\u003e \u003cp\u003eExplaining CI\/CD Practices 127\u003c\/p\u003e \u003cp\u003eFurther References 128\u003c\/p\u003e \u003cp\u003eSummary 128\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 5: Capturing Application State with Logging Frameworks 129\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eNeeding to Move Beyond Print 130\u003c\/p\u003e \u003cp\u003eUsing Java Util Logging 130\u003c\/p\u003e \u003cp\u003eComparing Logging Levels 131\u003c\/p\u003e \u003cp\u003eFormatting Values 132\u003c\/p\u003e \u003cp\u003ePassing Basic Configuration 133\u003c\/p\u003e \u003cp\u003eSetting Logging Destinations 134\u003c\/p\u003e \u003cp\u003eLogging Lazily 135\u003c\/p\u003e \u003cp\u003eInheriting Loggers 136\u003c\/p\u003e \u003cp\u003eUsing Log4j 138\u003c\/p\u003e \u003cp\u003eComparing Logging Levels 139\u003c\/p\u003e \u003cp\u003eFormatting Values 140\u003c\/p\u003e \u003cp\u003ePassing Basic Configuration 141\u003c\/p\u003e \u003cp\u003eComparing Configuration File Formats 142\u003c\/p\u003e \u003cp\u003eSetting Logging Destinations 145\u003c\/p\u003e \u003cp\u003eChoosing Logging Output Formats 148\u003c\/p\u003e \u003cp\u003eLogging Lazily 148\u003c\/p\u003e \u003cp\u003eUsing SLF4J 149\u003c\/p\u003e \u003cp\u003eOmitting a Logging Framework 149\u003c\/p\u003e \u003cp\u003eSpecifying SLF4J Simple 150\u003c\/p\u003e \u003cp\u003eComparing Logging Levels 150\u003c\/p\u003e \u003cp\u003eFormatting Values 151\u003c\/p\u003e \u003cp\u003eLogging Lazily 151\u003c\/p\u003e \u003cp\u003ePassing Basic Configuration 152\u003c\/p\u003e \u003cp\u003eUsing SLF4J with Other Logging Frameworks 152\u003c\/p\u003e \u003cp\u003eUsing Logback 155\u003c\/p\u003e \u003cp\u003eComparing Logging Levels 156\u003c\/p\u003e \u003cp\u003ePassing Basic Configuration 156\u003c\/p\u003e \u003cp\u003eSetting Logging Destinations 157\u003c\/p\u003e \u003cp\u003eChoosing Logging Output Formats 158\u003c\/p\u003e \u003cp\u003eLearning More About Logging 159\u003c\/p\u003e \u003cp\u003eDeciding on Coding Standards 159\u003c\/p\u003e \u003cp\u003eDesigning for Performance 159\u003c\/p\u003e \u003cp\u003eChoosing a Language for the Logs 159\u003c\/p\u003e \u003cp\u003ePreventing Log Tampering 159\u003c\/p\u003e \u003cp\u003eAggregating and Forwarding Logs 160\u003c\/p\u003e \u003cp\u003eComparing Logging Frameworks 160\u003c\/p\u003e \u003cp\u003eFurther References 161\u003c\/p\u003e \u003cp\u003eSummary 161\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 6: Getting to Know the Spring Framework 163\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eConfiguring Spring 164\u003c\/p\u003e \u003cp\u003eUsing XML Configuration Files 165\u003c\/p\u003e \u003cp\u003eUsing Java Configuration Classes 167\u003c\/p\u003e \u003cp\u003eUsing Component Scanning 169\u003c\/p\u003e \u003cp\u003eCustomizing Spring Applications with Properties 170\u003c\/p\u003e \u003cp\u003eInjecting Properties 170\u003c\/p\u003e \u003cp\u003eConfiguring Environment-Specific Properties with Spring Profiles 171\u003c\/p\u003e \u003cp\u003eTurbocharging Development with Spring Boot 173\u003c\/p\u003e \u003cp\u003eInitializing Spring Boot Projects with Spring Initializr 173\u003c\/p\u003e \u003cp\u003eUsing IntelliJ Initializr Integration 174\u003c\/p\u003e \u003cp\u003eWorking with Spring MVC 178\u003c\/p\u003e \u003cp\u003eHandling Errors in Spring 183\u003c\/p\u003e \u003cp\u003eInspecting Your Application with Actuator 185\u003c\/p\u003e \u003cp\u003eSecuring Your Application with Spring Security 187\u003c\/p\u003e \u003cp\u003eLearning Security Terminology 187\u003c\/p\u003e \u003cp\u003eUnderstanding Spring Security Processing 188\u003c\/p\u003e \u003cp\u003eExploring the Spring Projects 192\u003c\/p\u003e \u003cp\u003eFurther References 193\u003c\/p\u003e \u003cp\u003eSummary 193\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 7: Testing Your Code with Automated Testing Tools 195\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eUnderstanding Testing Basics 196\u003c\/p\u003e \u003cp\u003eStaging Your Test Directory 196\u003c\/p\u003e \u003cp\u003eConfiguring JUnit in a Maven Build 197\u003c\/p\u003e \u003cp\u003eConfiguring JUnit in a Gradle Build 200\u003c\/p\u003e \u003cp\u003eUsing Test-Driven Development to Explore Tests 202\u003c\/p\u003e \u003cp\u003eLearning JUnit 205\u003c\/p\u003e \u003cp\u003eLooking at Test Flow 205\u003c\/p\u003e \u003cp\u003eSkipping a Test 207\u003c\/p\u003e \u003cp\u003eAsserting Logic 207\u003c\/p\u003e \u003cp\u003eUsing Common Assertions 208\u003c\/p\u003e \u003cp\u003eAsserting Exceptions 208\u003c\/p\u003e \u003cp\u003eFailing Programmatically 209\u003c\/p\u003e \u003cp\u003eVerifying Conditions Using Assume Logic 209\u003c\/p\u003e \u003cp\u003eParameterizing Tests 210\u003c\/p\u003e \u003cp\u003eWorking with Common Testing Libraries 211\u003c\/p\u003e \u003cp\u003eCoding Using AssertJ 211\u003c\/p\u003e \u003cp\u003eCoding with JUnit Pioneer Features 212\u003c\/p\u003e \u003cp\u003eDisabling Until a Date 213\u003c\/p\u003e \u003cp\u003eRetrying a Test 213\u003c\/p\u003e \u003cp\u003eWorking with System Properties 214\u003c\/p\u003e \u003cp\u003eUsing Cartesian Test 214\u003c\/p\u003e \u003cp\u003eLearning About Other Features 214\u003c\/p\u003e \u003cp\u003eMocking Objects 215\u003c\/p\u003e \u003cp\u003eMocking with Mockito 215\u003c\/p\u003e \u003cp\u003eConfiguring When\/Then 218\u003c\/p\u003e \u003cp\u003eVerifying Calls 219\u003c\/p\u003e \u003cp\u003eMocking Concrete Classes 220\u003c\/p\u003e \u003cp\u003eMocking Statics 221\u003c\/p\u003e \u003cp\u003eMocking with EasyMock 221\u003c\/p\u003e \u003cp\u003eMocking with Spring MockMvc 222\u003c\/p\u003e \u003cp\u003eMeasuring Test Coverage 225\u003c\/p\u003e \u003cp\u003eCalculating Code Coverage 225\u003c\/p\u003e \u003cp\u003eSeeing Code Coverage in the IDE 226\u003c\/p\u003e \u003cp\u003eRunning Coverage in the Build 227\u003c\/p\u003e \u003cp\u003eOptimizing Your Testing with IntelliJ 228\u003c\/p\u003e \u003cp\u003eLooking at Assert Messages 228\u003c\/p\u003e \u003cp\u003eExploring Test Runs 229\u003c\/p\u003e \u003cp\u003eNavigating to the Test 229\u003c\/p\u003e \u003cp\u003eGenerating Test Boilerplate with TestMe 230\u003c\/p\u003e \u003cp\u003eLearning Other Testing Concepts 231\u003c\/p\u003e \u003cp\u003eUsing Behavior-Driven Development 231\u003c\/p\u003e \u003cp\u003eTesting Contracts 231\u003c\/p\u003e \u003cp\u003eUnderstanding the Golden Master Pattern 231\u003c\/p\u003e \u003cp\u003eTesting Mutations 232\u003c\/p\u003e \u003cp\u003eDeciding Between DRY vs. DAMP 232\u003c\/p\u003e \u003cp\u003eFurther References 233\u003c\/p\u003e \u003cp\u003eSummary 234\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 8: Annotation Driven Code with Project Lombok 235\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003ePreparing Your Environment for Lombok 236\u003c\/p\u003e \u003cp\u003eInstalling in IntelliJ 236\u003c\/p\u003e \u003cp\u003eInstalling in Eclipse 237\u003c\/p\u003e \u003cp\u003eInstalling in VS Code 237\u003c\/p\u003e \u003cp\u003eIncluding in Maven or Gradle 238\u003c\/p\u003e \u003cp\u003eCompiling from javac 239\u003c\/p\u003e \u003cp\u003eImplementing Lombok 239\u003c\/p\u003e \u003cp\u003eConverting to the Lombok Way 240\u003c\/p\u003e \u003cp\u003eUsing @Data: the include-all Annotation 240\u003c\/p\u003e \u003cp\u003eAutogenerating Your @Getter and @Setter Methods 241\u003c\/p\u003e \u003cp\u003eUsing @ToString 243\u003c\/p\u003e \u003cp\u003eUsing @EqualsAndHashCode 244\u003c\/p\u003e \u003cp\u003eGenerating Constructors with @AllArgsConstructor, @RequiredArgsConstructor, and @NoArgsConstructor Annotations 244\u003c\/p\u003e \u003cp\u003eWeaving Loggers into Your Codebase with @Log and More 245\u003c\/p\u003e \u003cp\u003eDelomboking Your Codebase 247\u003c\/p\u003e \u003cp\u003eFurther References 247\u003c\/p\u003e \u003cp\u003eSummary 247\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 9: Parallelizing Your Application Using Java Concurrency 249\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eUnderstanding Concurrency Basics 250\u003c\/p\u003e \u003cp\u003eDealing with Thread Contention 252\u003c\/p\u003e \u003cp\u003eCoding Atomic Operations 254\u003c\/p\u003e \u003cp\u003eUsing the volatile Keyword 255\u003c\/p\u003e \u003cp\u003eTransitioning Thread States 256\u003c\/p\u003e \u003cp\u003eNew 256\u003c\/p\u003e \u003cp\u003eRunnable 256\u003c\/p\u003e \u003cp\u003eBlocked 257\u003c\/p\u003e \u003cp\u003eWaiting 257\u003c\/p\u003e \u003cp\u003eTimed_waiting 257\u003c\/p\u003e \u003cp\u003eTerminated 257\u003c\/p\u003e \u003cp\u003eSummarizing Thread States 257\u003c\/p\u003e \u003cp\u003eSynchronizing 257\u003c\/p\u003e \u003cp\u003eExploring Heap, Stack, and Metaspace 259\u003c\/p\u003e \u003cp\u003eIntroducing Concurrent Collections 259\u003c\/p\u003e \u003cp\u003eUsing Built‐In Concurrency Support in Java Streams 260\u003c\/p\u003e \u003cp\u003eUsing Concurrency Components to Reduce Complexity 261\u003c\/p\u003e \u003cp\u003eLocking with ReentrantLock 261\u003c\/p\u003e \u003cp\u003eControlling Thread Access with Phaser 262\u003c\/p\u003e \u003cp\u003eUsing Runnable, Callable, and Future 262\u003c\/p\u003e \u003cp\u003eCoordinating with ExecutorService 263\u003c\/p\u003e \u003cp\u003eUsing Fixed‐Count Thread Pools 263\u003c\/p\u003e \u003cp\u003eScheduling with ExecutorService 264\u003c\/p\u003e \u003cp\u003eBuilding Reactive Code with CompletableFuture 265\u003c\/p\u003e \u003cp\u003eFunctional Interfaces Used by CompletableFuture 265\u003c\/p\u003e \u003cp\u003eCompletionStage 268\u003c\/p\u003e \u003cp\u003ePutting It All Together with CompletableFuture 269\u003c\/p\u003e \u003cp\u003eIntroducing Virtual Threads 271\u003c\/p\u003e \u003cp\u003eInterthread Communication 276\u003c\/p\u003e \u003cp\u003eLearning Concurrency Support in the Spring Framework 278\u003c\/p\u003e \u003cp\u003eUsing @Async\/@EnableAsync 278\u003c\/p\u003e \u003cp\u003eScheduling with @Scheduled\/@EnableScheduling 280\u003c\/p\u003e \u003cp\u003eLaunching Threads with ThreadPoolTaskExecutor 280\u003c\/p\u003e \u003cp\u003eUnderstanding @Transactional 281\u003c\/p\u003e \u003cp\u003eFurther References 281\u003c\/p\u003e \u003cp\u003eSummary 281\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 10: Pattern Matching with Regular Expressions 283\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eIntroducing Regular Expressions 284\u003c\/p\u003e \u003cp\u003eLearning Basic Regular Expression Syntax 285\u003c\/p\u003e \u003cp\u003eSpecifying Common Quantifiers 286\u003c\/p\u003e \u003cp\u003eMatching Basic Boundaries 287\u003c\/p\u003e \u003cp\u003eWorking with Common Character Classes 288\u003c\/p\u003e \u003cp\u003eChoosing Options 290\u003c\/p\u003e \u003cp\u003eEscaping Characters 290\u003c\/p\u003e \u003cp\u003eUsing Regular Expressions with Java APIs 291\u003c\/p\u003e \u003cp\u003eCalling String Methods 291\u003c\/p\u003e \u003cp\u003eFinding Matches 291\u003c\/p\u003e \u003cp\u003eReplacing Values 292\u003c\/p\u003e \u003cp\u003eSplitting 293\u003c\/p\u003e \u003cp\u003eWorking with Patterns 294\u003c\/p\u003e \u003cp\u003eFinding Matches 295\u003c\/p\u003e \u003cp\u003eReplacing Values 296\u003c\/p\u003e \u003cp\u003eSplitting as a Stream 298\u003c\/p\u003e \u003cp\u003eControlling Behavior with Flags 298\u003c\/p\u003e \u003cp\u003eExploring Advanced Regular Expression Syntax 300\u003c\/p\u003e \u003cp\u003eLooking at Neighboring Text 300\u003c\/p\u003e \u003cp\u003eDifferentiating Quantifiers 301\u003c\/p\u003e \u003cp\u003eIdentifying Common Mistakes 304\u003c\/p\u003e \u003cp\u003eCoding with Regular Expressions 304\u003c\/p\u003e \u003cp\u003eUsing with Frameworks and Tools 306\u003c\/p\u003e \u003cp\u003eCoding Regular Expressions for Apache Commons Validator 306\u003c\/p\u003e \u003cp\u003eCoding Regular Expressions for JUnit 306\u003c\/p\u003e \u003cp\u003eCoding Regular Expressions for Log4j 307\u003c\/p\u003e \u003cp\u003eCoding Regular Expressions for Bean Validation 307\u003c\/p\u003e \u003cp\u003eCoding Regular Expressions for Spring 308\u003c\/p\u003e \u003cp\u003eFurther References 308\u003c\/p\u003e \u003cp\u003eSummary 309\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 11: Coding the Aspect-oriented Way 311\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eUnderstanding the Need for Aspects 311\u003c\/p\u003e \u003cp\u003eCreating Our First Example 312\u003c\/p\u003e \u003cp\u003eExploring the Pointcut Expression Language 315\u003c\/p\u003e \u003cp\u003e* Wildcards 315\u003c\/p\u003e \u003cp\u003e.. Wildcards 316\u003c\/p\u003e \u003cp\u003eUsing @AfterReturning 316\u003c\/p\u003e \u003cp\u003eUsing @AfterThrowing 317\u003c\/p\u003e \u003cp\u003eUsing @After 317\u003c\/p\u003e \u003cp\u003eUsing @Around 317\u003c\/p\u003e \u003cp\u003eUsing @Pointcut 319\u003c\/p\u003e \u003cp\u003eCombining Pointcuts 320\u003c\/p\u003e \u003cp\u003eAnnotation-Based Pointcuts 321\u003c\/p\u003e \u003cp\u003eFurther References 323\u003c\/p\u003e \u003cp\u003eSummary 323\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 12: Monitoring Your Applications: Observability in the Java Ecosystem 325\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eIntroducing Observability 326\u003c\/p\u003e \u003cp\u003eGetting Started with Prometheus 326\u003c\/p\u003e \u003cp\u003eStarting the Test Application 326\u003c\/p\u003e \u003cp\u003eInstalling the Exporter 327\u003c\/p\u003e \u003cp\u003eInstalling Prometheus 327\u003c\/p\u003e \u003cp\u003eConfiguring a Scrape 328\u003c\/p\u003e \u003cp\u003eIntroducing PromQL: The Prometheus Query Language 330\u003c\/p\u003e \u003cp\u003eUsing Prometheus HTTP APIs 336\u003c\/p\u003e \u003cp\u003eMicrometer and Actuator 336\u003c\/p\u003e \u003cp\u003eDependencies for Micrometer and Actuator 337\u003c\/p\u003e \u003cp\u003eCreating Custom Metrics 337\u003c\/p\u003e \u003cp\u003eCounting Results with Micrometer Counter 337\u003c\/p\u003e \u003cp\u003eCapturing Fluctuating Values 338\u003c\/p\u003e \u003cp\u003eBucketing Values with Histograms and Summaries 339\u003c\/p\u003e \u003cp\u003eAdding Alert Manager 341\u003c\/p\u003e \u003cp\u003eDashboarding with Grafana 344\u003c\/p\u003e \u003cp\u003eLogging and Tracing 347\u003c\/p\u003e \u003cp\u003eIntroducing Logging 347\u003c\/p\u003e \u003cp\u003eKey Concepts in Tracing 349\u003c\/p\u003e \u003cp\u003eTooling 349\u003c\/p\u003e \u003cp\u003eImplementing Tracing in Spring Boot Applications 349\u003c\/p\u003e \u003cp\u003eFurther References 349\u003c\/p\u003e \u003cp\u003ePrometheus 349\u003c\/p\u003e \u003cp\u003eOther Tools 350\u003c\/p\u003e \u003cp\u003eSummary 350\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 13: Performance Tuning Your Services 351\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eLearning the Concepts and Terminology 352\u003c\/p\u003e \u003cp\u003eBenchmarking 352\u003c\/p\u003e \u003cp\u003eBenchmarking with Built-In Java APIs 353\u003c\/p\u003e \u003cp\u003eMicrobenchmarking 354\u003c\/p\u003e \u003cp\u003eTuning JVM Settings 357\u003c\/p\u003e \u003cp\u003eConfiguring Memory Settings 357\u003c\/p\u003e \u003cp\u003eCollecting the Garbage 358\u003c\/p\u003e \u003cp\u003eSetting Sizes for Garbage Collection 359\u003c\/p\u003e \u003cp\u003eUsing Serial Garbage Collection 359\u003c\/p\u003e \u003cp\u003eUsing Parallel Garbage Collection 359\u003c\/p\u003e \u003cp\u003eUsing G1GC 360\u003c\/p\u003e \u003cp\u003eTesting with JMeter 360\u003c\/p\u003e \u003cp\u003eCreating a Test Plan 360\u003c\/p\u003e \u003cp\u003eRunning the Load Test 363\u003c\/p\u003e \u003cp\u003eAnalyzing the Results 364\u003c\/p\u003e \u003cp\u003eUsing JDK Tools 365\u003c\/p\u003e \u003cp\u003eUsing Java Flight Recorder 366\u003c\/p\u003e \u003cp\u003eVisualizing in Java Mission Control 368\u003c\/p\u003e \u003cp\u003eMonitoring with JConsole 369\u003c\/p\u003e \u003cp\u003eUsing VisualVM 370\u003c\/p\u003e \u003cp\u003eReporting with JStat 371\u003c\/p\u003e \u003cp\u003eOptimizing Your Application 372\u003c\/p\u003e \u003cp\u003eExploring a Case Study 372\u003c\/p\u003e \u003cp\u003eUsing SonarQube 374\u003c\/p\u003e \u003cp\u003eConsidering Performance 375\u003c\/p\u003e \u003cp\u003eFurther References 375\u003c\/p\u003e \u003cp\u003eSummary 376\u003c\/p\u003e \u003cp\u003e\u003cb\u003eChapter 14: Getting to Know More of the Ecosystem 377\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eWriting Javadoc 378\u003c\/p\u003e \u003cp\u003eComparing JVM Languages 379\u003c\/p\u003e \u003cp\u003eSampling Kotlin 379\u003c\/p\u003e \u003cp\u003eSampling Groovy 380\u003c\/p\u003e \u003cp\u003eSampling Scala 381\u003c\/p\u003e \u003cp\u003eExploring Jakarta EE 381\u003c\/p\u003e \u003cp\u003eComparing Database Types 382\u003c\/p\u003e \u003cp\u003eUnderstanding Relational Databases 382\u003c\/p\u003e \u003cp\u003eUnderstanding NoSQL Databases 384\u003c\/p\u003e \u003cp\u003eLearning About Integrations 384\u003c\/p\u003e \u003cp\u003eDeploying Java 384\u003c\/p\u003e \u003cp\u003eDifferentiating Web and Application Servers 385\u003c\/p\u003e \u003cp\u003eUsing Containers 385\u003c\/p\u003e \u003cp\u003eLaunching to the Cloud 386\u003c\/p\u003e \u003cp\u003eBuilding REST APIs 387\u003c\/p\u003e \u003cp\u003eCreating Web Services 388\u003c\/p\u003e \u003cp\u003eDocumenting APIs 389\u003c\/p\u003e \u003cp\u003ePicking a Virtual Machine 390\u003c\/p\u003e \u003cp\u003eExploring Libraries 390\u003c\/p\u003e \u003cp\u003eSecuring Your Applications 391\u003c\/p\u003e \u003cp\u003eExploring the OWASP Top 10 391\u003c\/p\u003e \u003cp\u003eComparing Types of Security Tools 393\u003c\/p\u003e \u003cp\u003eStaying Informed About Changes 393\u003c\/p\u003e \u003cp\u003eFurther References 393\u003c\/p\u003e \u003cp\u003eSummary 394\u003c\/p\u003e \u003cp\u003eAppendix: Reading and Writing Xml, Json, and Yaml 395\u003c\/p\u003e \u003cp\u003eWorking with XML 396\u003c\/p\u003e \u003cp\u003eLearning the XML Format 396\u003c\/p\u003e \u003cp\u003eReading XML with Jackson 397\u003c\/p\u003e \u003cp\u003eWriting XML with Jackson 399\u003c\/p\u003e \u003cp\u003eReading and Writing XML with DOM 401\u003c\/p\u003e \u003cp\u003eReading XML with SAX 402\u003c\/p\u003e \u003cp\u003eComparing XML Libraries 403\u003c\/p\u003e \u003cp\u003eWorking with JSON 404\u003c\/p\u003e \u003cp\u003eLearning the JSON Format 404\u003c\/p\u003e \u003cp\u003eReading JSON with Jackson 405\u003c\/p\u003e \u003cp\u003eWriting JSON with Jackson 406\u003c\/p\u003e \u003cp\u003eReading and Writing JSON with Gson 407\u003c\/p\u003e \u003cp\u003eComparing JSON Libraries 408\u003c\/p\u003e \u003cp\u003eWorking with YAML 408\u003c\/p\u003e \u003cp\u003eLearning the YAML Format 408\u003c\/p\u003e \u003cp\u003eReading YAML with Jackson 409\u003c\/p\u003e \u003cp\u003eWriting YAML with Jackson 410\u003c\/p\u003e \u003cp\u003eReading and Writing with SnakeYAML 410\u003c\/p\u003e \u003cp\u003eComparing YAML Libraries 412\u003c\/p\u003e \u003cp\u003eFurther References 412\u003c\/p\u003e \u003cp\u003eSummary 413\u003c\/p\u003e \u003cp\u003eIndex 415\u003c\/p\u003e  \u003cp\u003e\u003cb\u003eVICTOR GRAZI\u003c\/b\u003e is an Oracle Java Champion and a veteran Java engineer in the USA, and has built serious Java ­applications at some of the world's leading banks. He is a Pluralsight author, has served as infoQ Java lead editor, and serves on the Java community process executive committee. Victor is a frequent presenter at technical ­conferences and hosts the “Java Concurrent Animated” and “Bytecode Explorer” open-source projects. \u003c\/p\u003e\u003cp\u003e\u003cb\u003eJEANNE BOYARSKY\u003c\/b\u003e is an Oracle Java Champion and has worked as a Java developer for a major bank for more than 20 years. She is a senior moderator at CodeRanch, and trains and mentors students of all levels, including the programming department of a FIRST robotics team.   \u003c\/p\u003e\u003cp\u003e\u003cb\u003eA concise handbook for the most common tools used in modern Java development\u003c\/b\u003e \u003c\/p\u003e\u003cp\u003eGood Java developers learn Java syntax, how to create loops and switches, and can work out a lambda filter stream. But great Java developers need to understand the vast ecosystem of tools and frameworks for collaboration, testing, building, and more. \u003c\/p\u003e\u003cp\u003eIn \u003ci\u003eReal-World Java\u003csup\u003e®\u003c\/sup\u003e: Helping You Navigate the Java Ecosystem\u003c\/i\u003e, a team of veteran Java developers delivers a concise and authoritative discussion of the most common frameworks, tools, and techniques used in enterprise Java development shops. The authors provide just enough background and examples to allow you to dive right into the expert guidance on annotations, logging frameworks, observability, performance tuning, testing tools, and collaboration, that real-life commercial Java development typically relies on. \u003c\/p\u003e\u003cp\u003eYou’ll expand your Java development toolkit with frameworks and utilities like Spring, Git, Prometheus, and Project Lombok. You’ll also discover links to tested, downloadable code examples that demonstrate the skills discussed in the book. \u003c\/p\u003e\u003cp\u003e\u003ci\u003eReal-World Java\u003csup\u003e®\u003c\/sup\u003e\u003c\/i\u003e is the perfect resource for everyone already somewhat comfortable with the language but who wants to familiarize themselves with the tools and frameworks used in contemporary Java software development.\u003c\/p\u003e","brand":"Wiley","offers":[{"title":"Default Title","offer_id":47989922824421,"sku":"NP9781394275724","price":50.0,"currency_code":"USD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1842\/7735\/files\/9781394275724.jpg?v=1761785920","url":"https:\/\/k12savings.com\/es\/products\/real-world-java-isbn-9781394275724","provider":"K12savings","version":"1.0","type":"link"}