依赖注入

(一) 构造器注入

1. 使用无参构造创建对象,这是默认的!

    
    
        
    

2. 使用有参构造创建对象

  • 1)第一种方式:下标赋值
    
    
        
    
  • 2)通过类型创建,但不建议使用,影响多态的实现
    
    
        
    
  • 3)第三种方式:直接通过参数名来设置
    
    
        
    

(二)Set方式注入

  • 依赖注入:Set注入
    • 依赖:bean对象的创建依赖于容器
    • 注入:bean对象中所有的属性,都由容器来注入

【环境搭建】

  1. 复杂类型
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 hobbies;
    private Map care;
    private Set games;
    private String wife;
    private Properties info;
}
  1. beans.xml



    
    
        
    


  1. 测试类
public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);
    }
}
  1. 完善



    
        
    

    
        
        
        
        

        
        
            
                三国演义
                红楼梦
                西游记
                红楼梦
            
        

        
        
            
                听歌
                看电影
                敲代码
                玩游戏
            
        

        
        
            
                
                
            
        

        
        
            
                API
                LOL
                COC
            
        

        
        
            
        

        
        
            
                19120501
                
                楚名
            
        
    


(三)拓展注入

1. p-namespace :

使用bean元素的属性(而不是嵌套的元素)来描述协作 Bean 的属性值,或同时使用这两者,相当于set注入

2. c-namespace

c:命名空间执行与基于构造函数的依赖注入相同的操作,相当于构造器注入

  • 代码实现



    
    

    
    


  • 测试代码
        ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
        User user = (User) context.getBean("userConstructor");
        System.out.println(user.toString());
  • 注意:
    要加入的一段代码:xml约束
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"

(四)Bean的作用域

Scope Description
singleton (默认)将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例。
prototype 将单个 bean 定义的作用域限定为任意数量的对象实例。
request 将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有一个在单个 bean 定义后面创建的 bean 实例。仅在web的 Spring ApplicationContext中有效。
session 将单个 bean 定义的范围限定为 HTTP Session的生命周期。仅在web的 Spring ApplicationContext上下文中有效。
application 将单个 bean 定义的范围限定为ServletContext的生命周期。仅在web的 Spring ApplicationContext上下文中有效。
websocket 将单个 bean 定义的范围限定为WebSocket的生命周期。仅在web的 Spring ApplicationContext上下文中有效。
  1. 单例模式(Spring默认机制)

  1. 原型模式:每次都从容器中get的时候,都会产生一个新的对象

  1. 其余的 request、session、application、websocket,这些只能在web开发中使用到

你可能感兴趣的:(依赖注入)