Spring核心特性
1. 控制反转(IoC)
- 定义:将对象的创建、配置、组装的控制权从应用程序代码中解耦出来,交由IoC容器来完成。
- 作用:
- 解耦
- 提高可测试性
- 简化代码
- 实现方式:
- 基于XML的配置
- 基于注解的配置
2. 依赖注入(DI)
- 定义:IoC的一种具体实现方式,通过容器向对象注入所需的依赖关系。
- 作用:
- 降低耦合度
- 提高灵活性
- 支持多种注入方式(构造器注入、Setter注入、接口注入等)
- 实现:通过IoC容器读取配置文件或注解,自动创建对象并注入依赖。
3. 面向切面编程(AOP)
- 定义:将横切关注点(如日志、事务、安全性等)与核心业务逻辑分离。
- 作用:
- 提高代码可读性
- 增强代码可维护性
- 提高开发效率
- 实现:
- 切面(Aspect)
- 连接点(Join Point)
- 切点(Pointcut)
- 通知(Advice)
- 技术基础:基于代理(JDK动态代理或CGLIB代理)。
4. 声明式事务管理
- 定义:通过声明式方式(如注解或XML配置)来管理事务。
- 作用:
- 简化事务管理
- 提高代码可读性
- 支持多种事务管理器
- 实现:
- 基于注解的事务管理(
@Transactional
) - 基于XML配置的事务管理
- 基于注解的事务管理(
5. 数据访问与集成
- 定义:Spring框架对多种数据访问技术的支持(JDBC、Hibernate、JPA等)。
- 作用:
- 简化数据访问
- 支持多种持久化技术
- 提高开发效率
- 实现:
- JdbcTemplate
- HibernateTemplate
- JpaTemplate
- Repository接口(Spring Data JPA)
Spring MVC
一、Spring MVC简介
Spring MVC是Spring框架中的一个模块,它实现了Web MVC设计模式,用于构建Web应用程序。Spring MVC提供了清晰的角色划分,包括控制器(Controller)、视图(View)和模型(Model),以及将这三者分离的机制。
二、Spring MVC核心组件
-
DispatcherServlet:
- 前端控制器,负责接收HTTP请求,并将其分发到相应的处理器。
-
HandlerMapping:
- 处理器映射器,根据请求的URL找到对应的处理器。
-
HandlerAdapter:
- 处理器适配器,调用处理器的方法处理请求。
-
ViewResolver:
- 视图解析器,将逻辑视图名解析为具体的视图对象。
-
Controller:
- 控制器,处理具体的业务逻辑,并返回模型数据和视图名。
三、Spring MVC工作流程
-
请求接收:
- 客户端发送HTTP请求到DispatcherServlet。
-
请求分发:
- DispatcherServlet通过HandlerMapping找到对应的处理器。
-
处理器处理:
- HandlerAdapter调用处理器的方法,处理请求并返回ModelAndView对象。
-
视图解析:
- ViewResolver将ModelAndView对象中的逻辑视图名解析为具体的视图对象。
-
响应返回:
- DispatcherServlet将视图对象渲染为HTML响应,并返回给客户端。
四、Spring MVC配置示例
1. XML配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 启用Spring MVC注解支持 -->
<mvc:annotation-driven />
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 配置控制器 -->
<bean class="com.example.controller.MyController" />
</beans>
2. Java配置(基于注解)
@Configuration
@EnableWebMvc
@ComponentScan("com.example")
public class WebConfig implements WebMvcConfigurer {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
// 其他WebMvcConfigurer接口方法的实现...
}
3. Spring MVC控制器示例
@Controller
public class MyController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello"; // 返回视图名,对应/WEB-INF/views/hello.jsp
}
}
Spring 注解
一、Spring 常用注解
- @Component:标注一个类为Spring容器中的一个Bean。
- @Repository:标注在DAO层类上,表示该类用于访问数据库。
- @Service:标注在服务层类上,表示该类用于执行业务逻辑。
- @Controller:标注在控制器类上,表示该类用于处理HTTP请求。
- @Autowired:用于自动装配Spring容器中的Bean。
- @Qualifier:与@Autowired注解配合使用,指定需要装配的Bean的名称。
- @Value:用于注入Spring表达式语言(SpEL)表达式或属性值。
- @Configuration:标注配置类,定义@Bean注解的方法实例化Bean。
- @Bean:在配置类中定义Bean,注册到Spring容器中。
- @Profile:指定Bean在哪些环境下可用。
二、Spring MVC 常用注解
- @RequestMapping:用于映射HTTP请求与处理器方法。
- @GetMapping:处理HTTP GET请求的快捷方式。
- @PostMapping:处理HTTP POST请求的快捷方式。
- @PutMapping:处理HTTP PUT请求的快捷方式。
- @DeleteMapping:处理HTTP DELETE请求的快捷方式。
- @PathVariable:用于将URI模板变量绑定到处理器方法的参数上。
- @RequestParam:用于将请求参数绑定到处理器方法的参数上。
- @ModelAttribute:用于将请求参数或表单数据绑定到Model对象上。
- @SessionAttributes:用于声明需要会话范围内存储的Model属性。
三、Spring Boot 常用注解
- @SpringBootApplication:标注在主类上,是@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan的组合注解。
- @SpringBootConfiguration:表明一个类提供了Spring Boot应用配置。
- @EnableAutoConfiguration:告诉Spring Boot基于添加的jar依赖自动配置应用。
- @AutoConfigureAfter:在指定的自动配置类之后应用自动配置。
- @AutoConfigureBefore:在指定的自动配置类之前应用自动配置。
- @ConditionalOnBean:当容器中有指定Bean的条件下应用自动配置。
- @ConditionalOnClass:当类路径下有指定类时应用自动配置。
- @ConditionalOnMissingBean:当容器中没有指定Bean的条件下应用自动配置。
- @ConditionalOnMissingClass:当类路径下没有指定类时应用自动配置。
- @ConditionalOnProperty:当指定的属性具有特定的值时应用自动配置。
四、Spring Cloud 常用注解
- @EnableEurekaClient:用于激活Eureka客户端的配置。
- @EnableEurekaServer:用于激活Eureka服务器的配置。
- @EnableHystrix:用于启用Hystrix断路器功能。
- @HystrixCommand:用于标记一个方法作为Hystrix命令,可以指定回退逻辑等。
- @EnableFeignClients:用于启用Feign客户端的配置,Feign是一个声明式的Web服务客户端。
- @FeignClient:用于标记一个接口为Feign客户端,可以指定服务名称等。
- @EnableZuulProxy:用于启用Zuul API网关的配置。
- @EnableConfigServer:用于启用Spring Cloud Config配置服务器的配置。
- @RefreshScope:用于支持在运行时刷新配置,通常与Spring Cloud Config配合使用。
Spring Boot 自动装配流程
一、概述
Spring Boot的自动装配是Spring Boot框架的核心特性之一,它大大简化了Spring应用的配置和开发过程。通过自动装配,Spring Boot能够根据项目中添加的依赖自动配置Spring应用,使得开发者无需手动编写大量的配置代码。
二、自动装配流程
1. 查找@SpringBootApplication注解的类
Spring Boot应用的入口通常是一个带有@SpringBootApplication
注解的类。这个注解是一个组合注解,它包括了@SpringBootConfiguration
、@EnableAutoConfiguration
和@ComponentScan
三个注解。其中,@EnableAutoConfiguration
注解是自动装配的关键。
2. @EnableAutoConfiguration注解的作用
@EnableAutoConfiguration
注解告诉Spring Boot基于添加的jar依赖自动配置应用。它会导入AutoConfigurationImportSelector
类,这个类负责查找并加载所有符合条件的自动配置类。
3. 自动配置类的查找
AutoConfigurationImportSelector
类会扫描Spring Boot的自动配置jar包中的META-INF/spring.factories
文件。这个文件中列出了所有自动配置类的全限定名。然后,它会根据当前项目的依赖和属性设置,过滤出需要应用的自动配置类。
4. 自动配置类的应用
一旦确定了需要应用的自动配置类,Spring Boot就会将这些类实例化,并将它们注册到Spring容器中。这些自动配置类通常会使用@Conditional
注解来确保它们只在特定条件下被应用。例如,一个自动配置类可能只在某个特定的类存在时才被应用。
5. 自动装配的细粒度控制
虽然Spring Boot的自动装配大大简化了配置过程,但在某些情况下,你可能需要对自动装配进行细粒度的控制。这时,你可以使用@SpringBootApplication
注解的exclude
属性来排除某些自动配置类,或者使用@EnableAutoConfiguration
注解的excludeName
属性来排除特定的自动配置类名。
三、自动装配的示例
假设你创建了一个Spring Boot Web应用,并且添加了spring-boot-starter-web
依赖。Spring Boot会自动配置Tomcat作为内嵌的Servlet容器,并配置Spring MVC。你无需手动编写任何配置代码,就可以启动一个Web应用。
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}