Spring简单整理 上

明日复明日,明日何其多,我生待明日,万事成蹉跎。


1. 简介

  • 以interface21为基础

  • 使现有的技术更加容易使用

  • 整合了现有的技术框架

  • SSH: Struct2 + Spring + Hibernate

    SSM: SpringMvc + Spring + mybatis

  • 优点:

    • Spring是一个开源的免费的框架
    • Spring是一个轻量级的、非入侵式的框架
    • 控制反转IOC,面向切面编程AOP
    • 支持事物的处理,对框架整合的支持
  • 组成:

  • 拓展

    • Spring Boot —— Build Anything

      • 一个快速开发的脚手架
      • 基于SpringBoot可以快速的开发单个微服务
      • 约定大于配置
    • Spring Cloud —— Coordinate Anything
      • 基于SpringBoot 实现
    • Spring Cloud Date Flow —— Connect Everything
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version>
</dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.0.RELEASE</version>
</dependency>

2. IOC控制反转

spring_01_ioc

  • 是一种思想
  • 依赖注入DI是实现IoC的一种方式
  • 一种通过描述(XML或注解)并通过第三方生产或获取特定对象的方式

3. helloSpring

要实现不同的操作,只需要在xml配置文件中进行操作

1. 父工程的pom.xml

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version></dependency>
</dependencies>

2. 实体类Hello

package com.magician.pojo;public class Hello {public String str;public String getStr() {return str;}public void setStr(String str) {this.str = str;}@Overridepublic String toString() {return "Hello{" +"str='" + str + '\'' +'}';}
}

3. beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--使用spring来创建对象,在Spring这些都成为Beanid = 变量名class = new 的对象property 相当于给对象中的属性设置一个值valueref : 引用spring的容器中创建好的对象--><bean id="hello" class="com.magician.pojo.Hello"><property name="str" value="Spring" /></bean>
</beans>

4.测试类

import com.magician.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {public static void main(String[] args) {// 获取spring的上下文对象ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 对象现在都在spring中管理Hello hello = (Hello) context.getBean("hello");System.out.println(hello.toString());}
}

* ref情况下的beans.xml 样例

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="mysqlImpl" class="com.magician.dao.UserDaoMysqlImpl" /><bean id="userImpl" class="com.magician.dao.UserDaoImpl" /><bean id="userService" class="com.magician.service.UserServiceImpl"><!--ref: 引用spring容器中创建好的对象--><property name="userDao"  ref="userImpl" /></bean></beans>

4. IOC创建对象的方式

  1. 使用无参构造创建对象,默认实现!

  2. 假设我们要使用有参实现:

    • 第一种 index 下标赋值

      <bean id="user" class="com.magician.pojo.User"><constructor-arg index="0" value="lover" />
      </bean>
      
    • 第二种,type

      <bean id="user" class="com.magician.pojo.User"><constructor-arg type="java.lang.String" value="second" />
      </bean>
      
    • 第三种 name 直接通过参数名

      <bean id="user" class="com.magician.pojo.User"><constructor-arg name="name" value="third" />
      </bean>
      
  3. 在配置文件加载到时候,容器 (beans.xml)中管理的对象就已经初始化了

    public class MyTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");User user = (User) context.getBean("user");User user2 = (User) context.getBean("user");System.out.println(user == user2);  // true}
    }

5. Spring配置说明

5.1 alias

<alias name="user" alias="woyebuzhidao" />

5.2 bean

<!--id: bean的唯一标识符class: bean对象所对应的权限定名name: 也是别名,而且name可以同时取多个别名 【bean中的name】-->
<bean id="userT" class="com.magician.pojo.UserT" name="user2, u2"><property name="name" value="西部开源"/>
</bean>

5.3 import

一般用于团队开发使用,它可以将多个配置文件导入合并为一个

<import resource="beans.xml"/>
<import resource="beans2.xml"/>

6. 依赖注入 DI

6.1 构造器注入

4.2 三种方式

