4. Spring-IOC操作Bean管理-基于xml配置文件实现2

一、基于xml方式注入集合属性

  1. 实体类
public class Stu {
    //1. 数组类型属性
    private String[] courses;
    //2. List集合类型
    private List<String> list;
    //3. Map集合类型
    private Map<String,String> maps;
    //4.Set集合类型
    private Set<String> 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 setSets(Set<String> sets) {
        this.sets = sets;
    }

	
}

  1. 配置文件

    注入数组类型属性
    注入List集合类型属性
    注入Map集合类型属性

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--集合类型-->
    <bean id="stu" class="com.znb.spring5.collectionType.Stu">
        <!--数组属性注入-->
        <property name="courses">
            <array>
                <value>java</value>
                <value>数据库</value>
                <value>c</value>
            </array>
        </property>
        <!--list-->
        <property name="list">
            <list>
                <value>张三</value>
                <value>李四</value>
            </list>
        </property>
        <!--map-->
        <property name="maps">
            <map>
                <entry key="1" value="java"></entry>
                <entry key="2" value="c#"></entry>
            </map>
        </property>
        <!--set-->
        <property name="sets">
            <set>
                <value>MySql</value>
                <value>Redis</value>
            </set>
        </property>
    </bean>
</beans>
  1. 测试类
public class StuTest extends TestCase {

    public void testTest1() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        Stu stu = context.getBean("stu", Stu.class);
        stu.test();
    }
}

在这里插入图片描述

1. 在集合中设置对象类型的值

 <!--集合类型-->
    <bean id="stu" class="com.znb.spring5.collectionType.Stu">
        <!--注入List集合类型,值是对象-->
        <property name="courseList">
            <list>
                <ref bean="course1"></ref>
                <ref bean="course2"></ref>
            </list>
        </property>
    </bean>

    <!--创建多个course对象-->
    <bean id="course1" class="com.znb.spring5.collectionType.Course">
        <property name="cName" value="Spring5"></property>
    </bean>
    <bean id="course2" class="com.znb.spring5.collectionType.Course">
        <property name="cName" value="Mybatis"></property>
    </bean>

2. 提取注入属性的公共部分

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <!--提取list集合类型属性注入-->
    <util:list id="bookList">
        <value>数学</value>
        <value>语文</value>
        <value>英语</value>
    </util:list>
    <!--属性注入-->
    <bean id="book" class="com.znb.spring5.collectionType.Book">
        <property name="list" ref="bookList"></property>
    </bean>
</beans>

二、FactoryBean

  1. FactoryBean可以使得返回值的类型和配置文件中的类型不一致
  2. 实体类
public class MyBean implements FactoryBean<Course> {
    //定义返回bean
    @Override
    public Course getObject() throws Exception {
        Course course = new Course();
        course.setcName("mybatis");
        return course;
    }

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

    @Override
    public boolean isSingleton() {
        return FactoryBean.super.isSingleton();
    }
}
  1. 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <bean id="myBean" class="com.znb.spring5.factoryBean.MyBean"></bean>
</beans>
  1. 测试类
public class StuTest extends TestCase {

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

在这里插入图片描述

三、bean的作用域

  1. 在spring里面,设置创建bean实例默认是单实例。

1. 设置单实例和多实例。

  1. 设置scope属性值为protoptype为多实例
 <bean id="book" class="com.znb.spring5.Book" scope="prototype">
        <!--注入属性-->
        <property name="bookName" value="红楼梦"></property>
        <property name="bookAuthor" value="曹雪芹"></property>
    </bean>
  1. 测试类
public class BookTest extends TestCase {

    public void testBookAndAuthor() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        Book book = context.getBean("book", Book.class);
        Book book1 = context.getBean("book", Book.class);
        System.out.println(book);
        System.out.println(book1);
    }
}

在这里插入图片描述

2. singleton和prototype区别

  1. singleton单实例,prototype多实例。
  2. 设置scope值为singleton,加载配置文件时候就会创建单实例对象。
  3. 设置scope值为prototype,不是在加载配置文件时候就会创建单实例对象。在调用getBean方法时候创建多实例对象。

