p
命名空间
为了简化
XML
文件的配置,越来越多的
XML
文件采用属性而非子元素配置信息。
Spring
从
2.5
版本开始引入了一个新的
p
命名空间,可以通过
<bean>
元素属性的方式配置
Bean
的属性。
使用
p
命名空间后,基于
XML
的配置方式将进一步简化
xmlns:p
="http://www.springframework.org/schema/p"
<bean id="fruit" class="com.zzxtit.springboot.ioc.di.fruit" p:userName="root" p:dbName="mysql">
</bean>
引用外部属性文件
Spring
提供了一个
PropertyPlaceholderConfigurer
的
BeanFactory
后置处理器
,
这个处理器允许用户将
Bean
配置的部分内容外移到属性文件中
.
可以在
Bean
配置文件里使用形式为
${
var
}
的变量
,
PropertyPlaceholderConfigurer
从属性文件里加载属性
,
并使用这些属性来替换变量
.
需要先引入配置文件
xmlns:context="http://www.springframework.org/schema/context"
<context:property-placeholder location="config/db.properties"/>
<bean id="dbConnection" class="com.zzxtit.springboot.ioc.di.DBConnecton" p:dbUrl="${mysql-url}">
<property name="driver" value="${mysql-driver}"></property>
</bean>
比如加载数据库地址,数据库连接类等,都可以用此方法,优点:可以不在项目文件中做修改就可以更改配置文件
Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。
•
语法类似于
EL
:
SpEL
使用
#{…}
作为定界符,所有在大框号中的字符都将被认为是
SpEL
•
SpEL
为
bean
的属性进行动态赋值提供了便利
•
SpEL
作用:
①
通过
bean
的
id
对
bean
进行引用
②
调用方法以及引用对象中的属性
③
计算表达式的值
④
正则表达式的匹配
<bean id="dbUtil" class="com.zzxtit.springboot.ioc.spel.DBUtil">
<property name="encoding" value="#{constance.ENCODING_UTF8}"></property>
<property name="number" value="#{constance.getNumber()}"></property>
</bean>
•
引用其他对象或属性。
•
调用其他对象的方法,还可以进行链式操作。
<bean id="constance" class="com.zzxtit.springboot.ioc.spel.Constance"> </bean>
<bean id="dbUtil" class="com.zzxtit.springboot.ioc.spel.DBUtil">
<property name="encoding" value="#{constance.ENCODING_UTF8}"></property>
<property name="number" value="#{constance.getNumber()}"></property>
</bean>
依赖注入—自动装配
•语法:<bean id="..." class="..." autowire="byType"/>
•autowire属性取值如下:
byType:
按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的
bean
。如果发现多个,那么将会抛出异常。如果没有找到,即属性值为
null
。
byName:
按名称装配,可以根据属性的名称,在容器中寻找跟该属性名相同的
bean
,如果没有找到,即属性值为
null
。
constructor
与
byType
的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的
bean
,那么将会抛出异常。
<bean id="FRUIT" class="com.zzxtit.spring.ioc.di.FRUIT" autowire="byType">
</bean>
缺点自动装配会装配Bean的所有属性,不够灵活
autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能同时进行
在classpath自动扫描Bean组件
在XML文件中注册需要装配的路径
<context:component-scan base-package="com.zzxtit.springboot.ioc.auto"></context:component-scan>
•
特定组件包括
:
§
@Component:
基本注解
,
标识了一个受
Spring
管理的组件
§
@
Repository
:
标识持久层组件
§
@Service:
标识服务层
(
业务层
)
组件
§
@Controller:
标识表现层组件
如果一个接口有两个以上的实现类,则需要指定某个具体的类。或者在接口对象上加上
注解@Qualifier("")来指定具体的实现类,否则会出现异常
@Autowired
@Qualifier("userOracleDao")
private UserDao userDao;
第二种办法是在方法上加注解,可以取得同样的效果
@Autowired
@Qualifier("userOracleDao")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}