网站建设博客作业,开封 网站建设 网络推广,婚礼策划公司,网站备案需要钱吗#x1f34e;道阻且长#xff0c;行则将至。#x1f353; 上一篇#xff1a;Spring《一》快速入门 下一篇#xff1a;Spring《三》DI依赖注入 目录一、bean实例化#x1f34d;1.构造方法 ***2.静态工厂 *使用工厂创建对象实例化bean3.实例工厂 ***使用示例工厂创建对象实… 道阻且长行则将至。 上一篇Spring《一》快速入门 下一篇Spring《三》DI依赖注入 目录一、bean实例化1.构造方法 ***2.静态工厂 *使用工厂创建对象实例化bean3.实例工厂 ***使用示例工厂创建对象实例工厂实例化beanFactoryBean二、生命周期1.生命周期设置2.在main方法使用close3.使用钩子关闭容器一、bean实例化 在上一篇Spring快速入门中我们使用IOC容器进行对象的创建在IOC中的对象也称为bean那么IOC容器是怎么创建bean的呢。 下面介绍bean的实例化方法构造方法、静态工厂、实例工厂。
1.构造方法 *** 我们先创建好一个maven项目在maven配置文件pom中添加spring的依赖再继续在resources文件夹下new个Spring的配置文件applicationContext.xml。 准备好我们的接口和类BookDao和BookDaoImpl在接口添加一个save方法到类中实现输出一个语句示例。因为要使用构造方法那我们就写一个无参构造器并且在里面随便输出一个提示语句。 写好类之后我们继续到Spring配置文件中将类配置到容器bean idbookDao namebook1 classDemo1.dao.impl.BookDaoImpl/我们可以发现在左侧出现spring的小标志了表示配置正常 完成一个运行的程序若最后可以打印构造器中的内容表示就是创建对象使用了构造函数。
public class AppForInstanceBook {public static void main(String[] args) {ApplicationContext ctxnew ClassPathXmlApplicationContext(applicationContext.xml);BookDao bookDao (BookDao) ctx.getBean(bookDao);bookDao.save();}
}输出 并且当构造器为私有的时候仍然可以访问说明了Spring的底层使用了反射。回顾参考java反射机制 但是Spring只是使用无参构造器。
2.静态工厂 *
使用工厂创建对象
我们可以继续在前面的maven中类似地添加接口和类OrderDao和OrderDaoImpl然后在创建一个工厂类
public class OrderDaoFactory {public static OrderDao getOrderDao(){return new OrderDaoImpl();}
}完成一个运行的程序,使用工厂获取对象
public class AppForInstanceOrder {public static void main(String[] args) {//通过静态工厂创建对象OrderDao orderDao OrderDaoFactory.getOrderDao();orderDao.save();}
}实例化bean
要使用静态工厂实例化bean只需要在Spring配置文件中添加bean idorderDao nameOrder1 classDemo1.factory.OrderDaoFactory factory-methodgetOrderDao/注意class是指向工厂类添加的工厂方法属性指向工厂中创建对象的方法静态工厂实例化配置成功之后再工厂类中也会有提示 然后在运行方法中从容器获取bean
ApplicationContext ctxnew ClassPathXmlApplicationContext(applicationContext.xml);
OrderDao orderDao (OrderDao) ctx.getBean(orderDao);
orderDao.save();3.实例工厂 ***
使用示例工厂创建对象
我们还是可以继续在前面的maven中类似地添加接口和类UserDao和UserDaoImpl再同样的创建一个工厂类OrderDaoFactory注意和静态工厂的不一样
//UserDao
package Demo1.dao;
public interface UserDao {public void save();
}
//UserDaoImpl
package Demo1.dao.impl;
import Demo1.dao.UserDao;
public class UserDaoImpl implements UserDao {Overridepublic void save() {System.out.println(userDao save...);}
}
//OrderDaoFactory
package Demo1.factory;
import Demo1.dao.UserDao;
import Demo1.dao.impl.UserDaoImpl;
public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}
}我们可以在运行程序中使用实例工厂获取对象
public class AppForInstanceUser {public static void main(String[] args) {//创建实例工厂对象UserDaoFactory userDaoFactory new UserDaoFactory();//通过实例工厂对象创建对象UserDao userDao userDaoFactory.getUserDao();userDao.save();
}我们想把这种实例工厂也交给Spring
实例工厂实例化bean
在配置文件中添加
bean iduserFactory classDemo1.factory.UserDaoFactory/
bean iduserDao factory-methodgetUserDao factory-beanuserFactory/在前面的静态工厂中我们只需要配置工厂类进来使用静态方法就可以获得对象。而这需要先添加工厂再添加Dao。 我们也可以修改验证一下为什么要这样当你试图在工厂bean中加实例方法直接给你报错 其实想一想就知道了这个不是静态方法啊对象都没有你怎么使用这个方法。 然后在运行程序中添加
ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);
UserDao userDao (UserDao) ctx.getBean(userDao);
userDao.save();上面的Spring配置还是太麻烦改
FactoryBean
Spring为了简化这种配置方式就提供了FactoryBean来简化开发。
创建一个UserDaoFactoryBean的类实现FactoryBean接口重写接口的方法
public class UserDaoFactoryBean implements FactoryBeanUserDao {Overridepublic UserDao getObject() throws Exception {return new UserDaoImpl();}Overridepublic Class? getObjectType() {return UserDao.class;}
}就只需要一个FactoryBean的配置 bean iduserDao classDemo1.factory.UserDaoFactoryBean/。
FactoryBean的源代码也不长我们可以打开看看
public interface FactoryBeanT {String OBJECT_TYPE_ATTRIBUTE factoryBeanObjectType;NullableT getObject() throws Exception;NullableClass? getObjectType();default boolean isSingleton() {return true;}
}他提供了3个方法我们在创建UserDaoFactoryBean的类的时候重写了两个接口的方法 getObject()在方法中进行对象的创建并返回 getObjectType()返回的是被创建类的Class对象 isSingleton()就是设置对象是否为单例默认true。 二、生命周期 生命周期就是从创建到消亡的完整过程。bean的生命周期自然是指bean对象从创建到销毁的过程。 1.生命周期设置
我们想设置
bean创建之后想要添加内容比如用来初始化需要用到资源bean销毁之前想要添加内容比如用来释放用到的资源 继续在前面的案例中我们在实例工厂类添加
public void init(){System.out.println(init userDaofac...);
}
public void destory(){System.out.println(destory userDaofac...);
}在bean中追加init-methodinit destroy-methoddestory。 只有初始化被执行了。问为什么 Spring的IOC容器是运行在JVM中运行main方法后JVM启动Spring加载配置文件生成IOC容器从容器获取bean对象然后调方法执行。然而main方法执行完后JVM就退出了这个时候IOC容器中的bean也就结束了根本没有调用destroy方法。 所以这个时候我们可以在main方法使用close或使用钩子关闭容器。
2.在main方法使用close
ApplicationContext 中没有提供close方法我们需要使用ClassPathXmlApplicationContext 修改
ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);
⇨
ClassPathXmlApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);就可以使用ctx.close();了。
3.使用钩子关闭容器
就是在容器未关闭之前提前设置好回调函数让JVM可以在退出之前回调此函数来关闭容器。 就是把前面的ctx.close();换为ctx.registerShutdownHook();。
需要修改配置文件还是太麻烦再改
前面的方法还是需要在Spring配置文件中添加bean的init-method和destroy-methodSpring对此进行简化提供了两个接口来完成生命周期的控制而不用再进行配置InitializingBean和DisposableBean。 在类里面继承接口并重写
public class UserDaoFactoryBean implements FactoryBeanUserDao , InitializingBean, DisposableBean {Overridepublic UserDao getObject() throws Exception {return new UserDaoImpl();}Overridepublic Class? getObjectType() {return UserDao.class;}
//************************Overridepublic void destroy() throws Exception {System.out.println(destory...);}Overridepublic void afterPropertiesSet() throws Exception {System.out.println(ini...);}
}在运行程序仍然使用ctx.registerShutdownHook();。 回到第一页☝ ☕物有本末事有终始知所先后。 ☝☝☝☝☝我的CSDN☝☝☝☝☝☝