3.spring:自动装配/Bean之间的关系/作用域/外部文件/spel/
1.自动装配/手动装配
xml配置文件里的bean自动装配
Spring IOC 容器里可以自动的装配Bean,需要做的仅仅是在<bean>的autowire属性里面指定自动装配模式
->byType(根据类型自动进行装配):若IOC容器里需要有多个与目标Bean类型一样的Bean,在这种情况子下,Spring无法判定那个Bean合适,所以不能执行自动装配
->byName(根据名称自动装配):必须将目标Bean的名称和属性名设置完全相同,
->constuuctor(通过是构造器自动装配):当bean中存在多个构造器时,这个方法将会复杂,不建议使用
一般情况下很少进行使用这个属性
Car.java
public class Car {
private String brand;
private int price;
//...
}
Person .java
public class Person {
private String name;
private Address address;
private Car car;
//...
}
Address .java
public class Address {
private String city;
private String street;
//...
}
applicationContext.xml
<!-- 自动装配 -->
<bean id="address" class="com.MrChengs3.autowire.Address" p:city="BeiJing" p:street="sanqing_Street"></bean>
<bean id="car" class="com.MrChengs3.autowire.Car" p:brand="BMW" p:price=""></bean>
<!-- 根据名字进行装配和setter方式类似
byName根据bean的setter风格进行装配,将address改为address1则不能自动进行,没有匹配的则不装配
byType:假设我们配了两个address的变量,此时不唯一,不知道装配那个
-->
<bean id="person" class="com.MrChengs3.autowire.Person" p:name="MrChengs"
autowire="byType"></bean> <!-- 手动装配 -->
<bean id="person" class="com.MrChengs3.autowire.Person" p:name="MrChengs"
p:car-ref="car" p:address-ref="address"></bean>
测试:
Person p = (Person) ctx.getBean("person");
System.out.println(p);
Person [name=MrChengs, address=Address [city=BeiJing, street=sanqing_Street],
car=Car [brand=BMW, price=]]
2.Bean之间的关系
继承:
Spring允许继承bean之间的配置,被继承的bean称为父类bean,继承这个父bean的bean称为字bean
子bean从父类中继承配置,包括父类的属性配置
子bean也可以覆盖从父类继承过来的配置
父类可以作为模板,也可以作为bean实例,若相把父类的作为模板,可以设置父类bean的abstract属性为true,这样spring将不会实例化这个Bean
并不是bean元素里的属性都会被继承,比如autowire,abstract等
也可以忽略父bean的class属性,让子类指定子的类,面向共享的配置,但是此时abstract必须设为true
1、父bean是一个实例时。它本身是一个完整的bean
2、父bean是模板,抽象bean,不能被实例化,只是来被继承。
父bean一定不能实例化,因为它没有class属性,实例化会跑异常。那就一定要写abstract属性,让spring不实例化它。
当遇到一个类要实例化出很多相似的bean对象时,看起来是不是很不简洁。
applicationContext.xml
<bean id="address" p:city="ShangHai" p:street="LaoRenJie" abstract="true"></bean>
<!-- 配置的继承,使用bean -->
<bean id="address1" class="com.MrChengs3.autowire.Address" parent="address"></bean>
Address address1 = (Address) ctx.getBean("address1");
依赖:
Spring允许用户通过depend-on属性设置bean前置依赖关系,前置以来的bean会在本bean实例化之前创建好
如果依赖多个bean,则可以使用逗号,空格或的方式配置bean的名称
我们需要让某个属性必须存在,就像必填项一样。 用depends-on 依赖
这样,依赖存在了,就可以正常实例化了
<bean id="car" class="com.MrChengs3.autowire.Car" p:brand="BMW" p:price="" ></bean>
<!-- 配置Person,并且必须有一个关联的car,就是说person这个bean依赖于car -->
<bean id="person" class="com.MrChengs3.autowire.Person" p:name="MrChengs"
p:address-ref="address1" depends-on="car"></bean>
3.bean的作用域
作用域:
singleton:单例,整个应用中只创建一个实例(默认)
prototype:原型,每次注入时都新建一个实例
session:会话,每个会话创建一个实例,在一个session会话中,是同一个bean,不同session就是不同bean
request:请求,每个请求创建一个实例,每一个HTTP请求生成一个新的bean
applicationContext.xml
<!-- bean的作用域 -->
<!--
scope:bean的作用域
singleton(默认值):在容器初始化的时候创建bean的实例,整个容器的生命周期里面仅仅只创建一个bean,单列的
prototype:原型的,容器创建初始化时,不创建bean的实例,而每次请求时都会创建一个新的bean实例,并返回
-->
<bean id="car" class="com.MrChengs3.autowire.Car" p:brand="Ford"
p:price="" scope="singleton"></bean>
测试:
Car car = (Car) ctx.getBean("car");
Car car2 = (Car) ctx.getBean("car");
System.out.println(car ==car2);
true
scope="prototype"则为false
4.使用外部文件
propertie.properties
user=root
password=
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc\:mysql\://localhost\:3307/shijian
applicationContext.xml
<!-- 使用外部的属性文件 -->
<!-- 需要导入context命名空间 -->
<context:property-placeholder location="classpath:propertie.properties"/> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 使用外部话属性文件 -->
<property name="username" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="driverClassName" value="${driverClass}"></property>
<property name="url" value="${jdbcUrl}"></property> </bean>
DataSource dataSource = (DataSource) ctx.getBean("dataSource",DataSource.class);
System.out.println("执行中");
System.out.println(dataSource.getConnection());
System.out.println("结束");
${},代表引用外部的变量
通过把配置信息独立到一个文件里面,bean用${}方式引用, 便于维护、更清晰
如果响应修改只需要修改配置文件即可!
5.SpEl
SpEL---Spring Expression Language:
是一个支持运行时查询和操作对象图表达式语言、使用#{...}作为定界符,为bean属性动态赋值提供了便利。
1) 为属性赋值字面值
<bean id="address" class="com.MrChengs7.spel.Address">
<!-- 为属性赋值字面值 -->
<property name="city" value="#{'beijing'}"></property>
<property name="street" value="Shangye"></property>
</bean>
Address address= (Address) ctx.getBean("address");
System.out.println(address);
Address [city=beijing, street=Shangye]
2)引用 类的静态属性,用T()调用一个类的静态方法,它将返回一个Class Object,然后再调用相应的方法或属性
<bean id="car" class="com.MrChengs7.spel.Car">
<property name="brand" value="Aodi"></property>
<property name="price" value=""></property>
<!-- 引用 类的静态属性 -->
<property name="circle" value="#{T(java.lang.Math).PI * 80}"></property>
</bean>
Car car = (Car) ctx.getBean("car");
System.out.println(car);
Car [brand=Aodi, price=12345.0, circle=251.32741228718345]
3)其他
<bean id="person" class="com.MrChengs7.spel.Person">
<!-- 引用其他的bean -->
<property name="car" value="#{car}"></property>
<!-- 其他bean的属性 -->
<property name="city" value="#{address.city}"></property>
<!-- 运算符的使用 -->
<property name="info" value="#{car.price > 1000 ? '有钱' : '没钱'}"></property>
<property name="name" value="MrChengs"></property>
</bean>
Person p = (Person) ctx.getBean("person");
System.out.println(p);
Person [name=MrChengs, car=Car [brand=Aodi, price=12345.0, circle=251.32741228718345], city=beijing, info=有钱]
等待还有很多其他的....
3.spring:自动装配/Bean之间的关系/作用域/外部文件/spel/的更多相关文章
- Spring_自动装配 & bean之间的关系 & bean的作用域
1.自动装配 beans-autowire.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...
- Spring 自动装配 Bean
Spring3系列8- Spring 自动装配 Bean 1. Auto-Wiring ‘no’ 2. Auto-Wiring ‘byName’ 3. Auto-Wiri ...
- Spring自动装配Bean详解
1. Auto-Wiring ‘no’ 2. Auto-Wiring ‘byName’ 3. Auto-Wiring ‘byType 4. Auto-Wirin ...
- Spring自动装配bean
Spring推荐面向接口编程,这样可以很好的解耦具体的实现类. CompactDisc.class 文件: public interface CompactDisc { void play(); } ...
- Spring自动装配Bean的五种方式
在Spring中,支持 5 自动装配模式. no – 缺省情况下,自动配置是通过“ref”属性手动设定,在项目中最常用byName – 根据属性名称自动装配.如果一个bean的名称和其他bean属性的 ...
- Spring初学之bean之间的关系和bean的作用域
一.bean之间的关系 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...
- spring 自动装配 bean 有哪些方式?
Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系.作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起. spring中bean装配有两种方式 ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring自动装配Bean
除了使用 XML 和 Annotation 的方式装配 Bean 以外,还有一种常用的装配方式——自动装配.自动装配就是指 Spring 容器可以自动装配(autowire)相互协作的 Bean 之间 ...
- Spring容器装配Bean的三种方式
欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...
随机推荐
- 使用C#委托来实现异步编程
最近在我参与的几个.Net项目中都有用到异步编程,作为一名.Net小白,很有必要好好地学习一下异步编程. 什么是异步编程 异步编程指的就是不用阻塞当前线程来等待任务的完成,而是将任务扔到线程池中去执行 ...
- Dell解决黑苹果网卡(BCM94352ZAE/DW1560)怎么都打不开WiFi
Dell解决黑苹果网卡(BCM94352ZAE/DW1560)怎么都打不开WiFi 2017年10月20日17:41:00 by SemiconductorKING 本来觉得驱动这个网卡不是个问题,以 ...
- Node.js学习笔记(二) --- CommonJs和Nodejs 中自定义模块
一. 什么是 CommonJs? JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器. 然而, JavaScript标准定义的 API 是为了构建基于浏览器的应用程序.并没有制定一 ...
- maven项目在eclipse中debug
作为新手,出现bug后,debug找出bug还是很重要的,能节约大量找bug的时间 1.选中项目,右键点击-->run as -->run configurations 2.在run co ...
- maven配置环境
今天初学maven,先学习一下如何在windows下面配置maven,当然你要先配置好jdk的环境. 第一步,上官网下载maven插件,网址是:点击打开链接 第二步,解压文件夹,放在某一个盘符下,我是 ...
- OpenCV中Mat属性step,size,step1,elemSize,elemSize1
Mat的step,size,step1,elemSize,elemSize1这几个属性非常容易混淆. OpenCV的官方参考手册也没有解释清楚这几个概念. 前一段时间研究了一下每个属性的含义,如果有什 ...
- hdu 2063 过山车(模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others) Me ...
- MySQL数据库备份与还原
备份数据库 1.使用mysqldump命令备份 备份一个数据库:mysqldump -u 用户名 -p密码 数据库名 [表名1,表名2...]>备份文件路径及名字.sql 如 ...
- HTML5时代的纯前端上传图片预览及严格图片格式验证函数(转载)
原文地址:http://www.2cto.com/kf/201401/274752.html 一.要解决什么样的问题? 在写这个函数之前,有们童鞋在群里问如何纯前端严格验证图片格式.这在html5时代 ...
- Python文件夹与文件的操作 ZZ
最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现.使用时需先导入这个模 ...