Bean的管理 = 创建对象(XML、注解) + 注入属性(构造器、set方法)
一、基于XML方式创建对象
<!--配置User对象创建-->
<bean id="User" class="spring5.User"></bean>
使用
bean
标签可以实现对象的创建,其中
id
属性是唯一标识,
class
属性是类全路径。创建对象的时候,默认执行五参数构造方法。
二、基于XML方式注入属性
依赖注入(DI)
通过DI来实现注入属性,需要在创建对象的基础之上来完成。DI是IOC的一种具体实现。
- 使用含参
进行注入构造方法
创建
构造器方法
方法
public User(String name) {
this.name = name;
}
在spring配置文件中进行配置
<!--用含参构造方法注入属性-->
<bean id="User" class="spring5.User">
<constructor-arg name="name" value="张三"></constructor-arg>
</bean>
- 使用
方法进行注入set
创建
set
方法
public void setName(String name) {
this.name = name;
}
在spring配置文件配置对象创建,配置属性注入
<!--set方法注入属性-->
<bean id="User" class="spring5.User">
<!--使用property完成属性注入-->
<property name="name" value="张三"></property>
</bean>
-
名称空间注入p
可以简化基于xml配置方式,首先在配置文件中添加p名称空间
xmlns:p="http://www.springframework.org/schema/p"
然后属性注入
最后测试三种属性的注入
@Test
public void test1(){
//1.加载Spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("userBean.xml");
//2.获取配置创建的对象
User user = context.getBean("User", User.class);
System.out.println(user);
System.out.println(user.getName());
}
输出结果:
三、XML注入其他类型属性
注入字面量
<property name="name">
<!--将属性name设置为null值-->
<null></null>
</property>
<!--属性值中包含特殊符号
1.可以使用转义字符
2.可以把特殊符号内容写到CDATA
-->
<property name="name">
<value><![CDATA[<<张三>>]]]></value>
</property>
注入外部bean
<!--创建service和dao对象-->
<bean id="userService" class="spring5.service.UserService">
<!--service对象中注入dao对象属性
name: 类里面属性的名称
ref: 创建userDao对象bean标签的id值
-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="spring5.dao.UserDaoImpl"></bean>
注入内部bean
<!--内部bean-->
<bean id="emp" class="spring5.bean.Emp">
<property name="ename" value="aaa"></property>
<property name="gender" value="男"></property>
<property name="dept">
<bean id="dept" class="spring5.bean.Dept">
<property name="dname" value="bbb"></property>
</bean>
</property>
</bean>
注入属性级联赋值
<!--级联赋值-->
<bean id="emp" class="spring5.bean.Emp">
<property name="ename" value="aaa"></property>
<property name="gender" value="男"></property>
<!--通过ref属性实现级联赋值-->
<property name="dept" ref="dept"></property>
<!--也可以直接dept.name实现级联赋值,要是get方法-->
<property name="dept.dname" value="ddd"></property>
</bean>
<!--外部创建对象并赋值-->
<bean id="dept" class="spring5.bean.Dept">
<property name="dname" value="ccc"></property>
</bean>
四、XML注入集合属性
创建对象
<bean id="student" class="collectionType.Student">
</bean>
注入数组类型属性
<!--数组类型属性注入-->
<property name="courses">
<array>
<value>java</value>
<value>C++</value>
</array>
</property>
注入
List
集合类型属性
<!--list类型属性注入-->
<property name="list">
<list>
<value>张三</value>
<value>李四</value>
</list>
</property>
注入
Map
集合类型属性
<!--map类型属性注入-->
<property name="map">
<map>
<entry key="java" value="JAVA"></entry>
<entry key="php" value="PHP"></entry>
</map>
</property>
注入
Set
集合类型属性
<!--set类型属性注入-->
<property name="set">
<set>
<value>MySQL</value>
<value>Redis</value>
</set>
</property>
在集合里面设置对象类型值
<!--创建多个course对象-->
<bean id="course1" class="collectionType.Course">
<property name="cname" value="课程1"></property>
</bean>
<bean id="course2" class="collectionType.Course">
<property name="cname" value="课程2"></property>
</bean>
<!--注入list集合类型,值为对象-->
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
把集合注入部分提取出来变成通用部分
在 spring 配置文件中引入名称空间
util
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd ">
使用
util
标签完成
list
集合注入提取
<!--提取list集合类型属性注入-->
<util:list id="courseList">
<value>课程1</value>
<value>课程2</value>
<value>课程3</value>
</util:list>
<!--提取list集合类型属性注入使用-->
<bean id="Student" class="collectionType.Student">
<property name="courseList" ref="courseList"></property>
</bean>
五、XML自动装配
根据指定的装配规则,按照属性名称或者属性类型,Spring可以自动的将匹配的属性值进行注入
根据属性名称自动注入
<!--实现自动装配
bean 标签属性 autowire,配置自动装配
autowire 属性常用两个值:
byName 根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样
byType 根据属性类型注入
-->
<bean id="emp" class="autowire.Emp" autowire="byName">
<!--手动装配-->
<!--<property name="dept" ref="dept"></property>-->
</bean>
<bean id="dept" class="autowire.Dept"></bean>
根据属性类型自动注入
<!--实现自动装配
bean 标签属性 autowire,配置自动装配
autowire 属性常用两个值:
byName 根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样
byType 根据属性类型注入
-->
<bean id="emp" class="autowire.Emp" autowire="byType">
<!--手动装配-->
<!--<property name="dept" ref="dept"></property>-->
</bean>
<bean id="dept" class="autowire.Dept"></bean>
六、外部属性文件
直接配置数据库信息
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--直接配置连接池-->
<!-- dataSource.setDriverClassName("com.mysql.jdbc.Driver");
set方法注入
-->
<!--<property name="driverClassName" value="com.mysql.jdbc.driver"></property>-->
<!--<property name="url" value="jdbc:mysql://localhost:3306/userDB"></property>-->
<!--<property name="username" value="root"></property>-->
<!--<property name="password" value="root"></property>-->
</bean>
引入外部属性文件配置数据库连接池
创建
properties
格式外部属性文件,写入数据库信息
prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDB
prop.username=root
prop.password=root
把外部
properties
属性文件引入到Spring配置文件中
首先要引入
context
名称空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
在Spring配置文件使用标签引入外部属性文件
<!--引入外部属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- dataSource.setDriverClassName("com.mysql.jdbc.Driver");
set方法注入
-->
<!-- 获取properties文件内容,根据key获取,使用spring表达式获取 -->
<property name="driverClassName" value="${jdbc.driverclass}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>