Spring学习(三)ioc工厂bean深入理解

一、ioc工厂配置的bean分类:

划分依据:
getBean("xx") 调用某个bean对象返回的对象实例类型是否是class属性指向的类型

1、普通bean
getBean("xxx")  ==  class 属性

2、工厂bean

getBean("xxx")  !=  class属性  (class属性中指向的是一个工厂类,调用这个bean对象,想要的并不是class属性指向的工厂 ,而是该工厂负责创建的实例对象。)

二、工厂bean的必要性:

  ioc并不是万能的,并不能创建开发过程中涉及到的所有对象,当ioc无法或者不能直接实例化某个对象时,需要一个第三方工厂帮助其实例化该对象,将这个第三方工厂配置在ioc环境下,实现 ioc直接管理的对象(普通对象)  和  第三方工厂创建的对象(ioc无法直接实例的对象)  之间的依赖关系。

  ioc无法实例化什么对象?
接口类型对象 并且本工程中不允许提供接口的实现类。(因为ioc通过反射机制创建对象,接口不能反射)比如QQ授权登录只提供验证接口、获取天气等

三、在ioc中配置工厂bean的三种方式:

1  静态工厂
2  动态工厂(忽略)
3  实现FactoryBean接口(spring提供的工厂bean根接口)

下面,通过这个例子 来了解1 、 3这两种方式:

applicationContext.xml:

<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-3.2.xsd">
    <!--
        使用ioc依赖注入实现LoginAction、UserDaoIf依赖关系

     -->
     <bean id="action" class="com.etoak.action.LoginAction">
        <!-- <property name="dao" ref="fb"></property> -->
        <property name="dao" ref="factory"></property>
     </bean>
     <!--
                1 静态工厂 ~ 工厂模式
            factory-method : 指向工厂类中提供的静态方法
                a  ioc容器会将具备改属性的bean当作工厂bean对待
                b  调用这个工厂bean时,返回的对象实例不在是class属性指向的对象类型
                    而是该工厂自动调用factory-method属性指向的方法(必须是静态的)返回的对象类型
                    所以这里getBean()得到的是UserDaoIf对象
        2 动态工厂(忽略)
      -->
      <bean id="factory" class="com.etoak.factory.DaoFactory"
            factory-method="getDao"></bean>
      <!--
        3 FactoryBean接口
            (UserDaoIf)getBean("fb")
            ioc容器会将所有实现了FactoryBean接口的类作为工厂bean对象
        调用工厂bean时返回的对象实例 是 该工厂自动调用其getObject()返回的对象实例
       -->
      <bean id="fb" class="com.etoak.factory.DaoFactoryBean"></bean>
</beans>

UserDaoIf.java

package com.etoak.dao;
/**
 * 以接口的方式为LoginAction提供登录检查服务
 * 只需要知道LoginAction要实现登录操作需要一个login()方法
 * 不需要知道login()方法如何实现
 * 用到的时候只需要远程调用其他服务器上的实现方法
 * @author D_xiao
 *
 */
public interface UserDaoIf  {
    public boolean login();
}

DaoFactory.java

package com.etoak.factory;

import com.etoak.dao.UserDaoIf;
/**
 * 静态工厂
 * @author D_xiao
 *
 */
public class DaoFactory {
    //UserDaoIf
    private static UserDaoIf dao;
    static{
        dao = new UserDaoIf(){
            public boolean login(){
                //不能实例化具体对象,但能调用远程的东西
                System.out.println("使用webservice技术远程调用其他服务器中的具体实现");
                return true;
            }
        };
    }
    public static UserDaoIf getDao(){
        return dao;
    }
}

DaoFactoryBean.java

package com.etoak.factory;

import org.springframework.beans.factory.FactoryBean;
import com.etoak.dao.UserDaoIf;
/**
 * FactoryBean接口,第三方工厂
 * @author D_xiao
 *
 */
public class DaoFactoryBean implements FactoryBean{

    @Override
    public Object getObject() throws Exception {
        // 当前工厂需要创建的对象实例
        return new UserDaoIf(){
            public boolean login(){
                System.out.println("使用webservice调用其他服务器方法");
                return true;
            }
        };
    }

    @Override
    public Class getObjectType() {
        // 描述当前工厂创建的实例类型
        return UserDaoIf.class;
    }

    @Override
    public boolean isSingleton() {
        // 描述创建的单例状态  单例/ 非单例
        return false;
    }

}