6.2 Set方式注入

  • 依赖:bean对象的创建依赖于容器

  • 注入:bean对象中的所有属性,由容器注入

  • 环境搭建

    1. 复杂类型
    2. 真是测试对象
  • <bean id="address" class="com.magician.pojo.Address" /><bean id="student" class="com.magician.pojo.Student"><!--第一种,普通注入 value --><property name="name" value="magician" /><!--第二种, bean注入 ref --><property name="address" ref="address" /><!--第三种,数组注入: --><property name="books"><array><value>english</value><value>scientist</value><value>CET4</value><value>technich</value></array></property><!--第四种,list注入--><property name="hobbys"><list><value>睡觉</value><value>看书</value></list></property><!--第五种 map--><property name="card"><map><entry key="身份证" value="121412"/><entry key="银行卡" value="affafk" /></map></property><!--第六种 set--><property name="games"><set><value>LOL</value><value>王者荣耀</value></set></property><!--第七种 Null and empty--><property name="wife"><null /></property><!--第八种 properties 特殊类型--><property name="info"><props><prop key="学号">124791284</prop></props></property>
    </bean>
    

6.3 拓展方式注入

  • the p-namespace

    <?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.magician.pojo.User" p:age="12" p:name="yuanxiao"/>
    </beans>
    
  • the c-namespace

    <?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:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--C 命名空间--><bean id="user2" class="com.magician.pojo.Student" c:age="18" c:name="test" />
    </beans>
    

6.4 Bean scope

7. Bean的自动装配

  • 自动装配式spring满足bean依赖的一种方式
  • spring会在上下文中自动寻找,并自动给bean装配属性

在Spring中有三种装配的方式:

  1. 在xml中显示的配置
  2. 在java中显示配置
  3. 隐式的自动装配bean !important

7.1 测试

  • byName: 会自动在容器上下文查找,和自己对象set方法后面的值对应的 beanid

    <bean id="cat" class="com.magician.pojo.Cat" />
    <bean id="dog" class="com.magician.pojo.Dog" />
    <bean id="people" class="com.magician.pojo.People" autowire="byName" ><property name="name" value="kuang shen" />
    </bean>
    
  • byType:会自动查找和自己对象属性类型相同的bean

    <bean id="cat" class="com.magician.pojo.Cat" />
    <bean id="dog1" class="com.magician.pojo.Dog" />
    <bean id="people" class="com.magician.pojo.People" autowire="byType" ><property name="name" value="kuang shen" />
    </bean>
    

7.2 使用注解实现自动装配

默认为byName方式

要使用注解须知:

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config />
</beans>
public class People {@Autowiredprivate Cat cat;@Autowiredprivate Dog dog;private String name;
}
  • @Autowired

  • @Resource

8. spring注解开发

  1. bean

    <!--指定要扫描的包,这个包下的注解就会生效-->
    <context:component-scan base-package="com.magcian.pojo"/>
    <context:annotation-config />
    
    package com.magcian.pojo;
    import org.springframework.stereotype.Component;
    @Component
    public class User {public String name = "yuanxiao";
    }
  2. 属性如何注入

    @Component
    public class User {@Value("guesss")public String name = "yuanxiao";
    }
    
  3. 衍生的注解

    @Component有几个衍生注解,我们在web开发中,会按照mvc三层架构来分层。

    • dao 【@Repository]
    • service [@Service]
    • controller [@Controller]
    • pojo [@Component]
  4. 自动装置的配置

  5. 作用域 【@scope()】

    @Component
    @Scope("prototype")
    public class User {@Value("guesss")public String name = "yuanxiao";
    }
    

9. 使用java的方式配置spring

JavaConfig是Spring的一个子项目,在Spring4之后,成为了一个核心功能。

实体类:

package com.magcian.pojo;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;@Component
public class User {@Value("guesss")public String name;public String getName() {return name;}
}

配置文件

@Configurable
@ComponentScan("com.magician.pojo")
public class MyConfig {// 注册一个bean,就相当于我们之前写的一个bean标签@Beanpublic User getUser(){return new User();}
}

