spring学习笔记2

IOC操作bean管理(FactoryBean)

1.Spring有两张类型bean,一种普通bean,另一种工厂bean(FactoryBean)

2.普通bean:在配置文件中定义bean类型就是返回类型

3.工厂bean:在配置文件定义bean类型可以和返回类型不一样

第一步 创建类,让这个类作为工厂bean,实现接口FactoryBean

第二步 实现接口里面的方法,在实现的方法中定义返回的bean的类型

 <bean id="myBean" class="com.atguigu.spring5.factoryBean.MyBean">

    </bean>
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;
    }
}

 

 

bean的作用域

1.即在spring里面设置创建bean实例是单实例还是多实例(即创建多个对象是,所创建的对象是同一个对象还是不同的多个对象)

2.spring中默认是单实例

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

(1)在Spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例

(2)scope属性值

第一个值,默认值,singleton,表示单实例对象

第二个值,prototype,表示多实例对象

<bean id="book" class="com.atguigu.spring5.collectionType.Book" scope="prototype">
        <property name="books" ref="bookList"></property>
    </bean>

 

 (3)singleton和prototype区别

第一 singleton单实例,prototype多实例

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

  设置scope值是prototype时候,不是加载spring配置文件时候创建对象 ,而是在调用getBean方法时候创建多实例对象

 

IOC操作Bean管理(bean生命周期)

1、生命周期

(1)从对象创建到对象销毁的过程

2、bean生命周期

(1)通过构造器创建bean实例(无参数构造)

(2)为bean的属性设置值和对其他bean引用(调用set方法)

(3)调用bean的初始化方法(需要进行配置初始化的方法)

(4)bean可以使用了(对象获取到了)

(5)当容器关闭是,调用bean的销毁方法(需要进行配置销毁的方法)

3.演示生命周的过程

 

<bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oname" value="手机"></property>
    </bean>
public class Orders {
    private String oname;

    public Orders(){
        System.out.println("第一步,只想无参数构造,创建对象");
    }
    public void setOname(String oname) {
        this.oname = oname;
        System.out.println("第二步,调用set方法,设置属性的值");
    }

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

    //销毁方法
    public void destroyMethod(){
        System.out.println("第五步,执行销毁方法");
    }
}
 @org.junit.Test
    public void testbean(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
        Orders orders= context.getBean("orders", Orders.class);
        System.out.println("第四步,使用bean对象");
        System.out.println(orders);

        //手动让bean实例关闭
        ((ClassPathXmlApplicationContext)context).close();
    }

 

4.加上bean的后置处理器,bean生命周期共有7步

(1)通过构造器创建bean实例(无参数构造)

(2)为bean的属性设置值和对其他bean引用(调用set方法)

(3)调用bean的初始化方法(需要进行配置初始化的方法)

(4)bean可以使用了(对象获取到了)

(5)当容器关闭是,调用bean的销毁方法(需要进行配置销毁的方法)

 

 

 

<bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oname" value="手机"></property>
    </bean>

    <!--配置后置处理器-->
    <bean id="myBeanPost" class="com.atguigu.spring5.bean.MyBeanPost"></bean>
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;
    }
}

 

xml自动装配

1.什么是自动装配?

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

根据属性名称自动装配  

<bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="byName">
<!--        <property name="dept" ref="dept"></property>-->
    </bean>
    <bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean>

根据属性类行自动装配

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

 

IOC操作bean管理(外部属性文件)

以操作数据库为例

<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"
       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.jdbc.Driver"></property>-->
<!--        <property name="url" value="jdbc:mysql://localhost:3306/userDb"></property>-->
<!--        <property name="username" value="root"></property>-->
<!--        <property name="password" value="root"></property>-->
<!--     </bean>-->

    <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>
prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDb
prop.userName=root
prop.password=root

 

posted @ 2022-07-15 22:45  见怪见外  阅读(16)  评论(0编辑  收藏  举报