第22课时 IOC-Bean管理(上)

IOC 操作 Bean 管理(概念)
1、什么是 Bean 管理
Bean 管理指的是两个操作
1)Spring 创建对象
2)Spirng 注入属性

2、Bean 管理操作有两种方式
1)基于 xml 配置文件方式实现
2)基于注解方式实现

第1节 IOC 操作 Bean 管理(基于 xml 方式)
基于 xml 方式创建对象

<!--配置User对象创建-->
    <!--<bean id="user" class="User"></bean>-->

在 spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建;
在 bean 标签有很多属性,介绍常用的属性
id 属性:唯一标识
class 属性:类全路径(包类路径)
(3)创建对象时候,默认也是执行【无参数构造】方法完成对象创建

2、基于 xml 方式注入属性
(1)DI:依赖注入,就是注入属性

3、第一种注入方式:使用 set 方法进行注入
创建类,定义属性和对应的 set 方法

/** 
 * 演示使用 set 方法进行注入属性 
 */ 
public class Book { 
    //创建属性 
    private String bname; 
    private String bauthor; 
    //创建属性对应的 set 方法 
    public void setBname(String bname) { 
        this.bname = bname; 
    } 
    public void setBauthor(String bauthor) { 
        this.bauthor = bauthor; 
    } 
} 

在 spring 配置文件配置对象创建,配置属性注入

<!--2 set 方法注入属性--> 
<bean id="book" class="cn.yiliedu.Book"> 
    <!--使用 property 完成属性注入 
        name:类里面属性名称 
        value:向属性注入的值 
    --> 
    <property name="bname" value="西游记"></property> 
    <property name="bauthor" value="吴承恩"></property> 
</bean> 

4、第二种注入方式:使用有参构造进行注入
(1)创建类,定义属性,创建属性对应有参数构造方法

public class Book1 {
    //创建属性
    private String bname;
    private String bauthor;

    public Book1(String bname, String bauthor) {
        this.bname = bname;
        this.bauthor = bauthor;
}
} 

(2)在 spring 配置文件中进行配置

<bean id="book" class="cn.yiliedu.bean.Book1">
        <constructor-arg name="bname" value="西游记2"></constructor-arg>
        <constructor-arg name="bauthor" value="吴承恩2"></constructor-arg>
</bean>


第2节 IOC 操作 Bean 管理(xml 注入其他类型属性)
1、字面量
null 值

<!--null 值--> 
<property name="address"> 
    <null/> 
</property> 

属性值包含特殊符号

<!--属性值包含特殊符号 
    1<>进行转义 &lt; &gt; 
    2 把带特殊符号内容写到CDATA 
--> 
<property name="address"> 
    <value><![CDATA[<<南京>>]]></value> 
</property> 
或:
<property name="address" >
<value>&lt;南京&gt;</value>
</property>

2、注入属性-外部 bean
创建两个类 service 类和 dao 类
在 service 调用 dao 里面的方法
在 spring 配置文件中进行配置

public class UserService { 
    //创建 UserDao 类型属性,生成 set 方法 
    private UserDao userDao; 
    public void setUserDao(UserDao userDao) { 
        this.userDao = userDao; 
    } 
    public void add() { 
        System.out.println("service add.	"); 
        userDao.update(); 
    } 
} 
<!--1 service 和 dao 对象创建--> 
<bean id="userService" class=" cn.yiliedu.service.UserService"> 
    <!--注入 userDao 对象 
        name 属性:类里面属性名称 
        ref 属性:创建userDao 对象 bean 标签 id 值 
    --> 

3、注入属性-内部 bean
一对多关系:部门和员工
一个部门有多个员工,一个员工属于一个部门部门是一,员工是多
在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示。

//部门类 
public class Dept { 
    private String dname; 
    public void setDname(String dname) { 
        this.dname = dname; 
    } 
} 
//员工类 
public class Emp { 
    private String ename; 
    private String gender; 
    //员工属于某一个部门,使用对象形式表示 
    private Dept dept; 
    public void setDept(Dept dept) { 
        this.dept = dept; 
    } 
    public void setEname(String ename) { 
        this.ename = ename; 
    } 
    public void setGender(String gender) { 
        this.gender = gender; 
 } 
} 

在 spring 配置文件中进行配置:

<!--内部 bean--> 
<bean id="emp" class=" cn.yiliedu.bean.Emp"> 
    <!--设置两个普通属性--> 
    <property name="ename" value="lucy"></property> 
    <property name="gender" value="女"></property> 
    <!--设置对象类型属性--> 
    <property name="dept"> 
        <bean id="dept" class=" cn.yiliedu.spring5.bean.Dept"> 
            <property name="dname" value="安保部"></property> 
        </bean> 
    </property> 
