IOC操作bean管理

一、xml注入集合属性

1.注入数组类型集合、set类型集合、map类型集合、list类型集合

1.前置条件: 生成数组类型的属性,生成其set方法。生成list类型,生成set方法。生成map类型的属性,生成其方法。生成set类型属性,生成其set方法。
public class Stu {
    private String[] courses;
    private List<String> list;
    private Map<String,String>maps;
    private Set<String> sets;
    public void setSets(Set<String> sets) {
        this.sets = sets;
    }
    public void setCourses(String[] courses) {
        this.courses = courses;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }
}
public void test(){
        System.out.println(Arrays.toString(courses));
        System.out.println(list);
        System.out.println(maps);
        System.out.println(sets);
    }
2.配置xml文件
<bean id="stu" class="com.szl.spring5.collectiontype.Stu">
        <property name="courses">
            <array>
                <value>java课程</value>
                <value>数据库课程</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>张三</value>
                <value>小三</value>
            </list>
        </property>
        <property name="maps">
            <map>
                <entry key="JAVA" value="java"></entry>
                <entry key="PHP" value="php"></entry>
            </map>
        </property>
        <property name="sets">
            <set>
                <value>MySQL</value>
                <value>Redis</value>
            </set>
        </property>
    </bean>
3.编写测试代码测试是否能正常输出
public class TestSpring5Demo1 {
    @Test
    public void testCollection(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        Stu stu = context.getBean("stu", Stu.class);
        stu.test();
    }
}

spring xml配置lettuce集群 spring xml配置map_spring

2.在集合里面设置对象类型值

1.创建一个成绩类,设置课程名称变量,生成set方法,重写tostring方法。在stu类中生成一个成绩变量,生成其set方法。
public class Course {
    private String cname;
    public void setCname(String cname) {
        this.cname = cname;
    }
}
@Override
    public String toString() {
        return "Course{" +
                "cname='" + cname + '\'' +
                '}';
    }
private List<Course>courseList;
    public void setCourseList(List<Course> courseList) {
        this.courseList = courseList;
    }
2.配置xml文件

1.创建多个course对象

<bean id="course1" class="com.szl.spring5.collectiontype.Course">
        <property name="cname" value="Sping5框架"></property>
    </bean>
    <bean id="course2" class="com.szl.spring5.collectiontype.Course">
        <property name="cname" value="MyBatis框架"></property>
    </bean>

2 .注入list属性对象,值是对象

<property name="courseList">
            <list>
                <ref bean="course1"></ref>
                <ref bean="course2"></ref>
            </list>
        </property>
3 .用测试类进行测试

spring xml配置lettuce集群 spring xml配置map_spring_02

成功输出

3.提取集合注入的部分

(1).在 spring 配置文件中引入名称空间 util。创建类,配置属性和set方法。
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
public class Book {
    private List<String>list;
    public void setList(List<String> list) {
        this.list = list;
    }
    public void test(){
        System.out.println(list);
    }
}
(2)提取list集合类型属性注入
<util:list id="bookList">
        <value>易筋经</value>
        <value>九阴真经</value>
        <value>九阳神功</value>
    </util:list>
(3)提取list集合类型属性注入使用
<bean id="book" class="com.szl.spring5.collectiontype.Book">
        <property name="list" ref="bookList"></property>
    </bean>
(4)测试结果:
@Test
    public void testCollection2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        Book book = context.getBean("book", Book.class);
        book.test();
    }

spring xml配置lettuce集群 spring xml配置map_xml_03

二、FactoryBean

1、Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
2、普通 bean:在配置文件中定义 bean 类型就是返回类型
3、工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样

(1)创建类

public class Mybean implements FactoryBean<Course> {
    @Override
    public Course getObject() throws Exception {
        Course course = new Course();
        course.setCname("abc");
        return course;
    }

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

    @Override
    public boolean isSingleton() {
        return FactoryBean.super.isSingleton();
    }
}

(2)配置xml文件

<bean id="myBean" class="com.szl.spring5.factorybean.Mybean"></bean>

(3)编写test测试

@Test
    public void test3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
        Course course = context.getBean("myBean", Course.class);
        System.out.println(course);
    }

结果:

spring xml配置lettuce集群 spring xml配置map_System_04

三、Bean的作用域

1.在 Spring 里面,默认情况下,bean 是单实例对象

spring xml配置lettuce集群 spring xml配置map_System_05

2.如何设置单实例还是多实例

(1) 在spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
(2)scope 属性值
第一个值 默认值,singleton,表示是单实例对象
第二个值 prototype,表示是多实例对象

<bean id="book" class="com.szl.spring5.collectiontype.Book" scope="prototype">
        <property name="list" ref="bookList"></property>
    </bean>

spring xml配置lettuce集群 spring xml配置map_xml_06


不相同

(3)singleton 和 prototype 区别

第一 singleton 单实例,prototype 多实例

第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象

设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用

getBean 方法时候创建多实例对象

四、Bean的生命周期

1、生命周期

从对象创建到对象销毁的过程

2、bean 生命周期

(1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
(3)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(4)bean 可以使用了(对象获取到了)
(5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

3、演示 bean 生命周期
public class Orders {
    private String oname;
    public Orders() {
        System.out.println("第一步 执行无参构造创建bean的实例");
    }
    public void setOname(String oname) {
        this.oname = oname;
        System.out.println("第二步 调用set方法设置属性值");
    }
    public void initmethod(){
        System.out.println("第三步 执行初始化的方法");
    }
    public void destoryMethod(){
        System.out.println("第五步 执行销毁的方法");
    }
    
}
<bean id="orders" class="com.szl.spring5.bean.Orders" init-method="initmethod" destroy-method="destoryMethod">
        <property name="oname" value="手机"></property>
    </bean>
@Test
    public void testBean3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
        Orders orders = context.getBean("orders", Orders.class);
        System.out.println("第四步 获取创建 bean实例对象");
        System.out.println(orders);
        ((ClassPathXmlApplicationContext)context).close();
    }

spring xml配置lettuce集群 spring xml配置map_spring_07

4、bean 的后置处理器,bean 生命周期有七步

(1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
(3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)(5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
(6)bean 可以使用了(对象获取到了)
(7)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

5、演示添加后置处理器效果

创建类,实现接口 BeanPostProcessor,创建后置处理器

public class MyBeanPost implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之前执行的方法");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之后执行的方法");
        return bean;
    }
}
<bean id="myBeanPost" class="com.szl.spring5.bean.MyBeanPost"></bean>

spring xml配置lettuce集群 spring xml配置map_System_08

五、自动装配

1.什么是自动装配

根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入

2.根据属性名称进行自动装配

(1)根据属性名称自动注入