Spring
IOC
概念
将创建对象的过程交给容器, 哪方面被反转了? 获取对象的过程被反转 依赖注入
DI IOC容器在运行时,动态的将依赖关系注入到我们的对象中
作用
创建bean
注入对象
管理生命周期
使用
注册bean
- xml注册 第三方的需要用xml注册
- 注解方式 针对自己写的类
- Java Config
- @Configuration 类上使用
- @Bean 在方法上面使用
XML
-
属性
id 和 name : 给注入的bean设置键 必须唯一的
class : 包名+类名
-
scope
可选值 说明 singleton 单例 默认 prototype 每次从容器中获取对象都是重新创建对象 lazy-init 使用的才会去创建对象
<bean id=="" class="" scope= "" lazy-init="false" init-method="指定初始化方法" destroy-method="指定销毁方法"> </bean>
第三方框架的配置需要用到
构造方法
constructor-args
参数的处理
根据类型去赋值
根据索引去赋值
根据名字赋值
值的处理
value 针对的是基本类型
ref 指定一个容器中的对象
属性
java对象
public class User{
private String username;
private String password;
private Detail detail;
private List<String> list;
private Map<String,String> map;
public User(){
}
public User(String username,String password,Detail detail){
}
}
public class Detail{
private String phone;
}
xml配置
<bean id="user" class="User">
<contructor-args name="username" value="admin"> </contructor-args>
<contructor-args name="detail" ref="detail" > </contructor-args>
</bean>
<bean id="detail" class="Detail">
</bean>
<bean id="user" class="User">
<property name="username" value="1234"/>
<property name="detail">
<ref bean=""/>
</property>
</bean>
<bean id="detail" class="Detail">
</bean>
注解注册
注: 扫描包 公司域名 + 应用程序的名称 com.qf.smart
主配置文件里面
<context:component-scan basePackage=" com.qf.smart" />
在类上使用注解
- Component("设置ID")
- Controller
- Service
- Repository
Java Config
@Configuration
public class TestConfig(
@Bean
public User user(){
User user = new User()
user.setUsername("123");
return user;
}
)
注入对象
Autowired
- spring自带
说明
根据类型去容器中查找依赖的bean
属性
属性 | ||
---|---|---|
required | true 表示运行时对象不能为null | |
作用域
- 使用在类的属性上(循环注入)
- 使用在构造方法上
- 使用在set方法上
Resource(个人推荐)
- jsr-250
说明
根据名字查找(根据属性的名称) 如果没有找到直接通过类型去查找
属性
属性 | 说明 | |
---|---|---|
name | 根据容器中的id查找依赖的bean | |
type | 根据类型查找相关的bean | |
作用域
- 属性上使用
- 构造方法上使用
- set方法上使用
AOP
概念
在不修改源代码以及调用方式的情况下对方法增强
将横切在功能模块中的公共的功能模块提取出来
执行代码的方式
作用
- 解耦
- 维护性
实现原理
动态代理
- jdk动态代理
- cglib的动态代理
Spring-AOP实现方式
- 基于代理的AOP
- 纯POJO切面
- 基于AspectJ注解驱动的切面
应用场景
- 权限管理(权限的框架 Shiro Security)
- 日志
- 事务
- 全局异常处理
- 缓存等等
基础概念
概念 | 说明 | |
---|---|---|
切面 | 定义的一个类(代理类),定义切入点和通知 | |
切入点 | 告诉通知在什么地方插入代码 | |
通知 | 插入什么样代码 5种 前置通知 ,返回通知,后置通知 异常通知,环绕通知 |
使用
导入包
spring-aspects
定义切面
@Aspect
public class TestAspect(
@Pointcut("切入点表达式")
public void pointcut(){
}
@Before()
public void before(){
2
}
@After()
public void test1(){
5
}
@AfterReturning("")
public void t2(){
4
}
@AfterThrowing("")
public void t3(){
4
}
@Around("")
public void t3(pj){
1
pj.process()3
6
}
)
5.2.7
5.2.7以下
- 环绕前置操作
- 前置通知
- 核心方法
- 环绕后置
- 后置通知
- 返回通知或者异常通知
补充
切入点表达式
*
..
方法修饰符 返回值 包名+类名+方法名(参数列表)
基于注解
事务
SpringMVC(Servlet)
概要
对传统的Servlet进行封装,主要针对的是控制
基础使用
导入相关包
spring-webmvc
配置信息
前后端分离不分离 生成json数据
- 扫描包
- 开启springmvc注解支持
- json的配置
<context:component-scan basePackage="主包名+控制层">
<mvc:annotation-driven/>
web.xml配置
<servlet>
<servlet-class>DispathcerServlet</servlet-class>
<init_param>
<param-name>c<param-name>
<param-value>spring-mvc.xml</param-value>
</init_param>
</servlet>
<servlet-mapping>
</servlet-mapping>
编写控制层代码
@RestController
public class HelloController{
@ReqeustMapping("/test")
public String test(int id){
return "hello"
}
}
重要注解
ReqeustMapping
作用
访问地址跟方法的映射,能使用在类或者方法上面
属性
-
属性 说明 value 映射的路径 method 八种请求方式 get post put delete head
对参数的处理
-
普通参数处理
- 基本
- 对象
- 嵌套对象(建议客服使用json上传)
-
参数相关的注解
-
ReqeustParams
作用
- 起别名
- 必要参数
- 设置默认值
属性
属性 说明 value 给参数起别名 required 必要参数 默认是true ,如果设置了默认值,该参数是false defaultValue 提供默认值 -
RequestBody
作用
接受请求体中的内容 post请求里接受客服端传递过来的json数据
属性
属性
属性 说明 required 必要参数 默认是true ,如果设置了默认值,该参数是false -
需要导入json处理依赖
jackson
fastjson
@PathVariable动态路径
作用
获取动态路径中的值,主要用于get请求
使用
-
如何定义
/{变量}/{变量}/....
-
如何获取相关的值
@PathVariable(value="变量") String xxx
属性
属性 说明 value 表示变量的名称 栗子
@RestController public class TestPathVariable{ @RequestMapping("/{uid}") public String test(@Pathvariable() int uid){ return uid + ""; } }
-
对返回值的处理
文件上传
拦截器
Mybatis(DAO)
关联查询
动态SQL
SSM整合
spring+mybatis整合
核心配置
- 注册SqlSessionFactoryBean
- 注册 MapperScanConfig
- 注册Druid
第一步 导入相关的依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<!-- mybatis 相关依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<!-- 数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!-- json核心依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
第二步配置spring-mybatis
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- spring 加载properties文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--
1. 注册 SqlSessionFactoryBean
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 1初始化核心配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 2. 注册所有的mapper.xml文件-->
<property name="mapperLocations" value="classpath:mapper/**/*.xml"/>
<property name="typeAliasesPackage" value="com.smart.ssm.entity"/>
<!-- 3 . 注册 连接池对象-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 2. 注册所有的Mapper接口-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.smart.ssm.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!-- 3. 注册连接池对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc_url}"/>
<property name="username" value="${jdbc_user}"/>
<property name="password" value="${jdbc_password}"/>
<property name="filters" value="stat"/>
<property name="maxActive" value="20"/>
<property name="initialSize" value="1"/>
<property name="maxWait" value="60000"/>
<property name="minIdle" value="1"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="minEvictableIdleTimeMillis" value="300000"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>
<property name="asyncInit" value="true"/>
</bean>
</beans>
db.properties
jdbc_url=jdbc:mysql://119.23.190.71:3306/db_mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
jdbc_user=root
jdbc_password=root
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 在控制台打印SQL 上线的时候需要关闭-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>
spring+springmvc整合
主要配置
- 扫描controller包
- 开启springmvc注解支持
spring-context.ml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.smart.ssm.controller"/>
<mvc:annotation-driven>
<!-- json-->
</mvc:annotation-driven>
<!-- 文件上传相关-->
</beans>
spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.smart.ssm">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>