测试类:

public class MyTest {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);User getUser = (User)context.getBean("getUser");System.out.println(getUser.getName());}
}

10. 代理模式

SpringAOP的底层!【SpringAOP 和 SpringMVC】

10.1 静态代理

角色分析:

  • 抽象角色
  • 真实角色
  • 代理角色
  • 客户

10.2 动态代理

  • 动态代理和静态代理角色一样
  • 动态代理的代理类是动态生成的,不是我们直接写好的
  • 动态代理分为两大类:
    • 基于接口的动态代理
    • 基于类的动态代理
    • Java字节码 JAVAssist
  • 需要了解2个类:Proxy、InvocationHandler
private Object target;
public void setTarget(Object target){this.target = target;
}
// 生成得到代理类
public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
}
// 处理代理实例,并返回结果
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable{Object result = method.invoke(target, args);return result;
}

11. AOP 面向切面编程

<dependencies><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency>
</dependencies>

使用Spring实现AOP:

  • 使用Spring接口

    applicationContext.xml

    <?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:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"><!--注册bean--><bean id="userService" class="com.magician.service.UserServiceImpl" /><bean id="log" class="com.magician.log.Log" /><bean id="afterLog" class="com.magician.log.AfterLog" /><!--配置aop--><aop:config><!--切入点 execution(要执行的位置)--><aop:pointcut id="pointcut" expression="execution(* com.magician.service.UserServiceImpl.*(..))"/><!--执行环绕增加--><aop:advisor advice-ref="log" pointcut-ref="pointcut"/><aop:advisor advice-ref="afterLog" pointcut-ref="pointcut" /></aop:config>
    </beans>
    

    Test.java

    public class MyTest {public static void main(String[] args) {// 获取spring的上下文对象ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 对象现在都在spring中管理UserService hello = (UserService) context.getBean("userService");hello.add();}
    }
    

    Log.java

    public class Log implements MethodBeforeAdvice {/** method: 要执行的目标对象方法* objects: 参数* o: 目标参数* */@Overridepublic void before(Method method, Object[] objects, Object o) throws Throwable {System.out.println(objects.getClass().getName() + "的" + method.getName() + "被执行了");}
    }
    
  • 自定义类

  • 注解实现AOP

    @Aspect // 标注这个类是一个切面
    public class AnnotationPointCut {@Before("execution(* com.magician.service.UserServiceImpl.*(..))")public void before(){System.out.println("方法执行前=========");}@After("execution(* com.magician.service.UserServiceImpl.*(..))")public void after(){System.out.println("方法执行后 +++==============");}
    }
    
    <bean id="annotationPointCut" class="com.magician.diy.AnnotationPointCut" />
    <!--开启注解支持-->
    <aop:aspectj-autoproxy />
    

12. 整合Mybatis

步骤:

  1. 导入相关Jar包

    • junit
    • mybatis
    • mysql数据库
    • spring相关的
    • aop

    pom.xml

    <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.0.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.2</version></dependency>
    </dependencies>
    
  2. 编写配置文件

  3. 测试

学习参考视频:B站狂神说

spring5简单整理相关推荐

  1. linux简单目录,Linux下各目录简单整理

    实习之后一直在用Linux,但是对于每个目录并不是很了解,上次阿里的面试问到了,只能靠着自己的使用经验稍作回答,不全面也不准确,所以今天简单整理一下方便以后自己查看- 1./bin 重要的二进制应用程 ...

  2. java 系统 类_JAVA系统类 System的简单整理

    对系统属性看着JDKapi做了简单的记录,尤其是文件分隔符,以及获取系统时间,数组拷贝实用比较多谢,随意正对这几个做下简单整理,需要引入junit单元测试的jar包 //获取所有系统属性 @Test ...

  3. 哪些CSS是可以被继承的--简单整理

    那些CSS是可以被继承的--简单整理 1.文本相关属性是继承的:font-size,font-family,line-height,text-index等 2.列表相关属性是继承的:list-styl ...

  4. java的栈区 堆区存放什么_简单整理java中的栈内存, 堆内存是什么?

    上一篇文章简单整理了栈(stack), 堆(heap), 队列(queue)的结构 这一篇继续整理java中的 占内存,堆内存. Java把内存划分成两种:一种是栈内存,一种是堆内存. 这里需要解释一 ...

  5. Android Camera简单整理(一)-Camera Android架构(基于Q)

    Camera整体架构简单整理 一.Android Camera整体架构简述 1.1 Android Camera 基本分层 1.2 Android Camera工作大体流程 二. Camera App ...

  6. Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事件的简单整理

    Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事件的简单整理 目录 Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事 ...

  7. IntellJ IDEA 基础之 常用快捷键的简单整理

    IntellJ IDEA 基础之 常用快捷键的简单整理 目录 IntellJ IDEA 基础之 常用快捷键的简单整理 一.简单介绍 二.演示操作环境 二.Ctrl 1.Ctrl + F 在当前文件进行 ...

  8. Vue 之 echarts 图表数据可视化常用的一些图表/动态图表/3D图表的简单整理

    Vue 之 echarts 图表数据可视化常用的一些图表/动态图表/3D图表的简单整理 目录 Vue 之 echarts 图表数据可视化常用的一些图表/动态图表/3D图表的简单整理 一.简单介绍 二. ...

  9. Python学习记录(一)PIL库对于图像操作方法的简单整理

    Python学习记录(一)PIL库对于图像操作方法的简单整理 首先对PIL库进行一个简单的介绍:Python图像库PIL(Python Image Library)是python的第三方图像处理库,由 ...

  10. EPS二次开发简单整理(一)

    EPS二次开发简单整理(一) 2020.1.3 一.添加命令函数 二.添加检查程序 三.EPS中字体大小判断 四.植被面中符号宽度 五.Cross_P函数返回值说明 六.图形外接矩形关键点序号 七.高 ...

最新文章

  1. PCL点云特征描述与提取(1)
  2. opencv sobe 边缘检测算子
  3. 读了几篇boosting文献的收获
  4. 《AlwaysRun!团队》第四次作业:项目需求调研与分析
  5. SAP ABAP Netweaver和Hybris Commerce的部署策略
  6. iOS如何判断当前网络的运营商
  7. 执行Dockerfile构建基础镜像,建立python工作环境
  8. 构建之法第一、二、十六章
  9. python-简单邮件报警
  10. php定时发送生日模块消息_RabbitMQ之消息的可靠性投递
  11. 暴风影音 2007 播放 avi 时出现两个画面的解决办法
  12. 使用API Monitor监测到目标程序对系统API函数的调用(常用分析工具)
  13. HDFS加密存储(HDP、Ranger、Ranger KMS实现)
  14. 监控的4个黄金指标(google)
  15. Zabbix实现企业微信报警
  16. 分析1996~2015年人口数据特征间的关系并分析1996~2015年人口数据各个特征的分布分散状况
  17. 在公共Wi-Fi上保持安全的12种方法
  18. VS Code 也能预览 Markdown - 一个无意中发现的小技巧
  19. 禄来6008机身和镜头之间的通信协议测试
  20. UE4数字孪生 OD线开发浅析

热门文章

  1. linux编译n2n v2,在centos下安装n2n服务器
  2. GWT项目创建时遇到的问题
  3. 计算机课程设计之外卖点餐系统-基于javaweb的外卖系统源代码-校园外卖点餐系统java
  4. Xcode8写代码闪退
  5. 金山词霸导致chrome浏览器出错
  6. python中文转化gb2321_使用Python进行中文繁简转换的实现代码
  7. gnome 如何自定义样式_在Gnome 3中自定义字体
  8. Graphics详解
  9. 红色警戒2修改器原理百科(八)
  10. VB.NET和C# Ruby语言之间的转换