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

spring

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

spring

Spring 1
 
 
     org.springframework
     spring-webmvc
     5.2.0.RELEASE
 
 
 
     org.springframework
     spring-jdbc
     5.2.0.RELEASE
 
 ​
  • Spring是一个开源得免费的框架(容器)

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

  • 控制反转(IOC)、面向切面编程(AOP)

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

Spring Boot:一个快速开发的脚手架。基于SpringBoot可以快速的开发单个微服务。约定大于配置

SpringCloud:基于SpringBoot实现的,

因为大多数公司都在使用SpingBoot进行快速开发,学习SpringBoot的前提,需要完全掌握Spring及SPringleMVC~承上启下的作用

Core Technologies

2、IOC理论推导
  1. UserDao接口

  2. UserDaoImpl实现类

  3. UserService业务接口

  4. UserServiceImpl业务实现类

3、hellospring

实体类

 package com.ss.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 + ''' +
                 '}';
     }
 }

beans.xml

 
 
 ​
 
     
         
     
 ​
 

测试类

 import com.ss.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());
 ​
 ​
     }
 }

4IOC创建对象得方式
  1. 使用无参构造创建对象,默认!

  2. 假设我们要使用有参构建创建对象。

    1. 下标赋值

     
             
         
    1. 类型

     
         
             
         
    1. 参数名

     
         
             
         

在配置文件加载得时候,,容器种管理得对象就已经初始化了!

5、Spring配置 5.1别名
 
 
public class MyTest {
    public static void main(String[] args) {
        // Spring容器,就类似于中介网站
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User) context.getBean("ceshi");
        user.show();
    }
}
5.2bean的配置

    
        
    
5.3import

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

假如有多个人开发,这三个人复制不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的。

  • applicationContext.xml





    
    
    

6、依赖注入 6.1 构造器注入

    
    
        org.springframework
        spring-webmvc
        5.2.0.RELEASE
    
6.2 Set方式注入
  • 依赖注入:Set注入

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

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

环境搭建

  1. 复杂类型

package com.ss.pojo;

public class Address {
    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
  1. 真实测试对象

public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List hobbys;
    private Map card;
    private Set games;
    private String wifi;
    private Properties info;
  1. beans.xml




        

            
        
    
  1. 测试类

import com.ss.pojo.Student;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student.getName());

    }
}

完善注入信息





        
            
        

        

            


            


            
                
                    红楼梦
                    水浒传
                    西游记
                    三国演义
                
            


            
                
                    听歌
                    看电影
                    打游戏
                
            


            
                
                    
                    
                
            


            
                
                    LOL
                    COC
                    BOB
                
            


            
                
            


            
                
                    20190525
                    
                    root
                    123456
                
            
        
    
6.3拓展方式注入 7、bean的自动装配
  • 自动装配是SPringle满足bean依赖的一种方式!

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

在SPringle中又三种装配的方式

  1. 在xml中显示的配置

  2. 在java中显示的配置

  3. 隐式的自动装配bean

7.1、测试
  1. 环境搭建

    • 一个人又两个宠物

7.2ByName自动装配

    
        
    
7.3ByType自动装配
    
        

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

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

7.4注解实现自动装配

使用注解须知:

  1. 导入约束:context约束

  2. 配置注解的支持 context:annotation-config/




    

@Autowired

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

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

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

测试代码

public class People {
    // 如果定义了 autowired的required属性为false,说明这个对象可以为null,否则不允许为空
    @Autowired(required = false)
    private Cat cat;
    @Autowired
    private Dog dog;
    private String name;
}

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@autowired】完成的时候,我们可以使用@Qualifier(value = "xxx")去配置@Authowired的使用,指定一个唯一的bean对象的注入

public class People {
    // 如果定义了 autowired的required属性为false,说明这个对象可以为null,否则不允许为空
    @Autowired(required = false)
    private Cat cat;
    @Autowired
    @Qualifier(value = "dog222")
    private Dog dog;
    private String name;
}

@Resource注解

public class People {
    @Resource
    private Cat cat;
    @Resource(name = "dog222")
    private Dog dog;
    private String name;
}

@Resource和@Autowired的区别

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

  • @Autowired通过bytype的方式实现

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

8、使用注解开发

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

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




    

  1. bean

  2. 属性如何注入

    //等价于
    //@Component组件
    @Component
    public class User {
    
        //等价于
        //        
        //    
        public String name;
    
        @Value("测试1")
        public void setName(String name) {
            this.name = name;
        }
    }
  3. 衍生的注解 @Conponent有几个衍生注解,我们在web开发中,会按照mvc三层架构分层

    • dao【@Repository】

    • service【@Service】

    • controller【@Controller】

      这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配bean

    • 自动装配置

      @Autowired:自动装配通过类型,名字
         如果Autowired不能唯一自动装配属性,则需要通过@Qualifier(value="xxx")
      @Nullable:字段标记这个注解,说明这个字段可以为null
      
      @Resource:自动装配通过某种,类型。
  4. 作用域

    @Component
    @Scope("prototype")
    public class User {
    
        //等价于
        //        
        //    
        public String name;
    
        @Value("测试1")
        public void setName(String name) {
            this.name = name;
        }
    }
  5. 小结 xml与注解,

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

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

    xml与注解最佳实践,

    • xml用来管理bean

    • 注解只用来完成属性的注入

    • 在使用中,只需要注意,必须让注解生效,就需要开启注解支持

    
    

9、使用java的方式配饰Spring

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

javaConfig是Spring的一个子项目,在Spring4后,它成了一个核心功能

实体类

//这里这个注解,说明这个类被spring接管了,注册到了容器中
@Component
public class User {
    private String name;

    public String getName() {
        return name;
    }

    @Value("测试")//属性注入
    public void setName(String name) {
        this.name = name;
    }

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

配置类

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

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

测试类

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

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

10代理模式
  • 静态代理

  • 动态代理

10.1静态代理

角色分析:

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

  • 真实角色:被代理得角色

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

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

步骤:

  1. 接口

    //租房
    public interface Rent {
        public void rent();
    }
  2. 真实角色

    //房东
    public class Host implements Rent{
    
        @Override
        public void rent() {
            System.out.println("房东要出租房子");
        }
    }
  3. 代理角色

    public class Proxy implements Rent{
        private Host host;
    
        public Proxy() {
        }
    
        public Proxy(Host host) {
            this.host = host;
        }
    
        @Override
        public void rent() {
            seeHouse();
            host.rent();
            hetong();
            fare();
        }
    
        //看房
        public void seeHouse(){
            System.out.println("中介带你看房");
        }
    
        //欠合同
        public void hetong(){
            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的动态代理

    • 基于类:cglib

    • java字节码实现:javassist

需要了解两个类:Proxy:代理,InvocationHandler:调用处理

代理模式的好处:

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

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

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

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

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

11、AOP

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

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

方式三:使用注解实现!

12、整合Mybatis

步骤:

  1. 导入jar包

    • junit

    • mybatis

    • mysql

    • spring

    • aop

    • mybatis-spring

    
        
            junit
            junit
            4.12
            test
        
        
            mysql
            mysql-connector-java
            5.1.46
        
        
            org.mybatis
            mybatis
            3.5.2
        
        
            org.springframework
            spring-webmvc
            5.1.9.RELEASE
        
        
            org.springframework
            spring-jdbc
            5.1.9.RELEASE
        
        
            org.aspectj
            aspectjweaver
            1.8.13
        
        
            org.mybatis
            mybatis-spring
            2.0.2
        
    
  2. 编写配置文件

  3. 测试

mybatis
  1. 编写实体类

  2. 编写核心配置文件

  3. 编写接口

  4. 编写Mapper.xml

  5. 测试

mybatis-spring
  1. 编写数据源配置

  2. sqlSessionFactory

  3. sqlSessionTemplate

  4. 需要给接口加实现类

  5. 将自己写的实现类,注入到Spring中

  6. 测试使用

13、声明式事务 1、回顾事务
  • 把一组业务当成一个业务来做,要么都成功,要么都失败

  • 涉及到数据的一致性问题

  • 确保完整性和一致性

事务的ACID原则:

  • 原子性

  • 一致性

  • 隔离性 多个业务操作同一个资源,防止数据损坏

  • 持久性 事务一旦提交,无论系统发生什么问题,结果都不会再被影响,被持久化的写道存储器中

2、spring中的事务管理
  • 声明式事务:AOP的应用

  • 编程式事务:需要在代码中,进行事务管理

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

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

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