1、IOC操作Bean管理(FactoryBean)
1、Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
? 2、普通 bean:在配置文件中定义 bean 类型就是返回类型
? 3、工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样 第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean 第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型
//工厂bean类 public class Mybean implements FactoryBean<User> { @Override public User getObject() throws Exception { User user=new User(); user.setName("小明"); return user; } @Override public Class<?> getObjectType() { return null; } @Override public boolean isSingleton() { return false; } } public class User { private String name; public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" +"name=‘" + name + ‘\‘‘ +‘}‘; } } public class TestDemo { @Test public void Test(){ ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml"); User user=context.getBean("mybean", User.class); System.out.println(user); } }
<bean id="mybean" class="com.company.Demo.Mybean"></bean>
2、Bean的作用域
在 Spring 里面,默认情况下,bean 是单实例对象,下面进行作用域设置:
(1)在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
(2)scope 属性值 第一个值 默认值,singleton,表示是单实例对象 第二个值 prototype,表示是多实例对象
<!--scope:设置单例多例--> <bean id="mybean" class="com.company.Demo.Mybean" scope="prototype"></bean>
(3)singleton 和 prototype 区别
? a)singleton 单实例,prototype 多实例
? b)设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象 ;设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建对象,在调用 getBean 方法时候创建多实例对象
3、Bean的生命周期
1、生命周期 :从对象创建到对象销毁的过程
2、bean 生命周期
? (1)通过构造器创建 bean 实例(无参数构造)
? (2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
? (3)调用 bean 的初始化的方法(需要进行配置初始化的方法)
? (4)bean 可以使用了(对象获取到了)
? (5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
3、演示 bean 生命周期 :
public class Orders { //无参数构造 public Orders() { System.out.println("第一步 执行无参数构造创建 bean 实例"); } private String oname; public void setOname(String oname) { this.oname = oname; System.out.println("第二步 调用 set 方法设置属性值"); } //创建执行的初始化的方法 public void initMethod() { System.out.println("第三步 执行初始化的方法"); } //创建执行的销毁的方法 public void destroyMethod() { System.out.println("第五步 执行销毁的方法"); } }
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; } }
@Test public void testBean3() { // ApplicationContext context = // new ClassPathXmlApplicationContext("bean4.xml"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml"); Orders orders = context.getBean("orders", Orders.class); System.out.println("第四步 获取创建 bean 实例对象"); System.out.println(orders); //手动让 bean 实例销毁 context.close(); }
<!--配置文件的bean参数配置--> <bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"> <!--配置初始化方法和销毁方法--> <property name="oname" value="手机"></property><!--这里就是通过set方式(注入属性)赋值--> </bean> <!--配置后置处理器--> <bean id="myBeanPost" class="com.atguigu.spring5.bean.MyBeanPost"></bean>
4、bean 的后置处理器,bean 生命周期有七步 (正常生命周期为五步,而配置后置处理器后为七步)
? (1)通过构造器创建 bean 实例(无参数构造)
? (2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
? (3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
? (4)调用 bean 的初始化的方法(需要进行配置初始化的方法)
? (5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
? (6)bean 可以使用了(对象获取到了)
? (7)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
4、Bean引用外部属性文件
方式一:直接配置数据库信息 :(1)配置Druid(德鲁伊)连接池 (2)引入Druid(德鲁伊)连接池依赖 jar 包
<!--直接配置连接池--> <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 格式文件,写数据库信息(jdbc.properties)
prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDb
prop.userName=root
prop.password=root
(2)把外部 properties 属性文件引入到 spring 配置文件中 —— 引入 context 名称空间
<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"><!--引入context名称空间--> <!--引入外部属性文件--> <context:property-placeholder location="classpath: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>
原文:https://www.cnblogs.com/luyue0220/p/14266825.html