一、bean标签属性

id:
bean在spring容器的唯一标识,spring容器中不可能同时存在两个相同的id。

class:
类的全限定名(类名+包名),用“.”号连接

name:
设置别名,在BeanFactory的getBean(“name”)中可以获取相应的bean。

需要注意的是,bean属性的id和name,是bean的唯一标识,同一个spring的配置文件中,不同bean的id和name是不能相同的。否则会报错。不同的spring配置文件中,id和name可以重复。此时spring针对相同的id或name采取的策略是根据DefaultListableBeanFactory类中的allowBeanDefinitionOverriding属性值来判断的。默认为true,即相同的id或name会被覆盖。如果设置为false,则会抛出异常。
通过阅读spring初始化源码可以知道,spring是获取到spring的配置文件后,利用循环遍历读取配置信息的。所以不同的配置文件会循环多次,后面的覆盖前面的。
利用这个特性,我们可以通过spring配置文件的替换或覆盖,来做版本的更新。

abstract&&parent:
abstract:设置bean是否为抽象类,默认为false。如果为true,则该bean不会被实例化。那不被实例化,还定义它有啥用呢?这就要讲parent属性了。
parent: bean标签中的parent属性和java中的继承有些类似,但又不一样。parent属性可以指定一个类。那么bean和parent指定的类可以是继承关系,也可以不是继承关系。 只要指定了parent,那么parent类中的属性名,就可以自动继承到bean类中了。当然bean也可以对parent的属性进行覆盖。同时可以扩展其他的属性。
应用:
对于一些公共的东西,我们设置成abstract属性为true。然后具体应用这些公共属性的类,parent指定为这个abstract属性的bean,这样可以增加代码复用,减少重复代码。

autowire-candidate:
默认为true。如果设置为false,则该bean将不能通过依赖注入,传给需要这个对象类型的地方。也就是@Autowired等注解,无法依赖注入该对象。

应用:我们在开发中,更换service实现类时,又想保留原service的实现类,那就可以把该属性设置为false。那么依赖注入service时,spring就会把新的service实现类注入进去,旧的不会被注入。

autowire:
和@Autowired作用一样,只不过是在xml里的bean里配置的属性,都是用于依赖注入另一个bean作为属性。不推荐使用此属性,因为这么定义类的注入关系不能一目了然,不方便项目的维护。

depends-on:
它的作用是一个bean实例化的过程需要依赖于另一个bean的初始化,也就是说被依赖的bean将会在需要依赖的bean初始化之前加载。多个依赖bean之间用","号分割;

被依赖的类,不一定会被引用到bean的属性,只是先于这个bean初始化。当然销毁时,也是后于这个bean销毁。当遇到类必须有先后加载顺序场景时,可以应用此属性。

destroy-method:
它的作用是在销毁bean之前可以执行指定的方法。注意:必须满足scope=“singleton”,并且destroy方法参数个数不能超过1,并且参数类型只能为boolean。

init-method:
它的作用是在创建一个bean之后调用该方法,初始化方法必须是一个无参方法。

factory-bean&&factory-method:
如果一个bean,类似于工厂模式,生产不同的bean。那么,定义这个bean标签时,就要用factory-bean和factory-method属性了。
简单来说,就是一个工厂类,其内部有一个createInstance方法,来创建不同的对象。我们想定义这个工厂创建出来的不同对象,如何定义呢。这就用到factory-bean和factory-method方法了。factory-bean指定工厂类,factory-method指定工厂方法,无需再写class属性,就可以返回工厂方法返回的对象。
具体详细的用法,请查看属性详解

factory-method有两种用法:一种是与factory-bean属性配合使用,执行工厂方法。
一种是与class属性配合,走定义的class属性里的bean的静态方法(必须是静态方法)。

总之这两个属性是针对工厂类产生不同对象而使用的。

lazy-init:

lazy-init 设置只对scop属性为singleton的bean起作用,非单例不实例化(看源码,研究为啥非单例不实例化)

