Spring5-IOC容器基于XML配置管理

IOC容器

1、什么是IOC
  • 把对象的创建以及对象之间的相互调用过程交给spring进行管理
  • 其目的是为了降低耦合度
2、IOC底层技术
  • xml解析、工厂模式、反射
3、spring提供的IOC容器实现的两种方式(接口)
  • BeanFactory接口
    1、该接口是spring内部接口所使用,不提供给开发人员使用
    2、此方式创建IOC容器,在加载配置文件时不会创建对象,在获取对象时才会创建
  • ApplicationContext接口(推荐)
    1、是BeanFactory接口的子接口,有更多的功能,提供给开发人员使用
    2、加载配置文件时就会创建对象

IOC-bean管理

  • IOC容器bean管理操作:创建对象、注入属性
1、spring创建对象


2、spring注入属性
  • 属性set方法

使用property标签初始化的属性,必须有set公共方法

// 创建User类
public class User {
    private String name;

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

        
        

  • 有参构造器

使用constructor-arg标签初始化属性,该类必须拥有对应的有参构造器

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }
}

        
        

  • 为属性注入null或特殊字符

        
        
            
        

        
        
        
            @3<]]>
        

  • 注入属性 - 外部bean(属性指向其他类对象)
public class User {
    private String name;
    private Animal animal;

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

    public void setAnimal(Animal animal) {
        this.animal = animal;
    }
}

class Animal {
    private String name;
    private int age;

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

    public void setAge(int age) {
        this.age = age;
    }
}

class Cat extends Animal { 
}

        
        
        
    
    
    
        
        

  • 注入属性 - 内部bean

在property属性标签内部创建bean标签


        
        
            
            
                
                
            
        

  • 注入属性 - 级联赋值
public class User {
    private String name;
    private Cat cat;

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

    public void setAnimal(Cat cat) {
        this.cat = cat;
    }
    // 使用对象.属性的方式进行级联赋值,则该get对象方法必须有
    public Cat getCat() {
        return cat;
    }
}

class Animal {
    private String name;
    private int age;

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

    public void setAge(int age) {
        this.age = age;
    }
}

class Cat extends Animal {
}

    
    
    
    
    

  • 注入属性 - 数组、集合类型
public class User {
    private String[] hobby;
    private List honor;
    private Map exam;

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    public void setHonor(List honor) {
        this.honor = honor;
    }

    public void setExam(Map exam) {
        this.exam = exam;
    }
}

        
        
            
                打篮球
                写情书
            
        
        
        
            
                2019全国奥数第二名
                青年组自由滑雪全国第三名
            
        
        
        
            
                
                
                
            
        

  • 注入属性 - 集合类型属性包含其他对象类型
public class User {
    private List courses;

    public void setCourses(List courses) {
        this.courses = courses;
    }
}

class Course {
    private String name;
    private String teacher;

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

    public void setTeacher(String teacher) {
        this.teacher = teacher;
    }
}

        
        
            
                
                
            
        


        
        


        
        

  • 注入属性 - 公共数据



    
    
        篮球
        足球
        游泳
    

    
    
        
        
    

    
        
        
    
    
        
        
    
    
        
        
    
3、FactoryBean
  • Spring包括两种bean类型,普通bean类型和工厂bean类型
  • 普通bean类型在配置文件定义的bean类型就是返回值类型
  • 工厂bean类型在配置文件定的类型可以不是返回值类型
  • 工厂bean创建方式:
    1、创建类并实现FactoryBean接口
    2、实现getObject方法,在方法中设置返回值类型
// 定义工厂bean
public class MyFactoryBean implements FactoryBean {
    @Override
    public User getObject() throws Exception {
        User user = new User();
        return user;
    }

    @Override
    public Class getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

@Test
public void test() {
    ApplicationContext appContext =
            new ClassPathXmlApplicationContext("bean2.xml");
    User user = appContext.getBean("my_factofy_bean", User.class);
}
4、创建bean的单例和多实例
  • Spring中创建bean对象(getBean方法)默认情况是单例模式
  • 通过配置标签中的scope属性,可以设置为多实例模式
  • singleton:单实例模式,在加载配置文件时创建对象
  • prototype:多实例模式,在调用getBean方法是创建对象

5、bean生命周期
  • bean对象从创建到销毁流程
    1、通过构造器创建bean对象实例(无参构造)
    2、为bean对象的属性赋值(属性set方法)
    3、调用bean对象的初始化方法(需要配置)
    4、获取到完整的bean对象实例,可以使用
    5、容器关闭时,调用bean对象的销毁方法(需要配置)
public class User {
    private String name;

    public User() {
    }

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

    // 自定义初始化方法
    public void initMethod() {
        System.out.println("初始化方法");
    }

    // 自定义销毁方法
    public void destroyMethod() {
        System.out.println("销毁方法");
    }
}

bean标签中init-method和destory-method属性配置初始化和销毁方法


    
        
    
  • 创建并配置后置处理器后(实现BeanPostProcessor接口),将在bean的初始化方法调用前后分别执行前置方法和后置方法
public class MyBeanPost implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return null;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return null;
    }
}

配置后置处理器


6、操作外部属性文件(properties格式文件)
  • 直接配置数据库连接池参数

        
        
        
        

  • 通过properties文件配置

1、创建properties文件

prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDb
prop.userName=root
prop.password=root

2、修改配置文件





    
    

    
    
        
        
        
        
    

你可能感兴趣的:(Spring5-IOC容器基于XML配置管理)