第二篇写完了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>