Spring学习日记04_IOC_Bean管理_xml配置

工厂Bean

  1. Spring里面有两种类型bean
  • 普通bean:在配置文件中定义bean类型就是返回类型
  • 工厂bean(FactoryBean):在配置文件定义bean类型可以和返回类型不一样
  1. 工厂bean
  • 第一步 创建类,让该类作为工厂bean,实现接口FactoryBean
  • 第二步 实现接口里面的方法,在实现的方法中定义返回的bean类型

Class

public class MyBean implements FactoryBean<Course> {
    //定义返回bean
    public Course getObject() throws Exception {
        Course course = new Course();
        course.setCname("course");
        return course;
    }

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

    public boolean isSingleton() {
        return false;
    }
}

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

xml

    <bean id="myBean" class="Spring.Ioc.Day07.factorybean.MyBean">
    </bean>

bean的作用域

  1. 在Spring里面,设置创建bean实例是单实例还是多实例
  2. 在Spring里面,默认情况下,bean是单实例对象
  3. 如何设置单实例与多实例
  • 在spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例
  • scope属性值
    • prototype
    • singleton
    <bean id="book" class="Spring.Ioc.Day05.collection.book" scope="prototype">
        <property name="list" ref="bookList"></property>
    </bean>
  • singleton和prototype区别
    • singleton单实例,prototype多实例
    • 设置scope值是singleton时,加载spring配置文件时就会创建单实例对象
    • 当scope值是prototype时,在调用getBean方法时才创建多实例对象

bean的生命周期

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

  2. 演示bean的生命周期

class

public class Orders {

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

    private String oname;

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

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

    public void destoryMethod(){
        System.out.println("第五步 执行销毁方法");
    }
}

xml

    <bean id="orders" class="Spring.Ioc.Day11.bean.Orders" init-method="initMethod" destroy-method="destoryMethod">
        <property name="oname" value="orderName"></property>
    </bean>

test

    public void testBean(){
       // ApplicationContext context = new ClassPathXmlApplicationContext("bean8.xml");
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean8.xml");
        Orders orders = context.getBean("orders",Orders.class);
        System.out.println("第四步 获取创建bean实例对象");
        System.out.println(orders);
        context.close();
    }
  1. bean的后置处理器,bean的七步声明周期
    (1)通过构造器创建bean实例(无参数构造)
    (2)为bean的属性设置值和对其他bean的引用(调用set方法)
    (3)把bean实例传递bean后置处理器方法
    (4)调用bean的初始化的方法(需要进行配置)
    (5)把bean实例传递bean后置处理器方法
    (6)bean可以使用了(对象获取到了)
    (7)当容器关闭时,调用bean的销毁方法(需要进行配置销毁的方法)

  2. 演示添加后置处理器效果

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

class

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

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之后执行的方法");
        return bean;
    }
}

xml

  </bean>
    <!--为所有bean添加配置处理器-->
    <bean id="beanPost" class="Spring.Ioc.Day11.bean.BeanPost"></bean>

xml自动装配

  1. 根据指定装配规则,Spring自动将匹配的属性值进行注入
  • autowire="byName"
    • 按属性名称注入,bean的id值要和类的属性名称相同
  • autowire="byType"
    • 按属性类型注入,相同类型的bean不能定义多个

xml

    <bean id="emp" class="Spring.Ioc.Day25.autowire.Emp" autowire="byName">
<!--手动装配
<property name="dept" ref="dept"></property>
-->
    </bean>
    <bean id="dept" class="Spring.Ioc.Day25.autowire.Dept"></bean>

引入外部属性文件

  1. 直接配置数据库信息
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/forest_blog?serverTimezone=UTC"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>
  1. 引入外部属性文件配置数据库连接池
  • 创建外部属性文件,properties格式文件

jdbc.properties

prop.driverClass =com.mysql.jdbc.Driver
prop.url = jdbc:mysql://127.0.0.1:3306/forest_blog?serverTimezone=UTC
prop.userName = root
prop.password = 123456
  • 把外部文件引入到Spring配置文件中
    • 引入名称空间
      xmlns:context="http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

    • 在spring配置文件中使用标签引入外部属性文件

    <context:property-placeholder location="classpath:jdbc.properties"/>
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="${prop.driverClass}"></property>
            <property name="url" value="${prop.url}"></property>
            <property name="username" value="${prop.userName}"></property>
            <property name="password" value="${prop.password}"></property>
        </bean>
posted @ 2021-07-25 21:32  Ueao  阅读(52)  评论(0)    收藏  举报