一、实例化Bean的三种方式
⽅式⼀:使用无参构造函数
在默认情况下,它会通过反射调⽤⽆参构造函数来创建对象。如果类中没有无参构造函数,将创建失败。

<bean id="userService" class="com.nanmao.service.impl.UserServiceImpl"/>

⽅式⼆:使⽤静态⽅法创建(静态工厂创建对象)
在实际开发中,我们使⽤的对象有些时候并不是直接通过构造函数就可以创建出来的,它可能在创建的过程中会做很多额外的操作。此时会提供⼀个创建对象的⽅法,恰好这个方法是static修饰的方法,即是此种情况。
例如,我们在做Jdbc操作时,会⽤到java.sql.Connection接⼝的实现类,如果是mysql数据库,那么⽤的就是JDBC4Connection,但是我们不会去写 JDBC4Connection connection = new JDBC4Connection() ,因为我们要注册驱动,还要提供URL和凭证信息,用DriverManager.getConnection ⽅法来获取连接。
那么在实际开发中,尤其早期的项⽬没有使⽤Spring框架来管理对象的创建,但是在设计时使用了⼯⼚模式解耦,那么当接⼊spring之后,⼯⼚类创建对象就具有和上述例⼦相同特征,即可采用此种⽅式配置。

public class UserServiceFactroy {public static UserService getUserService(){System.out.println("静态工厂创建service对象");return new UserServiceImpl();}
}
    <!--静态工厂创建bean--><bean id="userService1" class="com.nanmao.factory.UserServiceFactroy" factory-method="getUserService"/>

方式三:使⽤实例化方法创建(实例工厂创建对象)
此种方式和上⾯静态⽅法创建其实类似,区别是用于获取对象的方法不再是static修饰的了,而是类中的⼀个普通方法。此种方式比静态方法创建的使⽤几率要高⼀些。
在早期开发的项目中,⼯⼚类中的方法有可能是静态的,也有可能是非静态方法,当是非静态方法时,即可采用下面的配置方式:

public class UserServiceFactroy2 {public UserService getUserService(){System.out.println("实例工厂创建service对象");return new UserServiceImpl();}
}

由于是实例工厂,所以我们要想通过里面的方法获取对象,必须先创建工厂对象,所以,在xml中我们应该先配置工厂bean,然后通过factory-bean标签指向该bean。

    <!--实例工厂创建bean--><bean id="factoryBean" class="com.nanmao.factory.UserServiceFactroy2"/><bean id="userService2" factory-bean="factoryBean" factory-method="getUserService"/>

二、bean标签相关属性
(1)作用范围
除了下面提到的两种范围singleton和prototype,官方还提供了request、session、application、websocket几种,但是一般不用。

    <!--scope 属性,主要使用的就两个,一个是singleton,单例模式创建对象,也是默认的,第二个是prototype,非单例模式如果是单例模式的话,对象的创建是在加载spring容器的时候进行创建如果是非单例的话,对象的创建是在获取bean的时候,getBean()--><bean id="userService" scope="prototype" class="com.nanmao.service.impl.UserServiceImpl"/>

单例模式:singleton
对象出⽣:当创建容器时,对象就被创建了。
对象活着:只要容器在,对象⼀直活着。
对象死亡:当销毁容器时,对象就被销毁了。
⼀句话总结:单例模式的bean对象⽣命周期与容器相同
多例模式:prototype
对象出⽣:当使⽤对象时,创建新的对象实例。
对象活着:只要对象在使⽤中,就⼀直活着。
对象死亡:当对象⻓时间不⽤时,被java的垃圾回收器回收了。
⼀句话总结:多例模式的bean对象,spring框架只负责创建,不负责销毁
(2)Bean标签属性
在基于xml的IoC配置中,bean标签是最基础的标签。它表示了IoC容器中的⼀个对象。换句话说,如果⼀个对象想让spring管理,在XML的配置中都需要使⽤此标签配置,Bean标签的属性如下:
id属性: ⽤于给bean提供⼀个唯⼀标识。在⼀个标签内部,标识必须唯⼀。
class属性:⽤于指定创建Bean对象的全限定类名。
name属性:⽤于给bean提供⼀个或多个名称,可以理解成别名。多个名称⽤空格分隔。一般不用,我们通过id属性识别对应的bean就可以了。

<bean id="userService" name="userService1,userService2" class="com.nanmao.service.impl.UserServiceImpl"/>

factory-bean属性:⽤于指定创建当前bean对象的⼯⼚bean的唯⼀标识。当指定了此属性之后,class属性失效。
factory-method属性:⽤于指定创建当前bean对象的⼯⼚⽅法,如配合factory-bean属性使⽤,则class属性失效。如配合class属性使⽤,则⽅法必须是static的。
scope属性:⽤于指定bean对象的作⽤范围。通常情况下就是singleton。当要⽤到多例模式时,可以配置为prototype。
init-method属性:⽤于指定bean对象的初始化方法,此⽅法会在bean对象装配后调⽤。必须是⼀个⽆参⽅法。
destory-method属性:⽤于指定bean对象的销毁方法,此⽅法会在bean对象销毁前执⾏。它只能为scope是singleton时起作⽤。
比如,我们在创建UserServiceImpl对象时,需要对对象创建后及销毁前做一些处理,可以定义两个方法(命名自定义,这里用的是init和destroy,正好对应初始化方法和销毁方法),在bean标签中通过init-method和destory-method两个属性进行配置。

