栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring5最新完整教学 (IDEA)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring5最新完整教学 (IDEA)

目录

1、Spring

1.1、简介

1.2、优点

1.3、组成

1.4、拓展

2、IOC理论推导

2.1、IOC本质

3、HelloSpring

3.1、编写一个Hello实体类

3.2、编写我们的spring文件,这里我们命名beans.xml

3.3、实例化容器

4、IOC创建对象的方式

4.1、使用无参构造创建对象,默认实现

4.2、假设我们要使用有参构造方法创建对象

5、spring配置

5.1、别名

5.2、Bean配置

5.3、import

6、DI依赖注入

6.1、构造器注入

6.3、拓展方式注入

6.4、bean的作用域

7、Bean的自动装配

7.1、测试

7.2、ByName自动装配

7.3、ByType自动装配

7.4注解实现自动装配

@Autowired

@Resouce注解

8、使用注解开发

1.bean

2.属性如何注入

3.衍生的注解

4.自动装配

5.作用域

6.小结

9、使用java方式配置Spring

10、代理模式

10.1、静态代理

10.2、 加深理解

10.3、动态代理

11.AOP

11.1、什么是AOP

11.2、AOP在Spring中的作用

11.3、使用Spring实现APP



1、Spring

1.1、简介
  • spring:春天----->给软件行业带来了春天!

  • 2002,首次推出了Spring框架的雏形:interface21

  • Spring框架即以interface21框架为基础,经过重新的设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版。

  • Rod Jahnson,Spring framework创始人,著名作者,悉尼大学的博士,专业是音乐学。

  • Spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!

  • SSH:Struct2 + Spring + Hibernate

  • SSM:SpringMVC + Spring + Mybatis

    官网:Spring framework

    Gitub:GitHub - spring-projects/spring-framework: Spring framework

    官方下载地址:JFrogJFrog JFrog


    org.springframework
    spring-webmvc
    5.3.12



    org.springframework
    spring-jdbc
    5.3.12

1.2、优点
  • Spring是一个开源免费的框架(容器)!

  • Spring是一个轻量级的、非入侵式的框架 !

  • 控制反转(IOC),面向切面(AOP)

  • 支持事务处理,它是对框架整合的支持!

总结一句话:Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架

1.3、组成

1.4、拓展

在Spring的官网有这个介绍:现代化的java开发!说白了就是Spring的开发

  • Spring Boot

    • 一个快速开发的脚手架。

    • 基于SpringBoot可以快速开发单个微服务 。

    • 约定大于配置!

  • Spring Cloud

    • SpringCloud是基于SpringBoot实现的

因为下载乃大多数公司都在使用SpringBoot进行快速开发,学习SpringBoot前提,需要完全掌握Spring以及Spring及SpringMVC!呈上启下的作用!

弊端:发展了太久之后,违背了原来的理念!配置十分繁琐,人称:“ 配置地狱 ”

2、IOC理论推导

2.1、IOC本质

1.UserDao接口

2.USerDaolmpl实现类

3.UserService业务接口

4.UserServicelmpl业务实现类

我们使用一个Set接口实现.已经发生革命性的变化

private UserDao ;
//利用set进行动态实现值的输入!
public  void setUserDao(UserDao userDao){
    this.userDao=userDao;
}

  • 之前,程序是主动创建对象!控制权在程序员手上!

  • 使用set注入后,程序不再具有主动性,而是变成被动的接收对象!

  • 这种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建了。

    控制反转(inversion of control), 是一种设计思想,DI(dependency injection依赖注入)是IOC的一种方法.未使用IOC的程序中,我们使用面向对象编程,对象的创建和对象之间的依赖关系完全硬编码在程序中,对象的创建是由程序自己控制的.控制反转就是将对象的创建转移给了第三方.IOC就我认为是:获得依赖对象的方式反转了

    IOC是Spring框架的核心内容, 使用了多种方式完美的实现了IOC,xml配置与注解形式,新版本的spring也可以零配置实现IOC

3、HelloSpring

项目结构

注:spring需要导入commons-logging进行日志记录。我们利用maven,他会自动帮我们下载对应的依赖项, 在pom.xml中配置


    org.springframework
    spring-webmvc
    5.3.12

3.1、编写一个Hello实体类
package com.kang.pojo;

