【Spring】Spring对IoC的实现和依赖注入专题

1. 依赖注入:

1.1 set注入:

  • 基于set方法实现的, 底层会通过反射机制调用属性对应的set方法然后给属性赋值

  • 这种方式要求属性必须对外提供set方法

  • set注入的核心实现原理: 通过反射机制调用set方法来给属性赋值, 让俩个对象之间产生关系

// xml








	
	
	

    
// User类
public class User {
    private UserDao userDao;
    private VipDao vipDao;

    public void setVipDao(VipDao vipDao) {
        this.vipDao = vipDao;
    }

    // set注入, 必须提供一个set方法
    // Spring容器会调用这个set方法, 来给userDao属性赋值
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void saveUser(){
        userDao.saveId();
        vipDao.save();
    }
}

// @Test
public void setDI(){
    ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
    User userBean = ctx.getBean("userBean", User.class);
    userBean.saveUser();
}

1.2 构造注入:

  • 核心原理: 调用构造方法来给属性赋值

  • set注入是在对象构建好了之后调用set方法来完成赋值, 构造注入是在对象实例化的过程中赋值的

// xml






    
    
    
    

    
    
    

    
    
    

    
// Customer类
public class Customer {
    private UserDao userDao;
    private VipDao vipDao;

    public Customer(UserDao userDao, VipDao vipDao) {
        this.userDao = userDao;
        this.vipDao = vipDao;
    }
    public void insert(){
        userDao.saveId();
        vipDao.save();
    }
}

// @Test
public void constructorDI(){
    ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
    Customer customerBean = ctx.getBean("customerBean", Customer.class);
    customerBean.insert();
}

2. set注入专题:

2.1 注入外部Bean:

// xml



    // 使用ref属性来引入, 这就是注入外部bean
    


// Order类
public class Order {
    private OrderDao orderDao;

    public void setOrderDao(OrderDao orderDao) {
        this.orderDao = orderDao;
    }

    public void generate(){
        orderDao.insert();
    }
}

2.2 注入内部Bean:

// xml

    
        
        
    


// Order类
public class Order {
    private OrderDao orderDao;

    public void setOrderDao(OrderDao orderDao) {
        this.orderDao = orderDao;
    }

    public void generate(){
        orderDao.insert();
    }
}

2.3 注入简单类型:

简单类型有哪些:

  • 8 种基本类型和8种包装类型

  • 枚举

  • String字符串

  • 数字

  • 日期(java.util.Date), 在实际的开发中, 一般不会把Date当做简单类型, 一般采用ref给Date类型的属性赋值

  • 时间时区类型

  • URI

  • URL

  • 语言类

  • Class类型

// xml

    // 如果是给简单类型赋值, 就不能使用ref, 需要使用value
    
    
    


// People类
public class People {
    private String name;
    private int age;
    private int classId;

    public void setName(String name) {this.name = name;}
    public void setAge(int age) {this.age = age;}
    public void setClassId(int classId) {this.classId = classId;}
    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", classId=" + classId +
                '}';
    }
}
    
// @Test
public void setDI3(){
    ApplicationContext ctx = new ClassPathXmlApplicationContext("set-DI.xml");
    People peopleBean = ctx.getBean("peopleBean", People.class);
    System.out.println(peopleBean);
}

2.4 注入数组:

  • 基本类型和非基本类型的数组注入, 如下:

// xml

	

    

	

    

	



	// 这个数组当中的元素类型是String简单类型
    
        
            "张三"
            "李四"
            "王二蛋"
            "大锤"
        
    
	// 这个数组当中的类型就不是简单类型
    
        
            
            
            
        
    


// Student类
public class Student {
    private String[] stus;
    private Friend[] friends;

    public void setStus(String[] stus) {this.stus = stus;}
    
    public void setFriends(Friend[] friends) {this.friends = friends;}
    
    @Override
    public String toString() {
        return "Student{" +
                "stus=" + Arrays.toString(stus) +
                ", friends=" + Arrays.toString(friends) +
                '}';
    }
}

// Friend类
public class Friend {
    private String name;

    public void setName(String name) {this.name = name;}
    
    @Override
    public String toString() {
        return "Friend{" +
                "name='" + name + '\'' +
                '}';
    }
}

// @Test
public void setDI5(){
	ApplicationContext ctx = new ClassPathXmlApplicationContext("set-DI.xml");
	Student stu = ctx.getBean("stu", Student.class);
	System.out.println(stu);
}

2.5 注入List集合和Set集合:

  • 简单类型

// xml

    
    	 // list集合有序可重复
            张三
            达尔
            溜达
            张三
            张三
    	
    
    
    
    	 // set集合无序不可重复
            张二
            
            溜达
    	
    

    
// People类
public class People {
    private List names;
    private Set addrs;
    public void setNames(List names) {this.names = names;}
    public void setAddrs(Set addrs) {this.addrs = addrs;}
    
    @Override
    public String toString() {
        return "People{" +
                ", names=" + names +
                ", addrs=" + addrs +
                '}';
    }
}

// @Test
public void setDI5(){
	ApplicationContext ctx = new ClassPathXmlApplicationContext("set-DI.xml");
	People people = ctx.getBean("people", People.class);
	System.out.println(people);
}

2.6 注入Map集合和properties:

  • Properties本质上也是一个Map集合

  • Properties的父类HashTable, HashTable实现了Map接口

  • 虽然这个也是Map集合, 但是和Map的注入方式不完全一样

  • Properties的key和value只能是String类型

// xml

     // 注入map集合
        
             // 如果key和value不是简单类型就用这个
            
            
            
        
    
    
     // 注入properties属性类对象
        
            ...
            ...
            ...
        
    


// People类
public class People {
    private Map phones;
    private Properties properties;
    public void setPhones(Map phones) {this.phones = phones;}
    public void setProperties(Properties properties) {this.properties = properties;}

    @Override
    public String toString() {
        return "People{" +
                "phones=" + phones +
                ", properties=" + properties +
                '}';
    }
}

// @Test
public void setDI5(){
	ApplicationContext ctx = new ClassPathXmlApplicationContext("set-DI.xml");
	People people = ctx.getBean("people", People.class);
	System.out.println(people);
}

2.7 注入null和空字符串:

  • 注入空字符串使用: 或者value=""

// xml

    // 注入空字符串的第一种方式
    
    	
    
    // 注入空字符串的第二种方式
    

    
// Dog类
public class Dog {
    private String name;
    private int age;
    public void setName(String name) {this.name = name;}
    public void setAge(int age) {this.age = age;}

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

// @Test
public void setEmpty(){
    ApplicationContext ctx = new ClassPathXmlApplicationContext("set-DI.xml");
    Dog dog = ctx.getBean("dog", Dog.class);
    System.out.println(dog);
}	
  • 注入null使用: 或者不为该属性赋值

// xml

    // 不给属性注入, 属性的默认值就是null
    // 
    // 手动注入null
    
    	
    

2.8 注入特殊字符:

【Spring】Spring对IoC的实现和依赖注入专题_第1张图片
// xml

    // 第一种方案
    
    
    // 第二种方案
    
    	// 只能使用value标签
    	
    

3. 引入外部的属性配置文件:

引入外部的properties文件

  • 第一步: 引入context命名空间

  • 第二步: 使用标签context: property-placeholder的location属性来指定属性配置文件的路径

  • location默认从类的根路径下开始加载资源

// xml


// 配置数据源

    // 怎么取值呢? ${key}
    
    
    
    


// jdbc.properties
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring6
jdbc.username=root
jdbc.password=123

你可能感兴趣的:(Java语法,spring,java,mybatis,servlet,后端)