跟着官方文档学Maven构建生命周期

在IntelliJ IDEA中,显示了Maven的Lifecycle:

Java官方笔记9Lambda表达式

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Lambda Expression 有了Lambda Expression,就不用再写anonymous classes。 写Lambda,首先要找到它的类型。 There is a restriction on the type of a lambda expression: it has to be a functional interface. 函数接口,只有1个抽象方法的接口: @FunctionalInterface public interface Runnable { public abstract void run(); } 默认方法do not count,所以下面这个也是函数接口: @FunctionalInterface public interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) { // the body of this method has been removed } } 静态方法也do not count,所以下面这个还是函数接口: ...

对IoC容器和Bean的学习笔记

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 What We Mean by “Spring” The term “Spring” means different things in different contexts. It can be used to refer to the Spring Framework project itself, which is where it all started. Over time, other Spring projects have been built on top of the Spring Framework. Most often, when people say “Spring”, they mean the entire family of projects. This reference documentation focuses on the foundation: the Spring Framework itself. ...

JavaWeb开发进阶SpringMVC的DispatcherServlet

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 DispatcherServlet简介 DispatcherServlet是Spring MVC框架的核心组件,充当前端控制器(Front Controller)的角色。它负责接收所有的HTTP请求,并将它们分发给适当的处理器(控制器)。DispatcherServlet是整个Spring MVC应用程序的入口点,管理请求的整个生命周期。 通过源码查看DispatcherServlet定义: public class DispatcherServlet extends FrameworkServlet public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware DispatcherServlet继承了FrameworkServlet,继承了HttpServletBean,继承了HttpServlet。HttpServlet来自jakarta.servlet.http.HttpServlet,也就是新版Servlet: <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency> 果然,Spring MVC是基于Servlet的! DispatcherServlet注册 DispatcherServlet是个Servlet,需要注册后才能使用。有3种注册方式:web.xml、Spring MVC、Spring Boot ① web.xml <web-app> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/app-context.xml</param-value> </context-param> <servlet> <servlet-name>app</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>app</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping> </web-app> ② Spring MVC ...

Java官方笔记8泛型

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 泛型 为什么需要泛型?generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. 说白了就像Python动态语言的变量,是动态的,可以指向任意类型。 泛型有个好处是不需要类型转换: List list = new ArrayList(); list.add("hello"); String s = (String) list.get(0); List<String> list = new ArrayList<String>(); list.add("hello"); String s = list.get(0); // no cast 这个例子的泛型,是指List的实现使用了泛型<T>,从而给使用带来了好处。 定义 class name<T1, T2, ..., Tn> { /* ... */ } 比如定义class List<T>,使用List<String> 将以下代码: public class Box { private Object object; public void set(Object object) { this.object = object; } public Object get() { return object; } } 改为泛型实现: ...

SpringBoot官方笔记8其他

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Container Images FROM eclipse-temurin:17-jre as builder WORKDIR application ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmode=layertools -jar application.jar extract FROM eclipse-temurin:17-jre WORKDIR application COPY --from=builder application/dependencies/ ./ COPY --from=builder application/spring-boot-loader/ ./ COPY --from=builder application/snapshot-dependencies/ ./ COPY --from=builder application/application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"] $ docker build --build-arg JAR_FILE=path/to/myapp.jar . Production-ready Features The spring-boot-actuator module provides all of Spring Boot’s production-ready features. <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> Endpoints Actuator endpoints let you monitor and interact with your application. Spring Boot includes a number of built-in endpoints and lets you add your own. For example, the health endpoint provides basic application health information. ...

JavaWeb开发进阶SpringMVC简介

Spring MVC,又称为Spring Web MVC,名字来源于Spring模块spring-webmvc,是一个基于Servlet API开发的Web框架。

Java官方笔记7接口

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 接口 接口只能包含:constants, method signatures(abstract), default methods, static methods, and nested types 方法体只存在于:default methods and static methods 接口不能实例化,只能被类实现,或者被其他接口继承(接口可以多继承)。 定义接口: public interface OperateCar { // constant declarations, if any // method signatures // An enum with values RIGHT, LEFT int turn(Direction direction, double radius, double startSpeed, double endSpeed); int changeLanes(Direction direction, double startSpeed, double endSpeed); int signalTurn(Direction direction, boolean signalOn); int getRadarFront(double distanceToCar, double speedOfCar); int getRadarRear(double distanceToCar, double speedOfCar); ...... // more method signatures } 类实现接口: ...

SpringBoot官方笔记7IO

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Caching Spring Boot auto-configures the cache infrastructure as long as caching support is enabled by using the @EnableCaching annotation. import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; @Component public class MyMathService { @Cacheable("piDecimals") public int computePiDecimal(int precision) { ... } } Before invoking computePiDecimal, the abstraction looks for an entry in the piDecimals cache that matches the i argument. If an entry is found, the content in the cache is immediately returned to the caller, and the method is not invoked. Otherwise, the method is invoked, and the cache is updated before returning the value. ...

JavaWeb开发基础ServletFilter

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Filter是什么 Filter用于对请求和响应进行预处理和后处理。Filter链(Filter Chain)允许多个Filter依次处理同一个请求和响应。 Filter的使用场景 日志记录:记录请求和响应的详细信息,例如请求时间、响应时间、请求参数等 安全检查:检查用户是否有权限访问特定资源,例如验证用户身份、检查用户角色等 压缩:对响应内容进行压缩,例如使用GZIP压缩响应数据 字符编码设置:设置请求和响应的字符编码,例如将请求和响应的字符编码设置为UTF-8 输入验证:对请求参数进行验证,例如检查参数是否为空、参数格式是否正确等 Filter Interface Filter接口有3个方法: package javax.servlet; import java.io.IOException; public interface Filter { void init(FilterConfig var1) throws ServletException; void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; void destroy(); } 容器在启动时创建Filter实例,并调用其init(FilterConfig filterConfig)方法进行初始化。每次请求到达时,容器调用Filter的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法进行过滤。容器在关闭时调用Filter的destroy()方法进行清理。 Filter可以通过两种方式进行配置: 1.在web.xml中配置: <filter> <filter-name>MyFilter</filter-name> <filter-class>com.example.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 如果采用web.xml,那么去掉Filter只需要修改web.xml即可,不需要修改代码。 web.xml在低版本Servlet是必须的,在高版本Servlet已经不再需要。 2.使用注解配置: import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 预处理操作 System.out.println("Request received at " + System.currentTimeMillis()); // 继续执行下一个过滤器或目标资源 chain.doFilter(request, response); // 后处理操作 System.out.println("Response sent at " + System.currentTimeMillis()); } @Override public void destroy() { // 清理操作 } } FilterChain Interface Filter接口的doFilter方法,第3个参数类型是FilterChain,它的定义如下: ...