LoginAction.java

package com.etoak.action;

import com.etoak.dao.UserDaoIf;

public class LoginAction {

    private UserDaoIf dao;

    public void setDao(UserDaoIf dao) {
        this.dao = dao;
    }

    public String execute() throws Exception{
        dao.login();
        return "success";
    }
}

Test.java (测试)

package com.etoak.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.etoak.action.LoginAction;

public class Test {
    public static void main(String[] args) throws Exception{
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
          ac = new FileSystemXmlApplicationContext("src/applicationContext.xml");
         LoginAction la = (LoginAction)ac.getBean("action");
         //UserDaoImpl ud = ac.getBean(UserDaoImpl.class);
         la.execute();
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 00:08:55

Spring学习(三)ioc工厂bean深入理解的相关文章

Spring学习之Ioc控制反转(1)

开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------------------------------开始啦啦啦啦啦------------------------------------------------------------------------------- 从开始接触spring起,听到最多的就是Ioc(控制反转)和AOP(面向切面编程

Spring学习之Ioc控制反转(2)

开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------------------------------开始啦啦啦啦啦------------------------------------------------------------------------------- 上一篇博文简单的演示了如何用Spring框架创建bean,注入bean,并使用到

swift学习三:?和!理解

Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使用变量之前不进行初始化就会报错: 1 2 3 4 5 var stringValue : String   //error: variable 'stringValue' used before being initialized //let hashValue = stringValue.hashValue //            

Spring基础学习(三)&mdash;详解Bean(下)

一.Bean的生命周期 1.概述      Spring IOC容器可以管理Bean的生命周期,Spring 允许在Bean的生命周期的特定点执行定制的任务.      Spring IOC容器对Bean的生命周期进行管理的过程:      (1)通过构造器或工厂方法创建Bean实例.      (2)为Bean的属性设置值和对其他Bean的引用.      (3)调用Bean的初始化方法.      (4)Bean可以使用了.      (5)当容器关闭时,调用Bean的销毁方法.     

Spring学习(一)---IoC介绍

一 IOC概述 Ioc(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.所谓控制反转,是指将对象,类的控制权反转到第三方手中,即后来提出的"依赖注入". 1.IoC的类型 构造函数注入:通过类的构造函数,将接口实现类通过构造函数变量传入 属性注入:可以有选择的通过Setter方法完成调用类所需依赖的注入,更加灵活方便 接口注入(不常用) :将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入

Spring学习笔记二(Bean注入的几种方式)

1.前言 上一篇博客从宏观上讲解了一下Spring的知识,下面这篇来着重讲解一下有关Bean注入的几种方式. 2.Bean注入的几种方式 2.1 类构造器初始化 这也是默认的方式,在上一篇博客中也有所体现.直接在applicationContext.xml配置文件中,配置Bean标签即可 <span style="font-family:SimSun;font-size:18px;"><!-- 实例工厂初始化 --> <!-- 必须先创建实例工厂对应的Be

Spring学习(五)bean装配详解之 【XML方式配置】

本文借鉴:Spring学习(特此感谢!) 一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原则 最优先:通过隐式 Bean 的发现机制和自动装配的原则. 基于约定优于配置的原则,这种方式应该是最优先的 好处:减少程序开发者的决定权,简单又不失灵活. 其次:Java 接口和类中配置实现配置 在没有办法使用自动装配原则的情况下应该优先考虑此类方法 好处:避免 XML 配置的泛滥,也更为容易.

Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】

通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XML 的功能,也提供了自动装配的功能,采用了自动装配后,程序猿所需要做的决断就少了,更加有利于对程序的开发,这就是“约定优于配置”的开发原则 IOC发现Bean的两种方式 组件扫描:通过定义资源的方式,让 Spring IoC 容器扫描对应的包,从而把 bean 装配进来. 自动装配:通过注解定义,使得一些依赖关系可以通过注解完成. 2.使用

2019.12.02——Spring学习(ioc)

Spring概念 1. Spring是开源的轻量级框架: 2. Spring核心:IOC(控制反转).AOP(面向切面编程): 3. Spring是一站式框架:Spring在javaee三层结构中,每层都提供不同的解决技术: - web层:springMVC - service层:IOC - dao层:JDBCTemplate Spring的IOC操作 1. 对象创建交给Spring进行管理: 2. IOC操作的两种方式:配置文件.注解. IOC底层原理 原文链接:Spring IOC的原理及详