基于xml配置文件实现2
一、基于xml方式注入集合属性
- 实体类
public class Stu {
//1. 数组类型属性
private String[] courses;
//2. List集合类型
private List<String> list;
//3. Map集合类型
private Map<String,String> maps;
//4.Set集合类型
private Set<String> sets;
public void setCourses(String[] courses) {
this.courses = courses;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public void setSets(Set<String> sets) {
this.sets = sets;
}
}
-
配置文件
注入数组类型属性
注入List集合类型属性
注入Map集合类型属性
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--集合类型-->
<bean id="stu" class="com.znb.spring5.collectionType.Stu">
<!--数组属性注入-->
<property name="courses">
<array>
<value>java</value>
<value>数据库</value>
<value>c</value>
</array>
</property>
<!--list-->
<property name="list">
<list>
<value>张三</value>
<value>李四</value>
</list>
</property>
<!--map-->
<property name="maps">
<map>
<entry key="1" value="java"></entry>
<entry key="2" value="c#"></entry>
</map>
</property>
<!--set-->
<property name="sets">
<set>
<value>MySql</value>
<value>Redis</value>
</set>
</property>
</bean>
</beans>
- 测试类
public class StuTest extends TestCase {
public void testTest1() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
Stu stu = context.getBean("stu", Stu.class);
stu.test();
}
}
1. 在集合中设置对象类型的值
<!--集合类型-->
<bean id="stu" class="com.znb.spring5.collectionType.Stu">
<!--注入List集合类型,值是对象-->
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
</bean>
<!--创建多个course对象-->
<bean id="course1" class="com.znb.spring5.collectionType.Course">
<property name="cName" value="Spring5"></property>
</bean>
<bean id="course2" class="com.znb.spring5.collectionType.Course">
<property name="cName" value="Mybatis"></property>
</bean>
2. 提取注入属性的公共部分
<?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: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">
<!--提取list集合类型属性注入-->
<util:list id="bookList">
<value>数学</value>
<value>语文</value>
<value>英语</value>
</util:list>
<!--属性注入-->
<bean id="book" class="com.znb.spring5.collectionType.Book">
<property name="list" ref="bookList"></property>
</bean>
</beans>
二、FactoryBean
- FactoryBean可以使得返回值的类型和配置文件中的类型不一致
- 实体类
public class MyBean implements FactoryBean<Course> {
//定义返回bean
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setcName("mybatis");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return FactoryBean.super.isSingleton();
}
}
- 配置文件
<?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: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">
<bean id="myBean" class="com.znb.spring5.factoryBean.MyBean"></bean>
</beans>
- 测试类
public class StuTest extends TestCase {
public void testTest1() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
Course course = context.getBean("myBean", Course.class);
System.out.println(course);
}
}
三、bean的作用域
- 在spring里面,设置创建bean实例默认是单实例。
1. 设置单实例和多实例。
- 设置scope属性值为protoptype为多实例
<bean id="book" class="com.znb.spring5.Book" scope="prototype">
<!--注入属性-->
<property name="bookName" value="红楼梦"></property>
<property name="bookAuthor" value="曹雪芹"></property>
</bean>
- 测试类
public class BookTest extends TestCase {
public void testBookAndAuthor() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
Book book = context.getBean("book", Book.class);
Book book1 = context.getBean("book", Book.class);
System.out.println(book);
System.out.println(book1);
}
}
2. singleton和prototype区别
- singleton单实例,prototype多实例。
- 设置scope值为singleton,加载配置文件时候就会创建单实例对象。
- 设置scope值为prototype,不是在加载配置文件时候就会创建单实例对象。在调用getBean方法时候创建多实例对象。
四、bean的生命周期
- 生命周期——从对象创建到对象销毁的过程。
1. bean生命周期-5步
- 通过构造器创建bean实例。(使用无参数的构造方法)
- 为bean的属性设置值和对其他bean引用。(调用set方法)
- 调用bean的初始化的方法。(需要配置初始化方法)
- bean的使用。(已经成功获取对象)
- 当容器关闭的时候,调用bean销毁的方法。(需要配置销毁的方法)
2. 实例演示
- 实体类
public class Orders {
private String orderName;
//无参构造方法
public Orders(){
System.out.println("第一步,执行无参构造创建bean实例");
}
public void setOrderName(String orderName) {
this.orderName = orderName;
System.out.println("第二步,调用set方法设置属性值");
}
//创建执行初始化的方法
public void initMethod(){
System.out.println("第三步,执行初始化的方法");
}
//创建执行销毁的方法
public void destroyMethod(){
System.out.println("第五步,执行销毁方法");
}
}
- 配置文件
<?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: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">
<bean id="orders" class="com.znb.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
<property name="orderName" value="电话"></property>
</bean>
</beans>
- 测试类
public class OrdersTest extends TestCase {
public void testBean(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
Orders orders = context.getBean("orders", Orders.class);
System.out.println("第四步,获取到创建的bean实例对象");
System.out.println(orders);
//手动让bean实例销毁
context.close();
}
}
3. bean的后置处理器-7步
- 通过构造器创建bean实例。(使用无参数的构造方法)
- 为bean的属性设置值和对其他bean引用。(调用set方法)
- 把bean实例传递给bean后置处理器的方法。 postProcessBeforeInitialization
- 调用bean的初始化的方法。(需要配置初始化方法)
- 把bean实例传递给bean后置处理器的方法 postProcessAfterInitialization
- bean的使用。(已经成功获取对象)
- 当容器关闭的时候,调用bean销毁的方法。(需要配置销毁的方法)
4. 演示添加后置处理器
- 创建类,实现接口 BeanPostProcessor
public class MyBeanPost implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之前执行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之后执行的方法");
return bean;
}
}
- 配置文件
<?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: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">
<bean id="orders" class="com.znb.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
<property name="orderName" value="电话"></property>
</bean>
<!--配置后置处理器-->
<bean id="myBeanPost" class="com.znb.spring5.bean.MyBeanPost"></bean>
</beans>
- 执行测试方法
五、自动装配
1. 什么是自动装配。
根据指定的装配规则,Spring自动将匹配的属性值进行注入。
2. 演示自动装配的过程
- 实体类
public class Dept {
@Override
public String toString() {
return "Dept{}";
}
}
public class Emp {
private Dept dept;
@Override
public String toString() {
return "Emp{" +
"dept=" + dept +
'}';
}
public void setDept(Dept dept) {
this.dept = dept;
}
public void test(){
System.out.println(dept);
}
}
- 根据属性名称自动注入
<?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: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">
<!--实现自动装配
配置bean标签属性值autowire,实现自动装配
byName:根据属性名称注入,id值和类别属性名称一样
byType:根据属性类型注入
-->
<bean id="emp" class="com.znb.spring5.autowire.Emp" autowire="byName">
<!--<property name="dept" ref="dept"></property>-->
</bean>
<bean id="dept" class="com.znb.spring5.autowire.Dept"></bean>
</beans>
- 根据属性类型自动注入
<?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: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">
<!--实现自动装配
配置bean标签属性值autowire,实现自动装配
byName:根据属性名称注入,id值和类别属性名称一样
byType:根据属性类型注入
-->
<bean id="emp" class="com.znb.spring5.autowire.Emp" autowire="byType">
<!--<property name="dept" ref="dept"></property>-->
</bean>
<bean id="dept" class="com.znb.spring5.autowire.Dept"></bean>
</beans>
- 测试类
public class EmpTest extends TestCase {
public void testTest1() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");
Emp emp = context.getBean("emp", Emp.class);
System.out.println(emp);
}
}
六、外部属性文件
1. 直接配置数据库信息
<?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:util="http://www.springframework.org/schema/util"
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/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<!--直接配置-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/useDb"></property>
<property name="username" value="root"></property>
<property name="password" value="2550"></property>
</bean>
</beans>
2. 引入外部属性文件配置数据库信息
- 配置文件properties
// mysql 8.0驱动
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/useDb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
username=root
password=2550
maxActive=5
maxWait=2000
initialSize=3
minIdle=2
- bean配置文件
<?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:util="http://www.springframework.org/schema/util"
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/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<!--引入外部属性文件-->
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<!--直接配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 获取properties文件内容,根据key获取,使用spring表达式获取 -->
<property name="driverClassName" value="${driverClassName}">
</property>
<property name="url" value="${url}">
</property>
<property name="username" value="${username}">
</property>
<property name="password" value="${password}">
</property>
</bean>
</beans>