</bean> 
 也可以采用注入外部bean的方式。

4、注入属性-级联赋值
第一种写法

<!--级联赋值--> 
<bean id="emp" class=" cn.yiliedu.bean.Emp"> 
    <!--设置两个普通属性--> 
    <property name="ename" value="lucy"></property> 
    <property name="gender" value="女"></property> 
    <!--级联赋值--> 
    <property name="dept" ref="dept"></property> 
</bean> 
<bean id="dept" class=" cn.yiliedu.bean.Dept"> 
    <property name="dname" value="财务部"></property> 
</bean> 

第二种写法

//级联赋值
<bean id="emp" class=" cn.yiliedu.bean.Emp"> 
    //设置两个普通属性
 <property name="ename" value="lucy"></property> 
 <property name="gender" value="女"></property> 
   //级联赋值(优先设置)
 <property name="dept" ref="dept"></property> 
 <property name="dept.dname" value="技术部"></property>
</bean> 

<bean id="dept" class=" cn.yiliedu.bean.Dept"> 
</bean> 

第3节 IOC 操作 Bean 管理(bean 作用域)
1、在 Spring 中,默认情况下,bean 是单实例对象

@Test
public void tesBook4() {
    //1 加载spring配置文件
    ApplicationContext context =
            new ClassPathXmlApplicationContext("bean1.xml");

    //2 获取配置创建的对象
    Book book1 = context.getBean("book", Book.class);
    Book book2 = context.getBean("book", Book.class);

    System.out.println(book1);
    System.out.println(book2);
}

book1:cn.yiliedu.bean.Book@7a30d1e6
book2:cn.yiliedu.bean.Book@7a30d1e6

2、如何设置单实例还是多实例
在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
scope 属性值,第一个值 默认值,singleton,表示是单实例对象第二个值 prototype,表示是多实例对象
singleton 和 prototype 区别
第一 singleton 单实例,prototype 多实例
第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用
getBean 方法时候创建多实例对象

懒加载:lazy-init设置为true的时候,该类在ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“bean.xml”);的时候不会调用构造方法,只有getBean的时候才会调用。

第4节 IOC 操作 Bean 管理(bean 生命周期)
1、生命周期
(1)从对象创建到对象销毁的过程

2、bean 生命周期
1)通过构造器创建 bean 实例(无参数构造)注意!此处说法不准确,也可能是有参构造
2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
3)调用 bean 的初始化的方法(需要进行配置初始化的方法)
4)bean 可以使用了(对象获取到了)
5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
补充:1、我们也可以让Bean实现InitializingBean接口,那么Bean在 第(2)步后将会执行接口中的afterPropertiesSet()方法来进行初始化,但是这种方式会将代码耦合于spring中
2、我们也可以让Bean实现DisposableBean接口,Spring将会在容器关闭时候调用该接口的destory()方法,但是这种方式会将代码耦合于spring中

3、演示 bean 生命周期

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 destroyMethod() {
        System.out.println("第四步 执行销毁的方法");
    }
}

bean.xml:

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

Test方法

 @Test
    public void Mytest6(){
       ClassPathXmlApplicationContext classPathXmlApplicationContext=new ClassPathXmlApplicationContext("bean.xml");
        //Orders orders = classPathXmlApplicationContext.getBean("Orders", Orders.class);
        classPathXmlApplicationContext.close();//销毁容器

    }

总结:
第一种:通过有参构造函数设置bean:1.调用有参构造函数,2.调用初始化函数,3.调用销毁函数。
第二种:通过set方法设置bean:1.调用无参构造函数,2.调用set方法,3.调用初始化函数,4.调用销毁函数。
4、bean 的后置处理器,bean 生命周期有七步
1.通过构造器创建 bean 实例
2.为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
3.调用后置处理器的方法 postProcessBeforeInitialization
4.调用 bean 的初始化的方法(需要进行配置初始化的方法)
5.调用后置处理器的方法 postProcessAfterInitialization
6.bean 可以使用了(对象获取到了)
7.当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
在这里插入图片描述
5、演示添加后置处理器效果
(1)创建类,实现接口 BeanPostProcessor,创建后置处理器

public class MyPostProcessor implements BeanPostProcessor {


    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("后期处理器的的before方法执行了");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("后期处理器的的After方法执行了");
        return bean;
    }
}


<!--配置后置处理器-->
 <bean id="orders" class="cn.yiliedu.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
    <property name="oname" value="手机"></property>
</bean>

<bean id="myPostProcessor" class="cn.yiliedu.bean.MyPostProcessor" ></bean>


另外的几个接口BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值