🌈键盘敲烂,年薪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>