public class Hello {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + ''' +
                '}';
    }
}

3.2、编写我们的spring文件,这里我们命名beans.xml


            
            
        

3.3、实例化容器
import com.kang.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​public class MyText {   
 public static void main(String[] args) { 
       //获取Spring上下文对象      
       ApplicationContext content=new ClassPathXmlApplicationContext("beans.xml");     
       //我们的对象现在都在Spring中管理了,我们要使用,直接去里面取出来就可以了!     
       Hello hello = (Hello) content.getBean("hello");
       System.out.println(hello.toString()); 
   }
}​


​

4、IOC创建对象的方式

4.1、使用无参构造创建对象,默认实现
public class User {
    private String name;
    public User(){

    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void show(){
        System.out.println("name="+name);
    }
}

    
    
        
    

4.2、假设我们要使用有参构造方法创建对象
public User(String name){
	this.name=name;
}

1.下标赋值

 
        
    

2.通过类型创建 如果有两个一样的类型,就不行了,不建议使用


        
    

3.直接通过参数名来设置

 
        
    

项目结构

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!

5、spring配置

5.1、别名
    

5.2、Bean配置
    
    
        
    

    

5.3、import

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

假设现在项目中有多个人开发,这三个人复制不同的类开发,不同的类需要注册在不同的bean中,我们可以利用

import将所有人的beans.xml合并为一个总的

  • 张三

  • 李四

  • 王五

  • applicationContext.xml

        
        
        

    内容相同也会被合并

使用的时候,直接使用总的配置就可以了

6、DI依赖注入

6.1、构造器注入

6.2、通过set方式注入【重点】

  • 依赖注入:本质是set注入!

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

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

【环境搭建】

  1. 复杂类型

public class Address {
    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
     @Override
    public String toString() {
        return "Address{" +
                "address='" + address + ''' +
                '}';
    }
}

2、真实测试对象

public class Stutent {
    private  String name;
    private Address address;
    private String[] books;
    private List hobbys;
    private Map card;
    private Set games;
    private String wife; 
    private Properties info;
}

3.applicationContext.xml


    
        
        
    

4.测试类

public class MyText {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Stutent student = (Stutent) context.getBean("student");

        System.out.println(student.getName());
    }
}

5.完善注入


    
        
    

    
        
        
        
        
        
        
            
                红楼梦
                西游记
                水浒传
            
        
        
        
            
                学java
                打代码
                看java教学
            
        
        
        
            
                
                
            
        
        
        
            
                王者荣耀
                LOL
                COC
            
        
        
        
           
        
        
        
            
                183350
                18班
            
        
    
 

6.完善测试类

public class MyText {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Stutent student = (Stutent) context.getBean("student");

        System.out.println(student.toString());

    }
}

6.3、拓展方式注入

我们可以使用p命名空间和c命名空间进行注入

2、使用

在applicationContext.xml中先导入命名空间namespace



        
    

        
    

3.测试

 @Test
    public void test2(){
       ApplicationContext context = new ClassPathXmlApplicationContext("userbean.xml");
        User user =  context.getBean("user2",User.class);
        System.out.println(user);

    }

注意点:p命名和c命名空间不能直接使用,需要导入xml约束!

  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:c="http://www.springframework.org/schema/c"

6.4、bean的作用域

1.1 单例模式singleton

singleton作用域表示在整个Spring容器中一个bean定义只生成了唯一的一个bean实例,被Spring容器管理。所有对这个bean的请求和引用都会返回这个bean实例。

下面的图说明了singleton作用域是如何工作的:

上图中,有3个地方引用了这个bean,这3个引用指向的都是同一个bean实例。

1.1 singleton作用域是Spring中默认的作用域,可以在定义bean的时候指定或者不指定都可以,如下:





