Spring初识(详解)

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的使用)

ORMO: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、代理的设计模式

设计模式:就是为了实现某一个功能 所总结出的一个好的方法和步骤

说白了:设计模式就是为了实现 某一个功能的?

代理的设计模式是为了实现什么功能呢?

其实就是为了动态监控一个类中方法在什么时候执行, 以及能在方法的执行前后动态的植入我们的代码

  • 9.1、静态代理
    • 静态代理动态代理都有一个代理的前提
    • 这个代理前提就是 这个被代理的类 必须实现接口 如果没有实现接口的话 那么这个代理是无法实现的
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就可以实现这个功能了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值