lazy-init=”false” 立即加载, 在spring启动时,立刻进行实例.

lazy-init=”true” 延迟加载 ,设置为true的bean将不会在ApplicationContext启动时提前被实例化,而是在第一次向容器通过getBean索取bean时实例化的。

如果一个设置了立即加载的bean1,引用了一个延迟加载的bean2,那么bean1在容器启动时被实例化,而bean2由于被bean1引用,所以也被实例化,这种情况也符合延迟加载的bean在第一次调用时才被实例化的规则。

primary:
autowire-candidate属性提到,当一个类型的对象有多个时,可以设置为true,不对这个bean进行依赖注入。
我们也可以不把这个bean屏蔽掉,而是设置primary,来定义首选依赖注入哪个类。当然primary熟悉只能设置相同类型的一个bean,否则会出问题。

scope:
默认为单例,即BeanFactory的getBean都返回同一个对象。可以设置为多例,每次getBean返回不同的对象。这也就是为何多例不实例化的原因了。

二、子元素

meta:
meta标签在bean的子标签定义。设置key值和value值。它是游离于对象外部的属性值,通过该bean的BeanDefinition对象的getAttribute(“key”)来获取value值。在一些特殊的场景下,可能会用到该需求。可以给一个bean做标签使用。带有某个标签的bean,要做何处理。

lookup-method:
该标签是bean定义的class属性为接口或者抽象类时,要对抽象方法进行动态实现,用到的标签。该标签的name属性写要实现的抽象方法,bean属性写抽象方法返回类型的实例,也就是动态定义抽象方法返回的实例。
例如:
步骤一:定义一个Car类

package org.hope.spring.bean.lookup;

public class Car {private String brand;private String corp;private double price;getter()&setter()....
}

步骤二:定义一个Boss接口

package org.hope.spring.bean.lookup;public interface Boss {Car haveCar();
}

步骤三:在spring的配置文件bean.xml中定义三个bean

<bean id="honeqi" class="org.hope.spring.bean.lookup.Car"p:brand="红旗"p:price="400000"scope="prototype" /><bean id="bmw" class="org.hope.spring.bean.lookup.Car"p:brand="奔驰GLC260"p:price="500000"scope="prototype" /><bean id="boss" class="org.hope.spring.bean.lookup.Boss"><lookup-method name="haveCar" bean="bmw"/>
</bean>

步骤四:写单元测试测试

package org.hope.spring.bean.lookup;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:bean.xml"})
public class LookUpTest {@Autowiredprivate Boss boss;@Testpublic void testBoss() {Car car = boss.haveCar();System.out.println(car.getBrand());}
}

奔驰GLC260

结论:

1、通过lookup-method元素标签可以为Boss的haveCar()提供动态实现,返回prototype类型的car Bean。

2、lookup方法注入是有一定使用范围的,一般在希望通过一个singleton Bean获取一个prototypeBean时使用

3、lookup方法注入需要用到CGLib类包

需要注意的就是指定的bean,必须是该抽象方法实现后的返回值,而不是一个空的bean对象。

replaced-method:
用于替换bean中的某个方法。也就是说,bean标签中定义的class中有一个方法,我们如果不想用这个方法,而想换一个方法的话,可以在bean下面定义replaced-method标签,该标签的name属性就是要被替换的方法,replacer属性就是替换这个方法的类。
需要注意的是,replacer里定义的类,必须实现MethodReplacer接口,然后在reimplement方法中定义替换方法。这样就可以替换原有类的方法了。

应用:如果我们想对框架或其他人的代码进行修改的话,可以使用此标签,做一些定制化修改,而无需修改其jar包中的代码,也就是说spring通过这个标签,为我们修改第三方jar包类提供了入口。(后续详细讲解如何修改jar包源码)

constructor-arg:
构造器参数(顺序注入),此种方式会按照顺序注入构造器的参数。

property:
自动注入jaabean的成员变量。