2原型模式prototype`作用域

每次从容器中get的时候都会产生一个新对象

1.2 prototype作用域

prototype作用域表示的是一个bean定义可以创建多个bean实例,有点像一个类可以new多个实例一样。

也就是说,当注入到其他的bean中或者对这个bean定义调用getBean()时,都会生成一个新的bean实例。

作为规则,应该对所有有状态的bean指定prototype作用域,对所有无状态的bean指定singleton作用域。

下图描述了prototype作用域是如何工作的:

上图中,每个引用对应一个新的bean实例。

请注意,上图中的例子不适用于生产环境。因为DAO通常来说是无状态的bean,应该指定它的作用域为singleton比较合适。

在xml中可以这样定义prototype作用域:

3、其余request、session、application、websocket作用域

request、session、application、websocket作用域只有在web环境下才有用。

7、Bean的自动装配

再说自动装配之前,我们先聊一聊什么是手动装配。

手动装配就是我们在先前讲的那些,要自己给定属性,然后赋值

  • 自动装配是spring满足bean依赖的一种方式!

  • Spring会在上下文中自动寻找,并自动给bean装配属性!

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

    1. 在xml中显示的配置

    2. 在java中显示配置

    3. 隐式的自动装配bean【重要的】

自动装配

当Bean的属性很少的时候,我们对它进行配置的时候就使用很少的或者元素进行装配,但是随着工程体积的增大,Bean也可能变得复杂,这时候配置文件也会变得复杂, 就会变得很多,写起来就会很费劲,还好Spring为我们提供了自动装配的机制。 autowire的模式

Spring IOC容器可以自动装配Bean,只需要在 的autowire属性中指定装配的模式。

7.1、测试

环境搭建:一个人有两个宠物

7.2、ByName自动装配

    

7.3、ByType自动装配

    

小结:

  • byName的时候,需要保证所有的bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致

  • byType的时候,需要保证所有的bean的class唯一,并且这个bean需要和自动注入的属性的类型一致

7.4注解实现自动装配

The introduction of annotation-based configuration raised the question of whether this approach is “better” than XML.

要使用注解须知

  1. 导入约束 : context约束

  2. 配置注解的支持:context:annotation-config/ 【重点】

    
    

    @Autowired

    直接在属性上使用即可,也可自在set方式上使用

    使用Autowired我们可以不用编写set方法,你这个自动装配的属性在IOC(Spring)容器中存在,且符合咱们的名字

    byname!

    科普:

    @Nullable  字段标记了这个注解,说明这个字段可以为null

    测试代码

     //如果显示定义了Autowired的required属性为false,说明这个对象可以为Noll,否则不允许为空
        @Autowired
        private Cat cat;
        @Autowired
        private Dog dog;
        private String name;
    }
     

    如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候、我们可以

    使用@Oualifier(value="xxx")去配置Autowired使用,指定一个唯一的bean对象使用

    //如果显示定义了Autowired的required属性为false,说明这个对象可以为Noll,否则不允许为空
        @Autowired
        @Oualifier(value="cat111")
        private Cat cat;
        @Autowired
        @Oualifier(value="dog111")
        private Dog dog;
        private String name;
    
     
     

    @Resouce注解

public class People {
	@Resouce(name="cat2")
    private Cat cat;
	@Resouce
    private Dog dog;

}

小结:

@Resouce和@Autowired区别:

  • 都是用来自动装配的,都可以放在属性字段上

  • @Autowired:通过byType的方式实现 而且必须要求这个对象存在!

  • @Resouce:默认通过byname的方式实现,如果找不到名字,则通过byType实现, 如果两个都找不到的情况下,就报错!

  • 执行顺序不同: 注解说明

    • @Autowired:自动装配通过类型,名字

      • 如果Autowired不能唯一自动装配上属性,则需要通过@Oualifier(value="xxx")

    • @Resouce:自动装配通过名字,类型

8、使用注解开发

在Spring4之后,要使用注解开发,必须要保证aop的包导入了

使用注解需要导入content约束,增加注解的支持



1.bean

2.属性如何注入
//Component等价于 
//英文名组件
@Component
public class User {
    //相当于 
    @Value("小布丁")
    public String name;

}

3.衍生的注解

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

  • dao【@Repository 】

  • service【@Service 】

  • controller【@Controller】

    这四个注功能都是一样的,都是代表将某个类注册到Spring容器中,装配Bean!

4.自动装配
- @Autowired:自动装配通过类型,名字
  - 如果Autowired不能唯一自动装配上属性,则需要通过@Oualifier(value="xxx")
- @Resouce:自动装配通过名字,类型
- @Nullable  字段标记了这个注解,说明这个字段可以为null

5.作用域
@Component
@Scope("singleton")
public class User {
    //相当于 
    @Value("小布丁")
    public String name;

}

6.小结

xml与注解:

  • xml更加万能,适用于任何场面!维护简单方便

  • 注解:注解不是自己的类是用不了,维护相对复杂!

xml与注解的最佳实践

  • xml是用来管理bean;

  • 注解只负责完成属性的注入;

  • 我们在使用的过程中,只需要注意一个问题:必须让注解生效,就必须开启注解的支持

  
    
    
    

9、使用java方式配置Spring

我们现在要完全不使用Spring的xml配置了,全权交给java来做!

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

实体类

//这个注解意思,就是说明这个类被Spring接管了,注册到了容器中
@Controller
public class User {
    private String name;

    public String getName() {
        return name;
    }
    @Value("小布丁")//属性注入值
    public void setNmae(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "nmae='" + name + ''' +
                '}';
    }
}

配置文件类

package com.kang.config;

import com.kang.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.import;

//这个也会被Spring容托管,注册到容器中,因为他本来就是一个@Controller,
// @Configuration代表这个一个配置类,就和我们之前看的beans.xml一样的
@Configuration
@ComponentScan("com.kang.pojo")
@import(MyConfig2.class)
public class MyConfig {

    //注册一个bean,就相当于我们之前写的一个Bean标签
    //这个方法的名字,就相当于bean标签中的id属性
    //这个方法的返回值,就相当于bean标签中的class属性
    @Bean
    public User getuser(){
        return new User();//就是返回要注入到bean的对象
    }
}

配置文件2

@Configuration
public class MyConfig2 {

}

测试类!

public class Mytext {
    public static void main(String[] args) {
        //如果完全使用了配置类方式去做,我们就只能通过AnnotationConfig 上下文来获取容器,通过配置类的class对象加载
       ApplicationContext content = new AnnotationConfigApplicationContext(MyConfig.class);
        User getuser = content.getBean("getuser", User.class);
        System.out.println(getuser.getName());

    }
}

这种纯java的配置方式,在SpringBoot中随处可见!

10、代理模式

为什么要学习代理模式?

因为这是SpringAOP最底层!【SpringAOP和springMVC】

代理模式分类:

  • 静态代理

  • 动态代理

10.1、静态代理

角色分析:

  • 抽象角色:一般会使用接口或者接口类

  • 真是角色:被代理的角色

  • 代理角色:代理真是角色,代理真实角色后,我们一般会做一些附属操作

  • 客户:访问代理对象的人!

代码步骤:

  1. 接口


```java
public interface Rent {
    public void rent();
}
```

2.真实角色

//房东
public class Host implements Rent{
    public void rent() {
        System.out.println("房东要出租房");
    }
}

3.代理角色

//中介
public class Proxy  implements Rent{

    private Host host;


    public Proxy() {
    }

    public Proxy(Host host) {
        this.host = host;
    }

    public void rent() {
        host.rent();
        seeHouse();
        fare();
    }
    //看房
    public void seeHouse(){
        System.out.println("中介带你看房");
    }
    //收中介费
    public void fare(){
        System.out.println("收中介费");
    }
}

4.客户端访问代理角色

public class Client {
    public static void main(String[] args) {
        Host host=new Host();
        Proxy proxy = new Proxy(host);
        proxy.rent();
    }
}

代理模式的好处:

  • 可以使真实角色的操作更加纯粹!

  • 公共也就交给代理角色!实现了业务的分工!

  • 公共业务发生拓展的时候,方便集中管理!

缺点

  • 一个真是角色就会产生一个代理角色;代码量会翻倍,开发效率会变低

10.2、 加深理解

10.3、动态代理
  • 动态代理和静态代理角色一样

  • 动态代理的代理类是动态生成的,不是我们直接写好的!

  • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理

    • 基于接口---JDK 动态代理【我们就使用jdk】

    • 基于类:cglib

    • java字节码实现:javasist

需要了解两个类:Proxy:代理,Invokation:调用处理程序

动态代理的好处:

  • 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务

  • 公共也就交给代理角色!实现了业务的分工!

  • 公共业务发生拓展的时候,方便集中管理!

  • 一个动态代理类代理接口,一般就是对应的一些业务

  • 一个动态代理类可以代理多个类,只要实现了多个类

11.AOP

11.1、什么是AOP

AOP全称(Aspect Oriented Programming)面向切片编程的简称,AOP通过预编译方式和运行期动态代理实现,在不修改源代码的情况下,给程序动态统一添加功能的一种技术,简称AOP。是spring框架的一个重要内容,是OOP(面向对象编程)的衍生模范。

AOP的作用:

利用AOP对业务逻辑的各个部分进行隔离,降低业务逻辑的耦合性,提高程序的可重用型和开发效率。

11.2、AOP在Spring中的作用

提供声明式事务:允许用户自定义切面

  • 横切关注点:跨越应用程序多个模块的方法或功能.既是,与我们业务逻辑无关,但是我们需要关注的部分,就是横切关注点.如日志,安全,缓存,事务等…

  • 切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。

  • 通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。

  • 目标(Target):被通知对象。

  • 代理(Proxy):向目标对象应用通知之后创建的对象。

  • 切入点(PointCut):切面通知 执行的 “地点”的定义。

  • 连接点(JointPoint):与切入点匹配的执行点。

SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:

即 Aop 在 不改变原有代码的情况下 , 去增加新的功能 .

11.3、使用Spring实现APP

【重点】使用AOP织入,需要导入一个依赖包


   org.aspectj
   aspectjweaver
   1.9.4

方式一:使用Spring的API接口来做【主要是SpringAPI接口实现】

方式二:使用自定义类类实现AOP【主要是切面】

//方式三:使用注解方式实现AOP
@Aspect//标注这个类是一个切面
public class AnnotionPointCut {

    @Before("execution(* com.kang.service.UserServiceImpl.*(..))")
    public void  before(){
        System.out.println("===== 方法执行前======");
    }

    @After("execution(* com.kang.service.UserServiceImpl.*(..))")
    public void after(){
        System.out.println("===== 方法执行后======");
    }

 
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/423868.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号