Spring的使用
1、Spring是什么
Spring这个框架最大的功能 就是能够为业务逻辑层 提供事务 整合第三方框架 他相当于是所有框架之间的粘合剂 也就是说 这个鬼就像我们的胶水 一样能够把其他的框架 整合到一起
2、Spring能干什么
Spring确实很强大,能做的事情也很多,比如:可以为业务逻辑层提供事务
、能够整合
第三方框架、可以为Controller
以及DAO
提供解决方案、也还提供了AOP
编程的这种思想、也实现了对象依赖的解藕
等等很多很多。
3、Spring 家族都有哪些产品
Spring
主要作用:整个Spring家族中最重要的一个框架 其他框架都是存在于这个框架之上来进行开发的,其他的框架都会对Spring这个框架形成依赖
Springboot
主要作用:这个是在开发中专门用来简化配置
的 原来可能你需要写 10个配置文件现在可能就只写几句代码就搞定了
SpringSecurity
主要作用:像我们原来的项目的 登陆 和 认证 自己写的代码 现在不需要写了 直接使用这个框架就搞定了…
SpringData
主要作用:这个框架一般和 JPA一起使用 SpringData JPA 到今天依然有很多公司在用 (CRUD)
SpringCloud(X)
这个是用来最微服务项目的开发的等…
4、Spring中的七大模块
Core:
- 这个是Spring的核心模块 主要功能
IOC
(控制反转)、DI
(依赖注入)
AOP:面向切面编程
- 就是将你以前的重复代码
抽取
城一个类 然后原来程序在正常运行的时候动态的植入
我们抽取出来的代码的这种编程思想 就叫做面向切面编程
Web MVC:这个模块就是传说中的 SpringMVC
Web:Spring这个框架对Web开发的支持
Context:
- 上下文模块(这个就是类似一个类 这个类中保存了 程序运行的
所有
信息 通过这个类就可以找到 我们程序运行过程中的所有
数据)
DAO:这是Spring提供了对数据库访问的支持(JdbcTemplate
这个鬼类似于咋们的dbutils
的使用)
ORM:O
:Object R
:Relation M
:Mapping 对象关系映射
学过Hibernate的人:Hibernate是一个ORMapping
框架; 对象关系映射?:Java对象 通过映射
关系 映射到 数据库表中
Spring整合
第三方的数据库访问框架的 (Hibernate mybatis toplink …)
5、Spring中配置文件的编写
创建类的对象: Spring
创建完对象之后 会放到一个容器中这个容器就叫做 IOC
容器 或者 单例池
id:给这个对象整一个唯一
的标识
name:给生成的对象弄个名字
class:要生成那个类的对象
scope:这个表示的是生成对象是单例
还是多例
呢?
singleton:表示生成的是单例(单例会放到容器
中)
prototype:这个表示的是生成这个对象是多例的(是不会放到容器中的)
init-method:当我们的对象放到IOC容器去之后 如果要进行初始化的操作 那么就调用这个后面的方法
destroy-method:当这个对象在IOC容器中要进行销毁的时候 要执行的方法
<bean name="user" class="com.xxx.pojo.User" scope="singleton"
init-method="init" destroy-method="destory" lazy-init="false">
</bean>
6、 Spring中的IOC
IOC:控制反转
IOC这个概念:
- IOC:谁控制了谁? 原来创建对象的是程序员
自己
来完成的 学习了Spring之后 我们的对象创建 就交给Spring
来完成也就是Spring控制了 Java对象的这个创建 - 什么东西反转了呢?
创建对象的权利
反转了 原来由程序员自己来完成 现在由Spring来完成
说白了Spring帮你创建对象…
7、Spring中的DI
DI:依赖注入
谁依赖于谁?
我们暂时可以这样去认为:
你可以认为 Controller
是依赖于Service
、我们的Service
依赖于DAO
、我们的DAO
依赖于DB
如果是一个类中 维护了另外一个类的实例对象 那么我们就可以认为 维护
的这个类 依赖于 被维护
的这个类
注入了什么东西呢?
注入的是 类的实例对象 还可以是具体
的值 简单的说 啥都
可以可以注入
注入:说白了 就是给成员变量赋值 他这个赋值 不是随便赋值 这个值 必须 位于IOC容器
8、Spring中如何使用注解的模式完成上述功能
既然他们都是将类的对象放到IOC容器中去 那么类的对象的名字是啥呢?
默认情况下 类名首写字母小写、你也可以单独的跟他们设置个名字
下面三个注解的作用都是将下面的类的对象放到IOC容器中去:
@Service()
@Repository()
@Component()
他是爹 @Service和@Repository是孩子 没区别 语义化了标签
@Scope(value = "prototype")
设置这个类生成单例还是多例呢
@Lazy(value = true)
是否懒加载这个类
@Autowired
先根据类型去找对象 如果找到多个 那么再通过名字去找对象
@Resource
先通过名字去找 如果名字没找到 再通过类型找
@PostConstruct
类的对象放到IOC容器去之后要做初始化操作
@PreDestroy
类对象在IOC容器中销毁的时候 要进行资源回收的操作
9、代理的设计模式
设计模式:就是为了实现某一个功能 所总结出的一个好的方法和步骤
说白了:设计模式就是为了实现 某一个功能的?
代理的设计模式是为了实现什么功能呢?
其实就是为了动态
的监控
一个类中方法在什么时候执行, 以及能在方法的执行
前后动态的植入
我们的代码
1、编写代理类和被代理的类 实现相同的接口
2、在代理类中维护被代理的类的对象
3、在构造器中进行被代理类的初始化
4、在相同的名字方法中 调用被代理类中的相同的名字的方法
5、在代理类中调用被代理的类的方法的时候 就可以进行方法的增强了
-
9.2、动态代理
动态代理
相当于是静态代理
的实现 只不过 在JDK中已经帮你实现了 所以动态代理 还有一个名字JDK代理
Proxy.newProxyInstance(?, ?, ?) /** * 第一个参数类加载器:这个固定的写法 被代理的类.class.getClassLoader() * 类加载器是用来干嘛的? 记住这个类加载器 是用来 加载类的 找类的 * 第二个参数:当前这个代理的类实现的接口 * 1>、被代理的是类 被代理的类.class.getInterfaces() * 2>、被代理的是接口 new Class[]{被代理的接口.class} * 第三个参数:监控这个类中方法在什么时候 进行调用 * new Invocationhandler{ * ... invoke().... * } */
-
9.3、CLGLIB代理
- 无论是
动态代理
还是静态代理
都有一个代理的前提 是我们代理的这个类必须
实现接口, 假设现在有一个普通的类 我们想对这个普通的类 实现增强 那么怎么办呢? CGLIB代理就应运而生了…
简单的说CGLIB代理
说的问题是:一个类没有
实现接口也可以
写代理
public class UserServiceProxyFactory implements MethodInterceptor{ /** * 这个位置就是生成代理类的地方 */ public UserService getUserServiceProxy(){ Enhancer enhancer=new Enhancer(); //给生成的类整个爹 enhancer.setSuperclass(UserService.class); //要监控他爹里面的方法在什么时候 进行调用 enhancer.setCallback(this); return (UserService) enhancer.create(); } /** * 专门用来拦截监听我们类中的方法在什么时候调用 */ @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { String name = method.getName(); System.out.println("当前执行的方法是:"+name); //执行的是 被代理的类中的方法 Object invoke = method.invoke(new UserService(), objects); return invoke; }
- 无论是
10、AOP
AOP:是一种编程思想 这种编程思想类似于咋们的面向对象 和 面向过程
AOP
究竟说的是啥? 简单的说 就是我们在写代码的时候 有可能
存在代码的重复
(冗余
) 这个时候 我们可以将这个代码抽取
出来 专门放到一个类的方法中 ,然后当代码正常运行的时候 通过代理的设计模式动态
的植入我们的代码的这个编程思想 就叫做面向切面编程
在开发中你们有没有想过一个问题:就是我们的事务 如何控制?
在正常的开发中 我们的事务
不是添加到 DAO
层 而是添加到 Service
层的 因为 一个业务的成功才代表了 一次操作的成功 所以在业务逻辑层上 应所有的业务 都应该有 打开事务
和 提交事务
的这个操作
简单点说 就是 每一个业务逻辑层
的方法上 都有 打开事务
和提交事务
的操作 如果是每一个方法我们都自己去写的话 那么代码会存在 冗余 那么这个时候AOP
就可以实现这个功能了