配置
<?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
配置一个bean-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<!-- 静态工厂实例化bean
class 传入静态工厂的路径
再指定创建对象的工厂方法 factory-method="getBookDao"
-->
<bean id="bookDao" class="com.itheima.factory.BookDaoFactory" factory-method="getBookDao"/>
<!-- 实例工厂实例化bean
先配置一个工厂bean -->
<bean id="brandFactory" class="com.itheima.factory.BrandDaoFactory"/>
<!-- 然后配置实例化bean
这里就不需要写class属性了
使用factory-bean="brandFactory"将刚刚创建的bean的id传入
再使用 factory-method="getBrandDao"指定创建对象的工厂方法-->
<bean id="brandDao" factory-bean="brandFactory" factory-method="getBrandDao"/>
<!-- 使用FactoryBean实例化bean
class将FactoryBean的路径传入即可-->
<bean id="brandDaoFactoryBean" class="com.itheima.factory.BranDaoFactoryBean"/>
</beans>
FactoryBean
package com.itheima.factory;
import com.itheima.dao.BrandDao;
import com.itheima.dao.impl.BrandDaoImpl;
import org.springframework.beans.factory.FactoryBean;
//实现接口 泛型需要创建什么类型对象就写什么
public class BranDaoFactoryBean implements FactoryBean<BrandDao> {
@Override
public BrandDao getObject() throws Exception {
return new BrandDaoImpl();//将对象return回去
}
@Override
public Class<?> getObjectType() {
return BrandDao.class;//return 对象的类型,要什么类型将类型的class传过去
}
@Override
public boolean isSingleton() {
return true;//true表示单例模式 false表示非单例模式
}
}
获取Bean
package com.itheima;
import com.itheima.dao.BookDao;
import com.itheima.dao.BrandDao;
import com.itheima.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class main {
public static void main(String[] args) {
// 使用构造方法实例化bean,是最常见的方式 其配置也跟平常配置一致
ApplicationContext text = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) text.getBean("userDao");
userDao.userDao();
//使用静态工厂实力化bean(了解即可)
BookDao bookDao = (BookDao) text.getBean("bookDao");
bookDao.bookDao();
//使用实例工厂实力化bean(了解即可)
BrandDao brandDao = (BrandDao) text.getBean("brandDao");
brandDao.brandDao();
//使用FactoryBean实例化bean(必须掌握)
BrandDao brandFactoryBean = (BrandDao) text.getBean("brandDaoFactoryBean");
brandFactoryBean.brandDao();
}
}
bean的生命周期
- bean生命周期控制方式一
1、提供生命周期的控制方法
package com.itheima.service.impl;
import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
public class BookServiceImpl implements BookService {
private BookDao bookDao;
@Override
public void bookService() {
System.out.println("bookService");
bookDao.bookDao();
}
//初始化方法
public void init(){
System.out.println("init...");
}
//销毁方法
public void destroy(){
System.out.println("destroy...");
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
2、配置生命周期的控制方法
<!-- 配置bean的控制方法
init-method="init" 配置初始化方法
destroy-method="destroy 配置销毁方法-->
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" init-method="init" destroy-method="destroy/">
方式二
接口控制bean的生命周期(一步到位,了解即可)
1、实现InitializingBean, DisposableBean接口
2、重写destroy(销毁方法),afterPropertiesSet(初始化方法)
package com.itheima.service.impl;
import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
private BookDao bookDao;
@Override
public void bookService() {
System.out.println("bookService");
bookDao.bookDao();
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void destroy() throws Exception {
System.out.println("destroy");//销毁方法
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet");//初始化方法
}
}