Spring06、依赖注入(DI)

02-28 1560阅读

6、依赖注入(DI)

  • 依赖注入(Dependency Injection,DI)。

  • 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .

  • 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .

    6.1 构造器注入

    我们在之前的案例4已经详细讲过了

    6.2 set注入 (重点)

    要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is .

    测试pojo类 :

    Address.java

    public class Address {
        private String address;
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
    }

    Student.java

    package com.kuang.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[] books;
        private List hobbys;
        private Map card;
        private Set games;
        private String wife;
        private Properties info;
        public void setName(String name) {
            this.name = name;
        }
        public void setAddress(Address address) {
            this.address = address;
        }
        public void setBooks(String[] books) {
            this.books = books;
        }
        public void setHobbys(List hobbys) {
            this.hobbys = hobbys;
        }
        public void setCard(Map card) {
            this.card = card;
        }
        public void setGames(Set games) {
            this.games = games;
        }
        public void setWife(String wife) {
            this.wife = wife;
        }
        public void setInfo(Properties info) {
            this.info = info;
        }
        public void show(){
            System.out.println("name="+ name
                    + ",address="+ address.getAddress()
                    + ",books="
            );
            for (String book:books){
                System.out.print("\t");
            }
            System.out.println("\n爱好:"+hobbys);
            System.out.println("card:"+card);
            System.out.println("games:"+games);
            System.out.println("wife:"+wife);
            System.out.println("info:"+info);
        }
    }

    1、常量注入

        
    

    测试:

    @Test
    public void test01(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student.getName());
    }

    2、Bean注入

    ==注意点:这里的值是一个引用,ref==

        
        
        
            
                西游记
                红楼梦
                水浒传
            
        
    

    4、List注入

        
            听歌
            看电影
            爬山
        
    

    5、Map注入

        
            
            
        
    

    6、set注入

        
            LOL
            BOB
            COC
        
    

    7、Null注入

     
    

    测试结果:

    Spring06、依赖注入(DI)

    6.3 拓展注入实现

    User.java : 【注意:这里没有有参构造器!】

    public class User {
        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 "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

    1、P命名空间注入 : 需要在头文件中假如约束文件

    导入约束 : xmlns:p="http://www.springframework.org/schema/p"
    
    

    2、c 命名空间注入 : 需要在头文件中假如约束文件

    导入约束 : xmlns:c="http://www.springframework.org/schema/c"
    
    

    发现问题:爆红了,刚才我们没有写有参构造!

    解决:把有参构造器加上,这里也能知道,c 就是所谓的构造器注入!

    测试代码:

    @Test
    public void test02(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) context.getBean("user");
        System.out.println(user);
    }

    6.4 Bean的作用域

    在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象 .

    Spring06、依赖注入(DI)

    几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

    6.4.1 Singleton

    当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:

     
    

    测试:

    @Test
    public void test03(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) context.getBean("user");
        User user2 = (User) context.getBean("user");
        System.out.println(user==user2);
    }
    6.4.2 Prototype

    当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:

      
     或者
    
    6.4.3 Request

    当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]