三、再看BeanDefinition

讲解完bean标签的属性和子标签,我们再看BeanDefinition中的方法:

可以看出,BeanDefinition就是把bean的属性和子标签,转换成了对象。

Spring之bean标签属性详解相关推荐

  1. html frameset 属性,html frameset标签怎么用?html frameset标签属性详解

    html frameset标签怎么用?html frameset标签属性详解,本篇文章主要讲述了html frameset标签的定义和用法,还有html frameset标签两个属性的用途(附实例) ...

  2. audio标签的controls属性_HTML5教程 audio标签属性详解

    本篇教程探讨了HTML5教程 audio标签属性详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < src:String型,所播放音频的 url. auto ...

  3. spring boot application.properties 属性详解

    2019年3月21日17:09:59 英文原版: https://docs.spring.io/spring-boot/docs/current/reference/html/common-appli ...

  4. Spring Boot : Bean标签属性

    1.美图 2.概述 属性 解释 ① id属性 Bean的名称在IOC容器中必须是唯一的. ② class属性 指定Bean对应实现类的全类名,即包名加类名,必须有无参构造. ③ scope属性: 前面 ...

  5. Android 总结:Manifest文件中,application和activity标签属性详解

    android:hasCode = ["true" | "false"] android:icon = "drawable resource" ...

  6. Spring中bean的scope详解

    如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" scope=& ...

  7. object标签属性详解

    最近在做视频直播这一块的,html5的video不能实现此功能,在网上查找了资料,觉得很有用. 一.介绍:我们要在网页中正常显示flash内容,那么页面中必须要有指定flash路径的标签.也就是OBJ ...

  8. Spring框架学习教程,详解Spring注入bean的几种方式

    首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Sprin ...

  9. Spring生命周期Bean初始化过程详解

    Spring生命周期Bean初始化过程详解 Spring 容器初始化 Spring Bean初始化 BeanFactory和FactoryBean 源码分析 Bean的实例化 preInstantia ...

  10. Spring中bean标签的属性和值:

    Spring中bean标签的属性和值: <bean name="user" class="com.pojo.User" init-method=" ...

最新文章

  1. linux下的jsp
  2. Oracle——Oracle 实现类似 select top n 语句
  3. leetcode--130. 被围绕的区域
  4. 快速从入门到精通!mysql删除语句姓李的语句
  5. tensorflow 安装_安装tensorflow-gpu 2.0
  6. python和java选择哪个-观点|Java 与 Python:你应该选择哪个?
  7. pr2020lut导入_PS PR AE怎么批量导入LUTS调色预设
  8. 使用React Native可以开发Window桌面应用了!
  9. 打开chm文件提示“已取消到该网页的导航”
  10. C++课程设计订单信息管理系统
  11. mysql error1205 博客_Mysql Error:1205错误诊断
  12. 设断点报错:Frames are not available
  13. 自动控制的故事——数字控制部分
  14. 光与影的地平线:手机AI摄影全析
  15. 前几天挂掉一个读者的滴滴二面矩阵题目
  16. GitHub加速访问插件
  17. nssm将 netCore项目注册成服务。
  18. 2021年全国大学生数据统计与分析竞赛赛题B—基于机器学习的用户消费行为预测(上)
  19. Halcon XLD 亚像素算子大全
  20. VC++ 已知弦高,弦长,求半径,夹角, 弧度

热门文章

  1. Stata数据处理: 面板数据填充和补漏
  2. php盘古分词,百度分词技术_百度输入法分词怎么关_百度分词原理
  3. Win10/11 移动C:\Users 目录
  4. WINDOWS10 自带校验工具
  5. SQL:with as用法
  6. 狗熊会python培训班
  7. Base64 编码整理
  8. boost入门(一):boost简介
  9. android 史上最简单behavior,安卓behavior详解1--系统behavior的简单应用
  10. xp 无法关闭计算机,xp系统不能关机解决方法