🌈键盘敲烂,年薪30万🌈
IOC 配置bean对象:
配置文件配置bean
id:bean的名称
class:bean的类型
<bean id = "bookDao" class = "com.itpan.Dao.impl.BookDaoImpl"/>
DI 注入bean对象
①.setter方法注入
setter方法注入 使用<properties> 标签,通过set方法为bean对象赋值,推荐使用
注入引用类型
name = "xxx" ref = "xxx"
name后面要与set方法的形参保持一致,ref要与bean的id保持一致
<bean id = "bookDao" class = "com.itpan.Dao.impl.BookDaoImpl"> <properties name = "bookDao" ref = "bookDao"/> </bean>
注入基本数据类型
name = "xxx" value = "xxx"
<bean id = "bookDao" class = "com.itpan.Dao.impl.BookDaoImpl"> <properties name = "IdCard" value = "123"/> </bean>
注入集合数组等类型
当集合类型进行注入时,使用相应标签(list、set、array、map...)对属性值进行注入。
<bean id="school" class="com.muyu.pojo.School"> <property name="classes"> <list> <value>10</value> <value>11</value> <value>12</value> </list> <!-- 1. array集合 <array> <value></value> </array> 2. set集合 <set> <value></value> </set> 3. map集合 <map> <entry value="" ket=""></entry> </map> --> </property> </bean>
②.构造器注入
构造器注入,使用<constructor-arg>标签,在整合第三方框架的时候使用
<bean id = "bookDao" class = "com.itpan.Dao.impl.BookDaoImpl"> <constructor-arg name = "bookDao" ref = "bookDao"/> </bean>
setter注入和构造器注入并无太大区别,一个是运用setter方法,一个是运用构造器,构造器注入将properties标签改完constructor-arg 即可。
Bean的实例化
1.setter方法注入(重点)
在相应类中提供set方法
public class BookServiceImpl implements Bookservice { BookDao bookDao; @Override public void save() { System.out.println("Bookservice save is running"); bookDao.save(); } //提供set方法 public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } }
2.静态工厂(了解)
public class BookDao1Factory { public static BookDao1 getBookDao1(){ System.out.println("BookDao1Factory null constructor is running"); return new BookDao1Impl(); } }
3.实例工厂(了解)
跟setter方法冗余,不再赘述。
4.FactoryBean方式注入(重点)
创建一个FactoryBean的类,实现factorybean<E>接口,用于实例化bean对象,通过getObject创建对象,getObjectType指定对象类型。
package itpan.factory; import itpan.Dao.BookDao1; import itpan.Dao.impl.BookDao1Impl; import org.springframework.beans.factory.FactoryBean; public class BookDao1FactoryBean implements FactoryBean<BookDao1> { // 替代静态静态工厂中的get方法 @Override public BookDao1 getObject() throws Exception { return new BookDao1Impl(); } // 创建的bean是什么类型的 @Override public Class<?> getObjectType() { return BookDao1.class; } }
bean的声明周期
- 执行构造方法实例化bean对象
- 设置属性
- 初始化
- 关闭容器bean自动销毁
例如以下程序:
package itpan.Dao.impl; import itpan.Dao.BookDao1; import itpan.Dao.BookDao2; import itpan.Dao.BookDao3; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class BookDao1Impl implements BookDao1, InitializingBean, DisposableBean { BookDao2 bookDao2; BookDao3 bookDao3; public void setBookDao2(BookDao2 bookDao2) { this.bookDao2 = bookDao2; } public void setBookDao3(BookDao3 bookDao3) { this.bookDao3 = bookDao3; } public void save() { System.out.println("bookdao1 is running"); bookDao2.save(); bookDao3.save(); } @Override public void afterPropertiesSet() throws Exception { System.out.println("dao init..."); } @Override public void destroy() throws Exception { System.out.println("dao close..."); } }
测试类:
package itpan; import itpan.Dao.BookDao1; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestBeanCycle { public static void main(String[] args) { // bean的生命周期 // 1.new bean // 2.执行构造方法 // 3.set设置属性 // 4.init初始化bean // 容器关闭触发bean的销毁 // 两种方法 // 1.手工关闭 2.注册关闭钩子 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // 设置关闭钩子 ctx.registerShutdownHook(); BookDao1 bookDao1 = (BookDao1) ctx.getBean("bookDao1"); bookDao1.save(); // ctx.close(); } }
注意:
创建bean对象默认调用空参构造,如果没有空参构造,程序会抛出异常。
bean的自动装配
很简单,在配置bean对象时将autowrie属性设置为true
<bean id="bookDao1" class="itpan.Dao.impl.BookDao1Impl" autowire="byType"/>
管理第三方的bean
1.引入properties文件
2.开启context命名空间
3.使用context:property-placeholder加载命名空间
<?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/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--引入properties文件--> <!--1.开启context命名空间--> <!--2.使用context加载命名空间--> <context:property-placeholder location="classpath*:*.properties"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean>