spring框架:为了简化服务器开发,使现有技术更加容易使用,本身使一个大杂烩。
开源免费的容器、轻量级、非入侵式框架
控制反转IOC 面向切面编程AOP
支持事务初级,对框架整合的支持
SSH:struct2+Spring+Hibernate
SSM:SpirngMvc+Spring+Mybatis
SpringBoot
一个快速开发的脚手架,快速的开发单个微服务
SpringCloud
基于SpringBoot实现的
大多数公司都在使用SpringBoot,学习SpringBoot前提,完全掌握Spring、SpringMvc
配置
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.13</version>
</dependency>
控制反转是一种通过描述(xml或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入。
id : 是bean的唯一标识符,相当于对象名
class : bean对象所对应的全限定名
name : 就是别名,可以取多个别名
构造器注入,set方式注入,依赖注入
普通值注入 使用value
Bean注入,(其他类)使用ref
//数据类型注入方式
<bean id="user" class="com.controller.pojo.User" scope="singleton">
<!-- 普通set注入-->
<property name="id" value="111111"/>
<!-- 数组等注入 ref-->
<property name="address">
<array>
<value>123546</value>
</array>
</property>
<!-- list 注入-->
<property name="list">
<list>
<value>111111,22222</value>
</list>
</property>
<!-- map注入-->
<property name="map">
<map>
<entry key="0" value="000"></entry>
<entry key="1" value="111"></entry>
</map>
</property>
</bean>
bean的作用域
scope: singleton 单例模式(spring默认机制) 、 property 原型模式(每次从容器中get都会产生一个新对象)
自动装配:
byName:根据名称(名称肯定都是唯一)
byType:根据类型(但是必须类型唯一)
//根据名称查找
<bean id="user" class="com.controller.pojo.User" autowire="byName">
<!-- 普通set注入-->
<property name="id" value="111111"/>
</bean>
注解实现自动装配
在成员变量上使用Autowired注解
在构造器上使用Autowired注解:
在普通方法上加Autowired注解:方法会在项目启动时,实现一次
可以在构造器的入参上加Autowired注解:
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!-- 开启注解支持-->
<context:annotation-config />
@Autowired 注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
按照Autowired默认的装配方式:byType,是无法解决找个多个对象问题(单例模式),这时可以改用按名称装配:byName。
-
@Autowired
-
@Qualifier("user1")
-
private User user;
-
Qualifier意思是合格者,一般跟Autowired配合使用,需要指定一个bean的名称,通过bean名称就能找到需要装配的bean。
当我们使用自动配置的方式装配Bean时,如果这个Bean有多个候选者,假如其中一个候选者具有@Primary注解修饰,该候选者会被选中,作为自动配置的值。
@Resource默认按byName自动注入。
既不指定name属性,也不指定type属性,则自动按byName方式进行查找。如果没有找到符合的bean,则回退为一个原始类型进行进行查找,如果找到就注入。
只是指定了@Resource注解的name,则按name后的名字去bean元素里查找有与之相等的name属性的bean。
只指定@Resource注解的type属性,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。
属性注入
@Value("1111") public void setName(String name) { this.name = name; }
@Component有几个衍生的注解 在web开发中 将mvc三层架构分层
dao @Repository
service @Service
controller @Controller
将某个类注解到spring中 装配bean
xml用来管理bean
注解用来注入bean
代理模式 SpringAOP的底层 springaop springmvc
静态代理:
抽象角色 :使用接口或者抽象类
public interface Rent { public void rent(); }
真实角色 :被代理的角色
//房东 public class Host implements Rent { @Override public void rent() { System.out.println("房东租房....."); } }
代理角色 :代理真实角色
//代理角色也要帮房东租房子 public class Proxy implements Rent{ private Host host; public Proxy(Host host) { this.host = host; } public Proxy() { } @Override public void rent() { seeHouse(); host.rent(); fare(); } //看房 public void seeHouse(){ System.out.println("中介带看房"); } //收中介费 public void fare(){ System.out.println("中介收费"); } }
客户:访问代理对象的人
public class Client { public static void main(String[] args) { //房东要租房 Host host = new Host(); //代理 中介帮房东租房子 代理角色有一些附属操作 Proxy proxy = new Proxy(host); proxy.rent(); } }
好处:可以使真实角色的操作更加纯粹,不用关注一些公共业务,公共业务交给代理角色,公共业务发生变化可以集中处理
动态代理:
动态代理代理类是自动生成的
基于接口动态代理 JDK动态代理
基于类的动态代理 cglib代理
Java字节码 javasist
Aop 提供声明式事务 允许用户自定义切面
横切关注点:跨越应用程序多个模块的方法或功能,
切面:横切关注点 被模块化的 特殊对象 是一个类
通知:切面必须要完成的工作 是类中的一个方法
目标:被通知对象
代理:想目标对象应用通知之后创建的对象
切入点:切面通知执行的地点的定义
连接点:与切入点匹配的执行点
使用原生的Spring API 接口
配置AOP
<!-- 使用原生spring API接口-->
<!-- 配置aop-->
<aop:config >
<!--切入点:expression 表达式 execution( 要执行的位置 ) -->
<aop:pointcut id="pointcut" expression="execution(* com.controller.service.UserServiceImpl.*(..))"/>
<!--执行环绕增强-->
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>
自定义类实现aop
需要开启注解支持
<!--方式三-->
<bean id="anno" class="com.controller.DIY.AnnotationPoinCut"/>
<!-- 开启注解支持-->
<aop:aspectj-autoproxy/>
回顾事务:把一组业务当成一个业务
要么都成功 要么都失败
ACID原则
.原子性
.一致性
.隔离性 多个业务可能操作同一个资源 防止数据损坏
.持久性 事务一旦提交,无论系统发生什么问题,结果都不会在被影响,被持久化的写道存储器中
事务管理分为
声明式事务:AOP
编程式事务:在代码中进行事务的配置