【Spring进阶系列丨第四篇】学习Spring中的Bean管理(基于xml配置)

这篇具有很好参考价值的文章主要介绍了【Spring进阶系列丨第四篇】学习Spring中的Bean管理(基于xml配置)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在之前的学习中我们知道,容器是一个空间的概念,一般理解为可盛放物体的地方。在Spring容器通常理解为BeanFactory或者ApplicationContext。我们知道spring的IOC容器能够帮我们创建对象,对象交给spring管理之后我们就不用手动去new对象。

那么Spring是如何管理Bean的呢?

【Spring进阶系列丨第四篇】学习Spring中的Bean管理(基于xml配置),Spring进阶系列,spring,java,后端,spring boot,学习

一、概念

简而言之,Spring bean是Spring框架在运行时管理的对象。Spring bean是任何Spring应用程序的基本构建块。你编写的大多数应用程序逻辑代码都将放在Spring bean中。

Spring bean的管理包括:

  • 创建一个对象
  • 提供依赖项(例如其他bean,配置属性)
  • 拦截对象方法调用以提供额外的框架功能
  • 销毁一个对象

Spring bean是框架的基本概念。作为Spring的用户,你应该对这个核心抽象有深刻的理解。


二、创建Bean对象的三种方式

2.1、使用默认构造函数创建方式

2.1.1、定义Bean

public class UserServiceImpl {
    
}

2.1.2、主配置文件中配置bean

<!-- 方式一:使用默认构造函数方式创建Bean   -->
<beans>
	<bean id="userService" class="cn.bdqn.UserServiceImpl"></bean>
</beans>

2.1.3、测试Bean

@Test
public void testUserService() throws Exception{
        // 1、读取主配置文件信息,获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        // 2、从容器中根据id获取对象(bean)
        UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");

        // 3、打印bean
        System.out.println(userService);
}

2.1.4、注意点

此种方式采用的就是通过默认构造函数的方式创建Bean,假设我们给UserServiceImpl添加了一个带参的构造方法,则运行会报错,原因在于当我们为某个类自定义构造方法的时候,Java编译器便不会为该类提供默认的不带参数的构造方法了。

2.2、使用工厂中的实例方法创建方式

2.2.1、定义工厂

// UserService的工厂,作用是创建UserServiceBean对象
public class UserServiceImplFactory {

    public UserServiceImpl createUserService(){
        return new UserServiceImpl();
    }
}

2.2.2、定义Bean

public class UserServiceImpl {
    
}

2.2.3、主配置文件中配置Bean

<beans>
  	<!-- 方式二:使用工厂中提供的实例方法创建Bean   -->
  
	<!-- 第一步:把该工厂定义出来   -->
    <bean id="userServiceFactory" class="cn.bdqn.UserServiceImplFactory"/>
    <!-- 第二步:定义Bean(通过userServiceFactory中提供的实例方法)-->
    <bean id="userService" factory-bean="userServiceFactory" 
 						   factory-method="createUserService"/>
</beans>

2.2.4、测试

@Test
public void testUserService() throws Exception{
        // 1、读取主配置文件信息,获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        // 2、从容器中根据id获取对象(bean)
        UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");

        // 3、打印bean
        System.out.println(userService);
}

2.3、使用工厂中的静态方法创建方式

2.3.1、定义工厂

// UserService的工厂,作用是创建UserServiceBean对象
public class UserServiceImplFactory {

    public static UserServiceImpl createUserService(){
        return new UserServiceImpl();
    }
}

2.3.2、定义Bean

public class UserServiceImpl {

}

2.3.3、主配置文件中配置Bean

<beans>
    <!-- 方式三:使用工厂中提供的静态方法创建Bean   -->

    <!-- 定义Bean(通过工厂类的静态方法创建)   -->
    <bean id="userService" class="cn.bdqn.UserServiceImplFactory" 
          				   factory-method="createUserService">
    </bean>
</beans>

2.3.4、测试

@Test
public void testUserService() throws Exception{
        // 1、读取主配置文件信息,获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        // 2、从容器中根据id获取对象(bean)
        UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");

        // 3、打印bean
        System.out.println(userService);
}

三、Bean对象的作用域

3.1、说明

​ Spring对Bean的默认的作用域(作用范围)是singleton【单例】

3.2、作用域类型

  • singleton:单例的(默认值),只会new一次。

  • prototype:多例的,用到一次就会new一次。

  • request:作用于web应用的请求范围,Spring创建这个类之后,将这个类存到request范围内。

  • session:应用于web项目的会话范围,Spring创建这个类之后,将这个类存到session范围内。

  • global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session。

3.3、注意细节

实际开发中用得最多的就是singletonprototype在整合struts2的时候使用prototype,在整合SpringMVC的时候使用singleton。

3.4、如何修改Bean的作用域

bean标签的scope属性,作用:指定bean的作用范围。

3.5、测试

3.5.1、测试singleton单例