四、bean的生命周期

  1. 生命周期——从对象创建到对象销毁的过程。

1. bean生命周期-5步

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

2. 实例演示

  1. 实体类
public class Orders {
    private String orderName;

    //无参构造方法
    public Orders(){
        System.out.println("第一步,执行无参构造创建bean实例");
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
        System.out.println("第二步,调用set方法设置属性值");
    }


    //创建执行初始化的方法
    public void initMethod(){
        System.out.println("第三步,执行初始化的方法");
    }

    //创建执行销毁的方法
    public void destroyMethod(){
        System.out.println("第五步,执行销毁方法");
    }
}
  1. 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <bean id="orders" class="com.znb.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="orderName" value="电话"></property>
    </bean>
</beans>
  1. 测试类
public class OrdersTest extends TestCase {

    public void testBean(){
       ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
        Orders orders = context.getBean("orders", Orders.class);
        System.out.println("第四步,获取到创建的bean实例对象");
        System.out.println(orders);

        //手动让bean实例销毁
        context.close();
    }
}

在这里插入图片描述

3. bean的后置处理器-7步

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

4. 演示添加后置处理器

  1. 创建类,实现接口 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;
    }
}
  1. 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <bean id="orders" class="com.znb.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="orderName" value="电话"></property>
    </bean>

    <!--配置后置处理器-->
    <bean id="myBeanPost" class="com.znb.spring5.bean.MyBeanPost"></bean>
</beans>
  1. 执行测试方法
    在这里插入图片描述

五、自动装配

1. 什么是自动装配。

根据指定的装配规则,Spring自动将匹配的属性值进行注入。

2. 演示自动装配的过程

  1. 实体类
public class Dept {
    @Override
    public String toString() {
        return "Dept{}";
    }
}
public class Emp {

    private Dept dept;

    @Override
    public String toString() {
        return "Emp{" +
                "dept=" + dept +
                '}';
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public void test(){
        System.out.println(dept);
    }
}
  1. 根据属性名称自动注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <!--实现自动装配
        配置bean标签属性值autowire,实现自动装配
        byName:根据属性名称注入,id值和类别属性名称一样
        byType:根据属性类型注入
    -->
    <bean id="emp" class="com.znb.spring5.autowire.Emp" autowire="byName">
        <!--<property name="dept" ref="dept"></property>-->
    </bean>

    <bean id="dept" class="com.znb.spring5.autowire.Dept"></bean>
</beans>
  1. 根据属性类型自动注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <!--实现自动装配
        配置bean标签属性值autowire,实现自动装配
        byName:根据属性名称注入,id值和类别属性名称一样
        byType:根据属性类型注入
    -->
    <bean id="emp" class="com.znb.spring5.autowire.Emp" autowire="byType">
        <!--<property name="dept" ref="dept"></property>-->
    </bean>

    <bean id="dept" class="com.znb.spring5.autowire.Dept"></bean>
</beans>
  1. 测试类
public class EmpTest extends TestCase {

    public void testTest1() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");
        Emp emp = context.getBean("emp", Emp.class);
        System.out.println(emp);
    }
}

在这里插入图片描述

六、外部属性文件

1. 直接配置数据库信息

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                           http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd
                                                                                                                                        ">

    <!--直接配置-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/useDb"></property>
        <property name="username" value="root"></property>
        <property name="password" value="2550"></property>
    </bean>
</beans>

2. 引入外部属性文件配置数据库信息

  1. 配置文件properties
// mysql 8.0驱动
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/useDb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
username=root
password=2550
maxActive=5
maxWait=2000
initialSize=3
minIdle=2
  1. bean配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                           http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd
                                                                                                                                        ">
    <!--引入外部属性文件-->
    <context:property-placeholder location="jdbc.properties"></context:property-placeholder>
    <!--直接配置连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!-- 获取properties文件内容,根据key获取,使用spring表达式获取 -->
        <property name="driverClassName" value="${driverClassName}">

        </property>
        <property name="url" value="${url}">

        </property>
        <property name="username" value="${username}">

        </property>
        <property name="password" value="${password}">

        </property>
    </bean>
</beans>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CAFEBABE 34

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值