最简洁学完Spring框架

Spring框架

- 怎么学框架

  1. 知道框架能做什么

  2. 框架的语法

  3. 会用后 以后在考虑内部实现

  4. 通过以上步骤 可以自己实现一个框架

一、概述

1. 框架是什么

  • Spring 是一个容器 管理对象,属性赋值,底层使用反射机制

  • 主要是解决企业开发难度

  • 模块之间,类之间的管理解耦合 解决对象之间的关系

  • 核心技术 ioc aop

2. 优点

  • 轻量

  • 针对接口编程 解耦合

  • 支持AOP 面向切面编程

  • 方便集成其他框架 像插座

    3. Spring体系结构

    数据访问 Web AOP 集成 容器 测试

     

image-20210904113452824

二、 IOC控制反转

1. 为什么使用IOC:

目的减少代码的改动,也能实现不同功能 解耦合

2. IOC(控制反转)是一个思想。

  • 控制:对象的创建,赋值,对象关系之间的管理

  • 反转:把开发人员new对象的权利 转移给容器实现

  • 正转:开发人员使用代码中 new对象

  • 容器:是一个服务器软件,一个框架(Spring)

3. IOC的技术实现:

DI实现IOC的功能

DI:依赖注入 只需提供对象的名称 对象创建、赋值等 由容器内部实现

 

三、 入门案例

1. 加入依赖

<!--//Spring依赖-->
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>5.2.5.RELEASE</version>
</dependency>

2.创建类(接口和实现类)

service包下创建接口 imp包下实现类

3. 创建Spring配置文件

<!--在资源目录下 要创建Spring的xml-->
<?xml version="1.0" encoding="UTF-8"?>
<!--beans:根标签 spring把java对象成bean-->
<!--spring-beans.xsd:格式约束文件-->
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    声明bean 告诉spring创建对象
   id:自定义名 spring通过这个名找到对象
   class:全限定名称(不能是接口 必须类)-->
   <bean id="some" class="com.baidu.service.imp.SomeServiceImp"/>
</beans>

4. 测试使用对象

//ApplicationContext:是Spring的容器 通过容器获取对象
//ClassPathXmlApplicationContext:类路径加载Spring配置文件
ApplicationContext app =
new ClassPathXmlApplicationContext("beans.xml");

//getBean方法:获取
xxxx xx =
(xxxx)app.getBean("配置文件中的bean的id");

5. 注意点:

spirng: 创建对象的时间:创建spring的容器时,创建beans的所有对象

spring: 默认调用无参构造

获取容器中对象的信息api:

getBeanDefinitionCount(): 获取定义的对象数量

getBeanDefinitionNames():获取所有定义对象的名称

 

四、 DI实现语法

1. 通过spring完成 属性赋值

基本类型和String在这属于简单类型

引用

xml和注解注入区别:

经常需要修改的 xml否则 注解

xml 代码和值 完全分开

但是代码比较多 不够直观

注解 快 方便 可读好

但是在代码内 修改比较麻烦

1.1 基于XML的DI实现

spring 配置文件中,使用标签和属性

set注入

spring 调用类的set方法 必须有

//在spring配置文件bean中为属性赋值
//实际调用set方法
<property name="属性名" value="值 都要加引号"/>

//引用类型
<property name="属性名" ref="time"/>
<bean id="time" class="java.util.Date"/>

 

构造注入

调用类的有参构造方法

<constructor-arg 
   name="构造方法的新参名"
   index="从0开始 构造方法参数位置"
   ref="引用"
   value="简单类型值"/>
//还有个省略index 但是要按方法参数位置

 

1.2 基于注解的DI实现

实现步骤
  1. 加依赖

  2. 创建类 加注解

  3. 创建spring配置文件 声明组件扫描器

    //输入com 就会出来
    <context:component-scan base-
    package="包名"/>
    //指定包 三种方式
    //一个一个
    //   分号;间隔
    //       指定父包

 

注解
@Component 创建对象
  • 类上使用

  • 创建对象 value(可省略)= bean.id

  • 不提供名称 默认首字符小写类名

@Respotory
  • 持久层 dao

@Service
  • 业务层 service

@Controller
  • 控制器类

以上三种 跟Component一样创造对象 但是有额外含义

项目对象 分层的

 

@Value 简单赋值
  • set或属性上使用 value = "值"

@Autowired 引用赋值
  • 属性或set上

  • 按类型自动注入

  • //按名自动注入
    @Autowired
    @Qualifier("对象名")
    //如果对象名错了 required = true 赋值无 null
    //如果对象名错了 required = false 报错
    @Autowired(required = false)
    @Qualifier("对象名")
@Resource
  • 是JDK中的自动注入注解 需要加入依赖

  • 自动先用byName再用byType

  • 如果要知道注入方式 加 name属性= "方式"

set注入

spring 调用类的set方法 必须有

构造注入

调用类的有参构造方法

1.3 引用类型自动注入

byName(按名注入):
//类的属性名和spring配置文件bean id名一致 类型一致
<bean id=""class="" autowire="byName">
   //简单类型赋值 引用自动
</bean>
byType(按类型注入):
//spring配置文件bean class类型一致或父子接口类关系
//唯一bean
<bean id=""class="" autowire="byType">
   //简单类型赋值 引用自动
</bean>

 

1.4 多个配置

1.优点

  • 文件小 效率高

  • 避免多人使用冲突

  1. 按功能模块

  2. 按类的功能

2.使用

//创建一个Srping主配置文件total.xml
//里面包含其他配置文件spring-*.xml
//一般不定义对象
<import resoutce = "classpath:路径.xml">
   
//可以使用通配符*
//不能包含total.xml
//需要在目录下才能使用
<import resoutce = "classpath:spring-*.xml">

使用属性配置文件 注入

//主配置文件
//${xxx}
<context:property-placeholder location="classpath:xxx.properties"/>

五、 AOP

在代码不变的情况下 增加方法里面的功能

CGLIB代理 继承

JDK动态代理 接口

实现步骤:

1.创建目标类
2.创建InvocationHandler接口实现类
public class MyHandler implements InvocationHandler {
//目标对象
  Object target = null;

  public MyHandler(Object target) {
      this.target = target;
  }

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  //返回对象
      Object res = null;
      //方法执行前
      MyTools.doTime();
      //目标对象,方法集
      ob = method.invoke(target,args);
      //方法执行后
      MyTools.doTrans();
      return res;
  }
}
3.实现目标类增加功能
4.使用jdk中Proxy 创建代理对象
接口 my = new 实现类();
       InvocationHandler handler = new MyIncationHandler(my);
       My proxy = (My) Proxy.newProxyInstance(my.getClass().getClassLoader(),
               my.getClass().getInterfaces(),
               handler);
proxy.xxx();

 

posted @ 2021-09-04 20:28  向晚·  阅读(61)  评论(0)    收藏  举报