Spring从入门到精通(三)

本文将讲解两方面的内容:

1.IOC之BeanFactory与ApplicationContext区别
2.FactoryBean 和 BeanFactory有啥区别

IOC之BeanFactory与ApplicationContext区别

BeanFactory是Spring框架中IoC容器的顶层接⼝,它只是⽤来定义⼀些基础功能,定义⼀些基础规范,⽽ApplicationContext是它的⼀个⼦接⼝,所以ApplicationContext是具备BeanFactory提供的全部功能的。 通常,我们称BeanFactory为SpringIOC的基础容器, ApplicationContext是容器的⾼级接⼝,⽐BeanFactory要拥有更多的功能,⽐如说国际化⽀持和资源访问(xml, java配置类)等等 。

启动 IoC 容器的方式

  • Java环境下启动IoC容器
    • ClassPathXmlApplicationContext:从类的根路径下加载配置⽂件(推荐使⽤)
    • FileSystemXmlApplicationContext:从磁盘路径上加载配置⽂件
    • AnnotationConfigApplicationContext:纯注解模式下启动Spring容器
  • Web环境下启动IoC容器
    • 从xml启动容器
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--配置Spring ioc容器的配置⽂件--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--使⽤监听器启动Spring的IOC容器--> <listener> <listenerclass> org.springframework.web.context.ContextLoaderListener </listenerclass> </listener> </web-app> 
  • 从配置类启动容器
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--告诉ContextloaderListener知道我们使⽤注解的⽅式启动ioc容器--> <context-param> <param-name>contextClass</param-name> <param-value> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </param-value> </context-param> <!--配置启动类的全限定类名--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>com.zjq.spring.SpringConfig</param-value> </context-param> <!--使⽤监听器启动Spring的IOC容器--> <listener> <listenerclass> org.springframework.web.context.ContextLoaderListener </listenerclass> </listener> </web-app> 

FactoryBean 和 BeanFactory有啥区别

BeanFactory接⼝是容器的顶级接⼝,定义了容器的⼀些基础⾏为,负责⽣产和管理Bean的⼀个⼯⼚,具体使⽤它下⾯的⼦接⼝类型,⽐如ApplicationContext;此处我们重点分析FactoryBean。 Spring中Bean有两种,⼀种是普通Bean,⼀种是⼯⼚Bean(FactoryBean),FactoryBean可以⽣成某⼀个类型的Bean实例(返回给我们),也就是说我们可以借助于它⾃定义Bean的创建过程。 Bean创建的三种⽅式中的静态⽅法和实例化⽅法和FactoryBean作⽤类似,FactoryBean使⽤较多,尤其在Spring框架⼀些组件中会使⽤,还有其他框架和Spring框架整合时使⽤。

// 可以让我们⾃定义Bean的创建过程(完成复杂Bean的定义) public interface FactoryBean<T> { @Nullable // 返回FactoryBean创建的Bean实例,如果isSingleton返回true,则该实例会放到Spring容器的单例对象缓存池中Map T getObject() throws Exception; @Nullable // 返回FactoryBean创建的Bean类型 Class<?> getObjectType(); // 返回作⽤域是否单例 default boolean isSingleton() { return true;
    }
}

User类

public class User { private String name; private String addr; public String getName() { return name;
    } public void setName(String name) { this.name = name;
    } public String getAddr() { return addr;
    } public void setAddr(String addr) { this.addr = addr;
    } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", addr='" + addr + '\'' + '}';
    }
}

UserFactoryBean类

public class UserFactoryBean implements FactoryBean<Company> { private String userInfo; // 用户姓名,地址 public void setUserInfo(String userInfo) { this.userInfo = userInfo;
    } @Override public User getObject() throws Exception { // 模拟创建复杂对象User User user = new User();
        String[] strings = userInfo.split(",");
        user.setName(strings[0]);
        user.setAddr(strings[1]); return user;
    } @Override public Class<?> getObjectType() { return User.class;
    } @Override public boolean isSingleton() { return true;
    }
}

xml配置

<bean id="userBean" class="com.zjq.factory.UserFactoryBean"> <property name="userInfo" value="詹先生,hangzhou"/> </bean> 

测试,获取FactoryBean产⽣的对象

Object userBean = applicationContext.getBean("userBean");
System.out.println("bean:" + userBean); // 结果如下 bean:User{name='詹先生', addr='hangzhou'}

测试,获取FactoryBean,需要在id之前添加“&”

Object userBean = applicationContext.getBean("&userBean");
System.out.println("bean:" + userBean); // 结果如下 bean:com.zjq.factory.UserFactoryBean@65f6cd78
#Java##Spring##后端##编程#
全部评论
感谢楼主分享,不过我还是感觉懵懵懂懂的,应该没理解透彻
点赞 回复 分享
发布于 2022-07-29 09:56

相关推荐

10-21 23:48
蚌埠坦克学院
csgq:可能没hc了 昨天一面完秒挂
点赞 评论 收藏
分享
可可可可可_:nb啊,看样子是专科玩了几年随便专升本了个民办,又玩了两年。你这能找到我吃
点赞 评论 收藏
分享
评论
1
7
分享
牛客网
牛客企业服务