Spring框架学习笔记(三)Xml高级配置

   第二篇写完了xml的基本配置方法,那么这一篇就开始写一下Xml的高级配置(没有啥,可能只是我这么说。。。)闲话少说,现在开始

1. bean 之间的关系:继承 or 依赖

   如果配置两个bean,但是发现里面很多属性是一样的,比如Car类,车标一样,产地一样,价格不一样...这时候就可以想到一个关系就是 继承,子类继承父类,子类中就有父类中的各个属性,然后重写不一样的属性,就完成了一个新的bean的配置。

<bean id="adress" class="Person.Adress" p:city="BeiJing" p:street="WuDaokou"></bean>

<bean id="car" class="Person.Car" p:brand="Baoma" p:price="200000"></bean>

<bean id="adress2" parent="adress" p:street="TianAnmen"></bean>

<bean id="person" class="Person.Person" p:name="Tom" p:adress-ref="adress" p:car-ref="car"> </bean>

</beans>

代码中不是以车为例,而是 重新写的一个地址类,当然也是一样的   在bean中加一个  parent 属性,然后重写不一样的方法。

依赖关系

通过depents-on 来关联

<bean id="user6" parent="user" p:userName="维多利亚"></bean>
<!-- 依赖关系 depents-on -->	
<bean id="user5" parent="user" p:userName="Backham" depends-on="user6"></bean>

2.bean 的作用域

  默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域。

通过bean中的scope 可以修改作用域。

 

3.属性文件的配置 (重要, 修改代码简单)

创建一个dp.properties  属性文件,在其中加入配置中常用的属性

jdbc.user=root
jdbc.password=123456
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///test
jdbc.initPoolSize=5
jdbc.maxPoolSize=10

然后在bean中导入外部的资源文件 

<context:property-placeholder location="classpath:db.properties"/>
	

 配置bean(用 ${ 属性名 } 来代替需要的值

<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
		<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>

4.SpEL语句

 Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。

SpEL 为 bean 的属性进行动态赋值提供了便利 通过 SpEL 可以实现:

通过 bean 的 id 对 bean 进行引用

调用方法以及引用对象中的属性

计算表达式的值 正则表达式的匹配

一般情况:

整数:<property name="count" value="#{5}"/>
小数:<property name="frequency" value="#{89.7}"/>
科学计数法:<property name="capacity" value="#{1e4}"/>
String可以使用单引号或者双引号作为字符串的定界符号:<property name=“name” value="#{'Chuck'}"/> 或 <property name='name' value='#{"Chuck"}'/>
Boolean:<property name="enabled" value="#{false}"/>

SpEL支持的运算符号 

 

加号还可以用作字符串连接:

 

 比较运算符: <, >, ==, <=, >=, lt, gt, eq, le, ge

 

if-else 运算符:?: (ternary), ?: (Elvis) 

 

逻辑运算符号: and, or, not, |

 

 正则表达式:matches

 

5. 自动配置

没有很高大上,其实简单的一批。。

自动装配:  只声明 bean, 而把 bean 之间的关系交给 IOC 容器来完成 
        byType: 根据类型进行自动装配. 但要求 IOC 容器中只有一个类型对应的 bean, 若有多个则无法完成自动装配
        byName: 若属性名和某一个 bean 的 id 名一致, 即可完成自动装配. 若没有 id 一致的, 则无法完成自动装配

在使用 XML 配置时, 自动转配用的不多. 但在基于 注解 的配置时, 自动装配使用的较多

先写三个类 

package com.atguigu.spring.annotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserAction {
	
	@Autowired
	private UsreService usreService;
	
	public void execute(){
		System.out.println("接受请求");
		usreService.addNew();
	}
	
}
package com.atguigu.spring.annotation;

import org.springframework.stereotype.Service;

@Service
public class UserDao {
	
	public void save(){
		System.out.println("保存新用户");
	}
	
}
package com.atguigu.spring.annotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UsreService {
	
	@Autowired
	private UserDao userDao;
	
	public void addNew(){
		System.out.println("添加新用户");
		userDao.save();
	}
	
}

配置文件

<bean id="dao" class="com.atguigu.spring.ref.Dao">
	<property name="dataSource" value="C3P0"></property>				
	</bean>
<bean id="dao2" class="com.atguigu.spring.ref.Dao" scope="prototype"></bean>
	
<bean id="service" class="com.atguigu.spring.ref.Service" autowire="byName"></bean>
	
<bean id="action" class="com.atguigu.spring.ref.Action" autowire="byType"></bean>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值