public class UserServiceImpl {
    
}
<beans>
	<bean id="userService" class="cn.bdqn.UserServiceImpl" />
</beans>
@Test
public void testUserService() throws Exception{
        // 1、读取主配置文件信息,获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        // 2、从容器中根据id获取对象(bean)
        UserServiceImpl userService1 = (UserServiceImpl) ac.getBean("userService");
        UserServiceImpl userService2 = (UserServiceImpl) ac.getBean("userService");

        // 3、打印bean
        System.out.println(userService1 == userService2); // true
}

3.5.2、测试prototype多例

public class UserServiceImpl {
    
}
<bean id="userService" class="cn.bdqn.UserServiceImpl" scope="prototype"/>
 @Test
public void testUserService() throws Exception{
        // 1、读取主配置文件信息,获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        // 2、从容器中根据id获取对象(bean)
        UserServiceImpl userService1 = (UserServiceImpl) ac.getBean("userService");
        UserServiceImpl userService2 = (UserServiceImpl) ac.getBean("userService");

        // 3、打印bean
        System.out.println(userService1 == userService2); // false
}

四、Bean对象的生命周期

4.1、单例对象

4.1.1、说明

出生:当容器创建时对象出生
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象消亡

4.1.2、测试

4.1.2.1、定义Bean
public class UserServiceImpl {
    
    public UserServiceImpl(){
        System.out.println("对象的构造方法执行了");
    }

    public void init(){
        System.out.println("对象初始化了");
    }
    
    public void destroy(){
        System.out.println("对象销毁了");        
    }
}
4.1.2.2、主配置文件中配置Bean
<beans>
	<bean id="userService" class="cn.bdqn.UserServiceImpl"
          scope="singleton" init-method="init" destroy-method="destroy"/>
</beans>
4.1.2.3、测试
@Test
public void testUserService() throws Exception{
    // 1、读取主配置文件信息,获取核心容器对象
    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

    ac.close();
}
// 结果:对于单例对象来说,只要容器创建了,那么对象就创建了。类似于立即加载。
4.1.2.4、测试结果

对象的构造方法执行了
对象初始化了
对象销毁了

总结:单例对象的生命周期和容器相同

4.2、多例对象

4.2.1、说明

出生:当我们使用对象时spring框架为我们创建
活着:对象只要是在使用过程中就一直活着。
死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收

4.2.2、测试

4.2.2.1、定义Bean
public class UserServiceImpl {
    
    public UserServiceImpl(){
        System.out.println("对象的构造方法执行了");
    }

    public void init(){
        System.out.println("对象初始化了");
    }
    
    public void destroy(){
        System.out.println("对象销毁了");        
    }
}
4.2.2.2、主配置文件中配置Bean
<beans>
	<bean id="userService" class="cn.bdqn.UserServiceImpl"
          scope="prototype" init-method="init" destroy-method="destroy"/>
</beans>
4.2.2.3、测试1
@Test
public void testUserService() throws Exception{
   	// 1、读取主配置文件信息,获取核心容器对象
    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

    ac.close();
}
// 结果:什么都不输出,说明容器启动的时候,对于多例对象来说并不会创建
4.2.2.4、测试2
@Test
public void testUserService() throws Exception{
   	// 1、读取主配置文件信息,获取核心容器对象
    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

    UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService");
    System.out.println(userService);
        
    ac.close();
}
/**
	结果:
		对象的构造方法执行了
		对象初始化了
	说明:
		对于多例对象来说,只有等到真正使用到该对象的时候才会创建。类似于懒加载。
**/

对于多例的Bean,Spring框架是不负责管理的


五、总结

【Spring进阶系列丨第四篇】学习Spring中的Bean管理(基于xml配置),Spring进阶系列,spring,java,后端,spring boot,学习
【Spring进阶系列丨第四篇】学习Spring中的Bean管理(基于xml配置),Spring进阶系列,spring,java,后端,spring boot,学习


以上就是本篇文章的全部内容了,如果对你有帮助的话,可以点个免费的关注,如果能在下方三连一下就更好啦,你的支持就是我更新的动力!

【Spring进阶系列丨第四篇】学习Spring中的Bean管理(基于xml配置),Spring进阶系列,spring,java,后端,spring boot,学习文章来源地址https://www.toymoban.com/news/detail-752345.html

