IOC操作 Bean 管理 (factoryBean)
package com.zh.Day_02.Bean_Demo_05;
import org.springframework.beans.factory.FactoryBean;
//演示工厂bean
// 实现factoryBean这个接口
public class MyBean implements FactoryBean {
// 这个方法可以指定返回的类型
@Override
public Temp getObject() throws Exception {
Temp temp = new Temp();
temp.name="小浩浩~";
return temp;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return FactoryBean.super.isSingleton();
}
}
//指定返回的类型
public class Temp {
public String name;
@Override
public String toString() {
return "Temp{" +
"name='" + name + '\'' +
'}';
}
}
<bean id="ZhouHao" class="com.zh.Day_02.Bean_Demo_05.MyBean "></bean>
//测试
public class Test {
@org.junit.jupiter.api.Test
public void Test_(){
ClassPathXmlApplicationContext
context = new ClassPathXmlApplicationContext("com/zh/Day_02/Bean_demo_05/zh.xml");
// 可以看出 xml创建的对象是MyBean 返回的是Temp
Temp mmm= context.getBean("ZhouHao", Temp.class);
System.out.println(mmm);
}
}
bean作用域
a) Spring中 默认的是一个单例的对象
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext
context = new ClassPathXmlApplicationContext("com/zh/Day_02/Bean_demo_06/zh.xml");
Dome dome1 = context.getBean("Dome", Dome.class);
Dome dome2 = context.getBean("Dome", Dome.class);
System.out.println(dome1);
System.out.println(dome2);
// 默认的对象是单例的 所以地址值是一样的
// com.zh.Day_02.Bean_Demo_06.Dome@1e127982
// com.zh.Day_02.Bean_Demo_06.Dome@1e127982
}
}
b)通过scope 标签来设置是否是单例对象
<!-- 演示 bean 中作用域的区别-->
<!-- 默认的话是 单例的
scope 中的值 : singleton 默认值 单例
prototype 表示多例
-->
<bean id="Dome" class="com.zh.Day_02.Bean_Demo_06.Dome" scope="singleton"></bean>
<!-- <bean id="Dome" class="com.zh.Day_02.Bean_Demo_06.Dome" scope="prototype"></bean>-->
bean的生命周期
demo:
//演示 bean的生命周期
public class AAA {
public String name;
public AAA() {
System.out.println("第一步 会调用这个对象的无参构造方法");
}
public void setName(String name) {
this.name = name;
System.out.println("第二步 会调用这个set的属性方法");
}
// 创建 初始化方法
public void initMethod(){
System.out.println("第三步 调用这个初始化方法");
}
// 创建 销毁方法
public void destroyMethod(){
System.out.println("第五步 执行这个销毁方法");
}
}
<!-- 需要手动的配置 初始化标签和 销毁标签的配置-->
<bean id="AAA" class="com.zh.Day_02.Bean_Demo_07.AAA" init-method="initMethod" destroy-method="destroyMethod" >
<property name="name" value="小浩纸~~"></property>
</bean>
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext
context = new ClassPathXmlApplicationContext("com/zh/Day_02/Bean_demo_07/zh.xml");
AAA aaa = context.getBean("AAA", AAA.class);
System.out.println("第四步 获取创建bean实例对象");
// 手动调用这个销毁方法
aaa.destroyMethod();
/* 第一步 会调用这个对象的无参构造方法
第二步 会调用这个set的属性方法
第三步 调用这个初始化方法
第四步 获取创建bean实例对象
第五步 执行这个销毁方法*/
}
}
IOC操作 Bean 管理 (引入外部属性文件)
<!--直接配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<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>
1、创建外部 properties文件
prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDb
prop.userName=root
prop.password=root
2.把外部 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:p="http://www.springframework.org/schema/p"
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 名称空间-->
<context:property-placeholder location="classpath:com/zh/Day_02/Bean_Demo_08/jdbc.properties"/>
<!--配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${prop.driverClass}"></property>
<property name="url" value="${prop.url}"></property>
<property name="username" value="${prop.userName}"></property>
<property name="password" value="${prop.password}"></property>
</bean>
</beans>