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

Spring

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

Spring

1.Spring 1.1简介
  1. Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
  2. 解决企业开发的复杂性。
  3. Spring理念:使现有的技术更加容易使用,本身是个大杂烩,整合了现有的技术框架。
1.2优点
  • Spring是一个开源的免费的框架(容器);
  • Spring是一个轻量级,非入侵式(引入了spring 不会改变原来的代码,不会对原项目产生影响)的框架;
  • 控制反转(IOC)和面向切面编程(AOP);
  • 支持事务的处理,对框架整合的支持;
1.3Spring组成及扩展
  • 组成
1.4扩展
  • SpringBoot:一个快速开发的脚手架,基于SpringBoot可以快速开发单个微服务。约定大于配置。
  • SpringCloud:基于SpringBoot实现的
  • 大部分公司使用Spring Boot进行快速开发,学习SpringBoot前提是掌握Spring和SpringMVC。
2.IOC理论推导
  • UserDao接口
  • UserDaoImpl接口
  • UserService业务接口
  • UserServiceImpl业务实现类
2.1控制反转思想
  • 在我们的业务中,用户的需求可能会影响我们 的源代码,我们需要根据用户的需求去修改源代码!如果程序代码量十分大,修改一次的成本十分昂贵!
  • 我们使用一个Set接口实现,发生了革命性变化
 private UserDao userDao;
    //利用set方法动态实现值的注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

  • 之前是程序主动创建对象,控制权在程序员手上!
  • 使用了set注入后,程序不在具有主动性,而是变成被动接收对象。
  • 此思想从本质解决了问题,程序员不用再管理对象的创建。系统耦合性大大降低,可以更加专注与业务实现。
2.2 IOC本质
  • 之前结构:

  • 反转后结构:

  1. IoC本质:控制反转IoC是一种设计思想,DI(依赖注入)是实现IoC(思想)的一种方法,没有IoC的程序中,我们使用面向对象编程,对象的创建和对象间的依赖关系完全硬编在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,获得依赖对象的方式反转了。
  2. IoC是Spring框架的核心内容,有很多种方式实现IoC,可以使用XML配置,也可以使用注解,最新版本的Spring可以使用零配置实现IoC.
  3. Spring容器在初始化时会先读取配置文件吗,根据配置文件或元数据与组织对象存入容器中吗,程序使用时在从IoC容器中取出需要的对象。
  4. 采用XML配置Bean的时候,Bean 的定义和实现时分离的,使用注解可以把两者合为一体,。
2.3HelloSpring
package com.qu.dao;

public class Hello {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
    public String toString(){
        return "Hello{"+"str'"+str+"'"+"}";
    }
}




    
    
    

  1. 使用IoC容器需要配置其元数据在resources文件中配置xml文件,先建立xml文件,文件名即上图中的applicationContest.xml
  2. 在xml中使用Spring来创建对象,在Spring中这些称作为bean。即对象=bean
  3. 加载xml文件,固定格式,ApplicationContest contest=new ClassPathXmlApplicationContest (“applicationContest”);//参数可以有多个,就是我们创建的xml文件名。
  4. contest称为获取Spring的上下文对象,我们的对象都在spring 中管理,想要使用直接去里面取出。
  5. contest.getBean(“hello”);//参数传入bean的id即可取出对应的对象。需要强转一下类型。
import com.qu.dao.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        //获取Spring上下文对象,解析beans.xml文件,生成Bean对象
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContest.xml");
        //我们的对象现在都在Spring中管理,需要时直接通过id取出,getBean的参数就是配置文件中的id
        Hello hello=(Hello)context.getBean("hello");//并不需要去new一个Hello对象
        System.out.println(hello.toString());
    }
}

代码左边的叶子表示类已经被Spring托管

  1. Hello的对象谁创建的?hello对象由Spring生成。
  2. Hello的对象属性怎么设置的?hello对象属性由Spring容器设置。
  3. 控制 :谁来控制对象的创建,传统的程序的对象由程序本身控制创建,使用Spring后,现在交给Spring去做;反转:程序本身不创建对象,而编程被动的接收对象,这就是控制反转。
  4. 总结:所谓的IoC就是对象由Spring来创建,管理,分配。
        
         
  1. ref:引用Spring中已经创建好的对象
  2. value:具体值,基本数据类型。
2.4IoC创建对象的方式
  1. 项目结构:
  2. Spring中仍然使用无参构造创建对象
package com;

public class User {
   private String name;
   public User(){
       System.out.println("使用了无参构造");
   }

    public String getName() {
        return name;
    }

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




    


import com.User;
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");
        User user=(User)context.getBean("user");//拿过来强转一下
        user.show();

    }

}


  1. Spring中使用有参构造创建对象
package com;

public class User {
   private String name;
   //创建有参构造
   public User(String name){
      this.name=name;
   }

    public String getName() {
        return name;
    }

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

  1. 此时Xml出错
  2. 解决:用有参构造创建对象有三个方法
  3. 方法一:index=0表示下标为0的参数,也就是有参构造中第一个参数




    


  1. 方法二:还可以通过参数的类型去匹配,不建议使用,因为当有参构造有两个String参数时就会出错。




    


  1. 方法三:ref去指向




   


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

2.5Bean的配置
  1. 别名在后面引用对象名时user和user2一样。
  2. id:bean的唯一标识符,也就相当于对象名。
  3. class:bean对象所对应的权限定名,:包+类型
  4. name:也就是别名,而且name可以取多个名

   

 
2.6 import
  1. 一般用于团队开发使用,他可以将多个配置文件,导入合并为一个
  2. 定义多个beans.xml,在applicationContest.xml中导入其他几个,相当于合并

    
  • 假如某项目有三个人开发,这三个人负责不同的类的开发,而不同的类需要注册在不同的bean中,我们可以利用import将所有的beans合并为一个总的配置文件,使用时只用使用这个总的配置。
3. 依赖注入 3.1构造器注入(已讲2.4) 3.2Set方式注入【重点】
  • 依赖注入:Set注入
  • 依赖:bean对象的创建依赖于容器
  • 注入:bean对象中所有属性由容器来注入
  • 环境搭建:
  • (1)复杂类型
package com.qu.pojo;
//复杂类型,将地址作为一个引用对象
public class Address {
    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

  • (2)真实测试对象
package com.qu.pojo;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class Student {
    private String name;
    private Address address;
    private String[] book;
    private List hobbys;
    private Map card;
    private Set games;
    private Properties info;//配置类型,学生信息我们自定义
    private String wife;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public String[] getBook() {
        return book;
    }

    public void setBook(String[] book) {
        this.book = book;
    }

    public List getHobbys() {
        return hobbys;
    }

    public void setHobbys(List hobbys) {
        this.hobbys = hobbys;
    }

    public Map getCard() {
        return card;
    }

    public void setCard(Map card) {
        this.card = card;
    }

    public Set getGames() {
        return games;
    }

    public void setGames(Set games) {
        this.games = games;
    }

    public Properties getInfo() {
        return info;
    }

    public void setInfo(Properties info) {
        this.info = info;
    }

    public String getWife() {
        return wife;
    }

    public void setWife(String wife) {
        this.wife = wife;
    }
}

  • (3)Beans.xml



    
        
    

  • 测试类:
import com.qu.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

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

  • (4)完善注入信息,集合数组等值的注入



    
    
        
        
        
        
        
        
            
                红楼梦
                水浒传
                三国
            
        
        
        
            
                听歌
                看电影
                敲代码
            
        
        
        
            
                
                
            
        
        
        
            
                LOL
                CF
            
        

        
            
        

        
            
                12345
                90
            
        
    

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

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

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