到了这里,关于【Spring进阶系列丨第四篇】学习Spring中的Bean管理(基于xml配置)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Spring进阶系列丨第七篇】Spring框架新注解分类及详解

    【Spring进阶系列丨第七篇】Spring框架新注解分类及详解

    1.1.1、定义一个类 1.1.2、使用Configuration注解修饰类 1.1.3、作用 ​ 使用Configuration注解修饰的类表示的是:当前类是一个配置类。该类的作用和beans.xml是一样的,换句话说,该 注解所修饰的类就是用来代替beans.xml文件的。 1.2.1、定义bean 1.2.2、在主配置类中注册bean ​ 在以前,

    2024年04月10日
    浏览(15)
  • 【Spring进阶系列丨第八篇】Spring整合junit & 面向切面编程(AOP)详解

    【Spring进阶系列丨第八篇】Spring整合junit & 面向切面编程(AOP)详解

    ​ @ContextConfiguration注解需要注意的细节是: classes:指定的是主配置类的字节码 locations:指定xml文件的位置 ​ 首先来看一个问题,假如我现在有一个UserServiceImpl用户业务类,其中呢,有一个保存用户的方法,即: ​ 现在的需求是:我要在保存用户之前新增事务的功能,你

    2024年04月13日
    浏览(13)
  • 【Spring进阶系列丨第三篇】Spring核心技术之 IoC 与 DI 实战案例

    【Spring进阶系列丨第三篇】Spring核心技术之 IoC 与 DI 实战案例

    在上一篇文章中,我们学习了IoC与DI的相关概念与原理,现在让我们 以HelloWorld为例,编写一个程序,让创建对象的工作由Spring帮助我们创建。 一同感受一下Spring框架带给我们开发的便捷性。 这种做法是以前最常用的做法,HelloWorld这个类的对象是我们程序员自己去创建并为属

    2024年02月05日
    浏览(13)
  • 【Spring进阶系列丨第十篇】基于注解的面向切面编程(AOP)详解

    【Spring进阶系列丨第十篇】基于注解的面向切面编程(AOP)详解

    ​ 注意,该类的两个细节: a、@Component注解向容器中注册一个Bean。 b、@Aspect注解表示这个是一个切面类。 c、@Before注解表示的是这个是前置增强/前置通知。 ​ 注意:对于业务Bean,我们也需要通过@Service注解来向容器中注册。 ​ 问题:我们看到对于切面类中定义的通知,有

    2024年04月23日
    浏览(17)
  • 【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解

    【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解

    1.1.1、beans.xml中添加aop的约束 1.1.2、定义Bean ​ 问题:我们上面的案例经过测试发现确实在调用业务方法之前增加了日志功能,但是问题是仅仅能针对某一个业务方法进行增强,而我们的业务方法又有可能有很多,所以显然一个一个的去配置很麻烦,如何更加灵活的去配置呢

    2024年04月18日
    浏览(14)
  • 【从零开始学习JAVA | 第四十四篇】TCP协议中的握手与挥手

    【从零开始学习JAVA | 第四十四篇】TCP协议中的握手与挥手

    TCP(传输控制协议)作为计算机网络中的重要协议,扮演着确保数据可靠传输的角色。在TCP的通信过程中,握手与挥手问题是不可忽视的关键环节。握手是指在建立连接时,客户端与服务器相互确认彼此的身份并同步参数,确保双方准备就绪;而挥手则是在终止连接时,双方

    2024年02月11日
    浏览(44)
  • Vue系列第四篇:Vue2 + Element开发登录页面

    Vue系列第四篇:Vue2 + Element开发登录页面

           Vue开发中Element是一个比较受欢迎的界面库,实际开发中Vue2搭配Element UI开发,Vue3搭配Element plus开发,今天就用Vue2 + Element来开发登录页面。 目录 1.Element UI介绍 1.1官网 1.2element-ui安装 2.开发环境准备 2.1core-js安装 2.2浏览器自动打开和关闭useEslint校验配置 2.3Element UI全局

    2024年02月16日
    浏览(14)
  • 干翻Dubbo系列第四篇:Dubbo3第一个应用程序细节补充

    干翻Dubbo系列第四篇:Dubbo3第一个应用程序细节补充

    1:协议端口 补充说明1: 显示指定Dubbo服务启动的端口号:一个服务器上起多个Provider都这样显示的指定port端口号的话,会造成端口号冲突。 解决方式:我们可以port设置为-1,服务启动时默认采用20880(dubbo协议默认端口),此端口被占用默认会+1,一直到加端口不占用为止。

    2024年02月15日
    浏览(13)
  • DP学习第四篇之不同路径II

    DP学习第四篇之不同路径II

    63. 不同路径 II - 力扣(LeetCode) 状态表示     tips: 经验+题目要求。 以[i,j]位置为结尾,。。。 dp[i][j] : 走到[i, j]位置时,一共多少种路径 状态转移方程     tips: 用之前或之后的状态,推导出dp[i]的值。 根据最近的一步,来划分问题 到达[i, j]位置之前: [i, j]位置是障碍

    2024年02月15日
    浏览(5)
  • 第四篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas生物信息学领域应用

    第四篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas生物信息学领域应用

    生物信息学是一门将计算机科学和生物学相结合的跨学科领域,旨在利用计算机技术和统计学方法来处理、分析和解释生物学数据。在生物信息学研究中,研究人员处理的数据种类繁多,包括基因组数据、蛋白质数据、生物医学图像数据等。 Pandas 是一个基于 Python 编程语言的

    2024年03月09日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包