public class UserServiceImpl implements UserService {public UserServiceImpl() {System.out.println("constructor is running");}public void init() {System.out.println("init.....");}public void destroy() {System.out.println("destroy.....");}@Overridepublic void save() {System.out.println("userService impl running");}
}
    <bean id="userService"  init-method="init" destroy-method="destroy" class="com.nanmao.service.impl.UserServiceImpl"/>

在ClassPathXmlApplicationContext 类中有close方法,用于关闭容器。我们如果要看到控制台输出打印"destroy…",需要在线程执行完之前关闭容器,即调用close方法。
注意:scope属性只能是singleton,因为prototype类型是每当getBean的时候就会创建一个新对象,创建的对象不归spring容器管理。

public class UserApp {public static void main(String[] args) {//加载spring配置文件
//        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");ctx.close();}
}

控制台输出:

constructor is running
init.....
destroy.....

Spring框架基础(2)----Bean的创建及标签属性相关推荐

  1. 一.Spring框架基础

    JAVAEE框架之Spring 一.Spring框架基础 Spring:春天:轻量级的企业级开发框架,核心是IOC(控制反转)和AOP(面向切面编程). 官网:spring.io Spring–> ...

  2. Spring框架中的Bean

    1.什么是Bean? 在Spring框架中,Bean是指一个由Spring容器管理的对象.这个对象可以是任何一个Java类的实例,例如数据库连接.业务逻辑类.控制器等等.Bean实例的创建和管理是由S ...

  3. 2022年Java应届生面试之Spring框架基础知识

    前言:工作的原因,最近没有及时更新相关系列.很抱歉!在复习Spring框架的同时也别忘了j2ee的相关知识理论wo~ 大家好!我是JAVA 中的Spring框架,我是一个开源的容器性质的轻量级框架. ...

  4. Spring 框架基础(02):Bean的生命周期,作用域,装配总结

    本文源码:GitHub·点这里 || GitEE·点这里 一.装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为B ...

  5. Spring框架—基础介绍

    原文地址:https://www.cnblogs.com/lagou/p/10552815.html 目录 一.spring基本概念 二.spring框架 三.spring中机制和实现 三.sprin ...

  6. Spring 框架基础(04):AOP切面编程概念,几种实现方式演示

    本文源码:GitHub·点这里 || GitEE·点这里 一.AOP基础简介 1.切面编程简介 AOP全称:Aspect Oriented Programming,面向切面编程.通过预编译方式和运行期 ...

  7. Spring框架基础概念(面试概念解答)

    Spring框架概述 什么是Spring? 三层体系架构 Spring框架的优点 Spring的体系结构 Core Container(核心容器) Data Access/Integration(数据 ...

  8. Spring框架基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-spring-framework/ Spring框架简介 Spring , 一个开源的框架 , ...

  9. 第五章spring框架基础

    spring框架 一.spring 概念: 开发步骤: 第1步: 添加jar包 第2步: 创建Java类 第3步: 创建Spring配置文件 第4步: 编写Spring配置文件 二 .控制反转 概念: ...

最新文章

  1. Anaconda:虚拟环境
  2. 特朗普“模仿”奥巴马?进阶版换脸技术DeepFakes来了
  3. 块代码编程---开始使用块代码
  4. 从LSTM到GRU基于门控的循环神经网络总结
  5. 解决MathType与Word 2016兼容性问题。
  6. 验证apk签名方式(V1 || V2)
  7. python删除空白没有显示_删除Python字符串中的空白
  8. 算法9-5:最大流算法的Java代码
  9. T4模板:MVC中用T4模板快速生成代码
  10. Boost锁~临界区保护和临界资源共享
  11. 每天学一点flash(67) 上传图片
  12. 基于体素的全局光照技术
  13. java程序猿面试问缺点怎么回答_面试程序员被问“你的缺点是什么”,我该怎么回答?...
  14. 验证二叉树的前序序列化
  15. 盗版识别对软件资产管理至关重要
  16. 更改文字颜色为红色HTMl语言,怎样用css将文字改为红色?
  17. whistle抓包工具
  18. VC下自制一个MusicPlayer:调用activemovie控件
  19. iTron3学习笔记(一) System Calls of Memory Pool Management Functions
  20. 华为手机助手 无法访问服务器,EMUI4.X手机及windowsXP系统无法正常使用华为手机助手问题...

热门文章

  1. Ubuntu16.04分辨率过低,无法调高
  2. ACCESS模糊查询like的解决方法SQL查询语句通配符问题
  3. 监控系统选型,一文轻松解决
  4. React SSR: 基于 express 自构建 SSR 服务端渲染
  5. 水电水利建设项目水环境与水生生态保护技术政策
  6. 【玩转ElasticSearch】横向对比ElasticSearch与Sphinx
  7. 数据安全建设中合规管理措施
  8. 使用C语言求斐波那契(Fibonacci)数列的第n项
  9. 按键精灵移动端系列 - IOS(苹果版)安装1.3.8 deb 下载地址
  10. JS实现复制页面文字弹出消息提醒/在sweetalert(swal)弹出窗插件中加入html代码